Add fixer class.

This commit is contained in:
Jelmer Vernooij 2021-02-24 03:21:48 +00:00
parent c13fcb8306
commit eddc4d272b
No known key found for this signature in database
GPG key ID: 579C160D4C9E23E8
2 changed files with 54 additions and 23 deletions

View file

@ -106,6 +106,7 @@ from buildlog_consultant.sbuild import (
) )
from .apt import AptManager, LocalAptManager from .apt import AptManager, LocalAptManager
from ..fix_build import BuildFixer, SimpleBuildFixer
from ..resolver.apt import ( from ..resolver.apt import (
AptResolver, AptResolver,
NoAptPackage, NoAptPackage,
@ -640,26 +641,25 @@ def fix_missing_makefile_pl(error, context):
return False return False
VERSIONED_PACKAGE_FIXERS: List[ VERSIONED_PACKAGE_FIXERS: List[BuildFixer] = [
Tuple[Type[Problem], Callable[[Problem, DependencyContext], bool]] SimpleBuildFixer(
] = [ NeedPgBuildExtUpdateControl, run_pgbuildext_updatecontrol),
(NeedPgBuildExtUpdateControl, run_pgbuildext_updatecontrol), SimpleBuildFixer(MissingConfigure, fix_missing_configure),
(MissingConfigure, fix_missing_configure), SimpleBuildFixer(MissingAutomakeInput, fix_missing_automake_input),
(MissingAutomakeInput, fix_missing_automake_input),
] ]
APT_FIXERS: List[Tuple[Type[Problem], Callable[[Problem, DependencyContext], bool]]] = [ APT_FIXERS: List[BuildFixer] = [
(MissingPythonModule, fix_missing_python_module), SimpleBuildFixer(MissingPythonModule, fix_missing_python_module),
(MissingPythonDistribution, fix_missing_python_distribution), SimpleBuildFixer(MissingPythonDistribution, fix_missing_python_distribution),
(AptFetchFailure, retry_apt_failure), SimpleBuildFixer(AptFetchFailure, retry_apt_failure),
(MissingPerlFile, fix_missing_makefile_pl), SimpleBuildFixer(MissingPerlFile, fix_missing_makefile_pl),
(Problem, fix_missing_requirement), SimpleBuildFixer(Problem, fix_missing_requirement),
] ]
GENERIC_FIXERS: List[Tuple[Type[Problem], Callable[[Problem, DependencyContext], bool]]] = [ GENERIC_FIXERS: List[BuildFixer] = [
(MissingConfigStatusInput, fix_missing_config_status_input), SimpleBuildFixer(MissingConfigStatusInput, fix_missing_config_status_input),
] ]

View file

@ -16,7 +16,7 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
import logging import logging
from typing import List, Tuple, Callable, Type from typing import List, Tuple, Callable, Type, Optional
from buildlog_consultant.common import ( from buildlog_consultant.common import (
find_build_failure_description, find_build_failure_description,
@ -36,6 +36,34 @@ from .debian.fix_build import (
from .session import Session, run_with_tee from .session import Session, run_with_tee
class BuildFixer(object):
"""Build fixer."""
def can_fix(self, problem):
raise NotImplementedError(self.can_fix)
def _fix(self, problem, context):
raise NotImplementedError(self._fix)
def fix(self, problem, context):
if not self.can_fix(problem):
return None
return self._fix(problem, context)
class SimpleBuildFixer(BuildFixer):
def __init__(self, problem_cls, fn):
self._problem_cls = problem_cls
self._fn = fn
def can_fix(self, problem):
return isinstance(problem, self._problem_cls)
def _fix(self, problem, context):
return self._fn(problem, context)
class SchrootDependencyContext(DependencyContext): class SchrootDependencyContext(DependencyContext):
def __init__(self, session): def __init__(self, session):
self.session = session self.session = session
@ -75,16 +103,19 @@ def fix_python_package_from_pip(error, context):
return True return True
GENERIC_INSTALL_FIXERS: List[ GENERIC_INSTALL_FIXERS: List[BuildFixer] = [
Tuple[Type[Problem], Callable[[Problem, DependencyContext], bool]] SimpleBuildFixer(MissingPerlModule, fix_perl_module_from_cpan),
] = [ SimpleBuildFixer(MissingPythonDistribution, fix_python_package_from_pip),
(MissingPerlModule, fix_perl_module_from_cpan), SimpleBuildFixer(MissingCommand, fix_npm_missing_command),
(MissingPythonDistribution, fix_python_package_from_pip),
(MissingCommand, fix_npm_missing_command),
] ]
def run_with_build_fixer(session: Session, args: List[str]): def run_with_build_fixer(
session: Session, args: List[str],
fixers: Optional[List[BuildFixer]] = None):
if fixers is None:
from .debian.fix_build import APT_FIXERS
fixers = GENERIC_INSTALL_FIXERS + APT_FIXERS
logging.info("Running %r", args) logging.info("Running %r", args)
fixed_errors = [] fixed_errors = []
while True: while True:
@ -108,7 +139,7 @@ def run_with_build_fixer(session: Session, args: List[str]):
if not resolve_error( if not resolve_error(
error, error,
SchrootDependencyContext(session), SchrootDependencyContext(session),
fixers=(APT_FIXERS + GENERIC_INSTALL_FIXERS), fixers=fixers,
): ):
logging.warning("Failed to find resolution for error %r. Giving up.", error) logging.warning("Failed to find resolution for error %r. Giving up.", error)
raise DetailedFailure(retcode, args, error) raise DetailedFailure(retcode, args, error)