Detect problems when running resolver.

This commit is contained in:
Jelmer Vernooij 2021-03-23 03:18:48 +00:00
parent af3caadad2
commit 2ddc2804a0
2 changed files with 37 additions and 33 deletions

View file

@ -63,11 +63,9 @@ class DependencyContext(object):
raise NotImplementedError(self.add_dependency) raise NotImplementedError(self.add_dependency)
def run_with_build_fixers(session: Session, args: List[str], fixers: List[BuildFixer], env: Optional[Dict[str, str]] = None): def run_detecting_problems(session: Session, args: List[str], **kwargs):
fixed_errors = []
while True:
try: try:
retcode, contents = run_with_tee(session, args, env=env) retcode, contents = run_with_tee(session, args, **kwargs)
except FileNotFoundError: except FileNotFoundError:
error = MissingCommand(args[0]) error = MissingCommand(args[0])
retcode = 1 retcode = 1
@ -83,21 +81,27 @@ def run_with_build_fixers(session: Session, args: List[str], fixers: List[BuildF
else: else:
logging.warning("Build failed and unable to find cause. Giving up.") logging.warning("Build failed and unable to find cause. Giving up.")
raise UnidentifiedError(retcode, args, lines, secondary=match) raise UnidentifiedError(retcode, args, lines, secondary=match)
raise DetailedFailure(retcode, args, error)
logging.info("Identified error: %r", error)
if error in fixed_errors: def run_with_build_fixers(session: Session, args: List[str], fixers: List[BuildFixer], **kwargs):
fixed_errors = []
while True:
try:
run_detecting_problems(session, args, **kwargs)
except DetailedFailure as e:
logging.info("Identified error: %r", e.error)
if e.error in fixed_errors:
logging.warning( logging.warning(
"Failed to resolve error %r, it persisted. Giving up.", error "Failed to resolve error %r, it persisted. Giving up.", e.error
) )
raise DetailedFailure(retcode, args, error) raise DetailedFailure(e.retcode, args, e.error)
if not resolve_error( if not resolve_error(e.error, None, fixers=fixers):
error, logging.warning("Failed to find resolution for error %r. Giving up.", e.error)
None, raise DetailedFailure(e.retcode, args, e.error)
fixers=fixers, fixed_errors.append(e.error)
): else:
logging.warning("Failed to find resolution for error %r. Giving up.", error) return
raise DetailedFailure(retcode, args, error)
fixed_errors.append(error)
def resolve_error(error, context, fixers): def resolve_error(error, context, fixers):

View file

@ -17,7 +17,7 @@
import subprocess import subprocess
from ..fix_build import run_detecting_problems
class UnsatisfiedRequirements(Exception): class UnsatisfiedRequirements(Exception):
def __init__(self, reqs): def __init__(self, reqs):
@ -80,7 +80,7 @@ class CPANResolver(Resolver):
missing.append(requirement) missing.append(requirement)
continue continue
# TODO(jelmer): Specify -T to skip tests? # TODO(jelmer): Specify -T to skip tests?
self.session.check_call( run_detecting_problems(self.session,
["cpan", "-i", requirement.module], ["cpan", "-i", requirement.module],
env=env, env=env,
user=user, user=user,