Support introspection typelibs, improve default tie breaking.

This commit is contained in:
Jelmer Vernooij 2021-03-29 18:11:48 +01:00
parent 5f511b2b80
commit ce3e477c4c
No known key found for this signature in database
GPG key ID: 579C160D4C9E23E8
5 changed files with 31 additions and 5 deletions

View file

@ -53,6 +53,7 @@ from buildlog_consultant.common import (
MissingVagueDependency, MissingVagueDependency,
DhAddonLoadFailure, DhAddonLoadFailure,
MissingMavenArtifacts, MissingMavenArtifacts,
MissingIntrospectionTypelib,
GnomeCommonMissing, GnomeCommonMissing,
MissingGnomeCommonDependency, MissingGnomeCommonDependency,
UnknownCertificateAuthority, UnknownCertificateAuthority,
@ -99,6 +100,7 @@ from .requirements import (
X11Requirement, X11Requirement,
LibtoolRequirement, LibtoolRequirement,
VagueDependencyRequirement, VagueDependencyRequirement,
IntrospectionTypelibRequirement,
) )
from .resolver import UnsatisfiedRequirements from .resolver import UnsatisfiedRequirements
@ -112,6 +114,8 @@ def problem_to_upstream_requirement(problem): # noqa: C901
return PkgConfigRequirement(problem.module, problem.minimum_version) return PkgConfigRequirement(problem.module, problem.minimum_version)
elif isinstance(problem, MissingCHeader): elif isinstance(problem, MissingCHeader):
return CHeaderRequirement(problem.header) return CHeaderRequirement(problem.header)
elif isinstance(problem, MissingIntrospectionTypelib):
return IntrospectionTypelibRequirement(problem.library)
elif isinstance(problem, MissingJavaScriptRuntime): elif isinstance(problem, MissingJavaScriptRuntime):
return JavaScriptRuntimeRequirement() return JavaScriptRuntimeRequirement()
elif isinstance(problem, MissingRubyGem): elif isinstance(problem, MissingRubyGem):

View file

@ -65,9 +65,9 @@ class BuildDependencyTieBreaker(object):
return None return None
top = max(by_count.items(), key=lambda k: k[1]) top = max(by_count.items(), key=lambda k: k[1])
logging.info( logging.info(
"Breaking tie between %r to %r based on build-depends count", "Breaking tie between [%s] to %s based on build-depends count",
[repr(r) for r in reqs], ', '.join([repr(r.pkg_relation_str()) for r in reqs]),
top[0], repr(top[0].pkg_relation_str()),
) )
return top[0] return top[0]

View file

@ -170,7 +170,7 @@ class AptFileFileSearcher(FileSearcher):
@classmethod @classmethod
def has_cache(cls, session: Session) -> bool: def has_cache(cls, session: Session) -> bool:
if not os.path.exists(session.external_path(cls.CACHE_IS_EMPTY_PATH)): if not os.path.exists(session.external_path(cls.CACHE_IS_EMPTY_PATH)):
return True return False
try: try:
session.check_call([cls.CACHE_IS_EMPTY_PATH]) session.check_call([cls.CACHE_IS_EMPTY_PATH])
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:

View file

@ -587,6 +587,11 @@ class LibtoolRequirement(Requirement):
super(LibtoolRequirement, self).__init__("libtool") super(LibtoolRequirement, self).__init__("libtool")
class IntrospectionTypelibRequirement(Requirement):
def __init__(self, library):
self.library = library
class PythonModuleRequirement(Requirement): class PythonModuleRequirement(Requirement):
module: str module: str

View file

@ -68,6 +68,7 @@ from ..requirements import (
CertificateAuthorityRequirement, CertificateAuthorityRequirement,
LibtoolRequirement, LibtoolRequirement,
VagueDependencyRequirement, VagueDependencyRequirement,
IntrospectionTypelibRequirement,
) )
@ -620,6 +621,12 @@ def resolve_ca_req(apt_mgr, req):
return [AptRequirement.simple("ca-certificates")] return [AptRequirement.simple("ca-certificates")]
def resolve_introspection_typelib_req(apt_mgr, req):
return find_reqs_simple(
apt_mgr, ['/usr/lib/.*/girepository-.*/%s-.*\.typelib' % re.escape(req.library)],
regex=True)
def resolve_apt_req(apt_mgr, req): def resolve_apt_req(apt_mgr, req):
# TODO(jelmer): This should be checking whether versions match as well. # TODO(jelmer): This should be checking whether versions match as well.
for package_name in req.package_names(): for package_name in req.package_names():
@ -668,6 +675,7 @@ APT_REQUIREMENT_RESOLVERS = [
(PythonPackageRequirement, resolve_python_package_req), (PythonPackageRequirement, resolve_python_package_req),
(CertificateAuthorityRequirement, resolve_ca_req), (CertificateAuthorityRequirement, resolve_ca_req),
(CargoCrateRequirement, resolve_cargo_crate_req), (CargoCrateRequirement, resolve_cargo_crate_req),
(IntrospectionTypelibRequirement, resolve_introspection_typelib_req),
] ]
@ -683,11 +691,20 @@ def resolve_requirement_apt(apt_mgr, req: Requirement) -> List[AptRequirement]:
raise NotImplementedError(type(req)) raise NotImplementedError(type(req))
def default_tie_breakers(session):
from ..debian.udd import popcon_tie_breaker
from ..debian.build_deps import BuildDependencyTieBreaker
return [
BuildDependencyTieBreaker.from_session(session),
popcon_tie_breaker,
]
class AptResolver(Resolver): class AptResolver(Resolver):
def __init__(self, apt, tie_breakers=None): def __init__(self, apt, tie_breakers=None):
self.apt = apt self.apt = apt
if tie_breakers is None: if tie_breakers is None:
tie_breakers = [] tie_breakers = default_tie_breakers(apt.session)
self.tie_breakers = tie_breakers self.tie_breakers = tie_breakers
def __str__(self): def __str__(self):