Consider packages with M-A qualifiers for reverse dependencies

Strip of Multi-Arch qualifiers ":any" and ":native" when building the
dependency fields, as they are not part of the package name.

This will fix cases like

  Package: ipython3
  Depends: python3:any (>= 3)

and include ipython3 in python3's reverse dependencies.

Closes: #794194
master
Martin Pitt 8 years ago
parent 8e0405d2e2
commit e5f306c5f5

@ -195,7 +195,7 @@ from britney2 import SuiteInfo, SourcePackage, BinaryPackageId, BinaryPackage
from britney2.consts import (SOURCE, SOURCEVER, ARCHITECTURE, CONFLICTS, DEPENDS, PROVIDES, MULTIARCH) from britney2.consts import (SOURCE, SOURCEVER, ARCHITECTURE, CONFLICTS, DEPENDS, PROVIDES, MULTIARCH)
from britney2.excuse import Excuse from britney2.excuse import Excuse
from britney2.hints import HintParser from britney2.hints import HintParser
from britney2.installability.builder import build_installability_tester from britney2.installability.builder import build_installability_tester, ma_parse_depends
from britney2.migrationitem import MigrationItem from britney2.migrationitem import MigrationItem
from britney2.policies.policy import AgePolicy, RCBugPolicy, PiupartsPolicy, PolicyVerdict from britney2.policies.policy import AgePolicy, RCBugPolicy, PiupartsPolicy, PolicyVerdict
from britney2.utils import (old_libraries_format, undo_changes, from britney2.utils import (old_libraries_format, undo_changes,
@ -711,7 +711,7 @@ class Britney(object):
return sources return sources
def _parse_provides(self, pkg_id, provides_raw): def _parse_provides(self, pkg_id, provides_raw):
parts = apt_pkg.parse_depends(provides_raw, False) parts = ma_parse_depends(provides_raw)
nprov = [] nprov = []
for or_clause in parts: for or_clause in parts:
if len(or_clause) != 1: # pragma: no cover if len(or_clause) != 1: # pragma: no cover
@ -1004,7 +1004,7 @@ class Britney(object):
binary_u = binaries_s_a[pkg] binary_u = binaries_s_a[pkg]
# local copies for better performance # local copies for better performance
parse_depends = apt_pkg.parse_depends parse_depends = ma_parse_depends
# analyze the dependency fields (if present) # analyze the dependency fields (if present)
deps = binary_u.depends deps = binary_u.depends
@ -1014,7 +1014,7 @@ class Britney(object):
# for every dependency block (formed as conjunction of disjunction) # for every dependency block (formed as conjunction of disjunction)
for block, block_txt in zip(parse_depends(deps, False), deps.split(',')): for block, block_txt in zip(parse_depends(deps), deps.split(',')):
# if the block is satisfied in testing, then skip the block # if the block is satisfied in testing, then skip the block
packages = get_dependency_solvers(block, binaries_t_a, provides_t_a) packages = get_dependency_solvers(block, binaries_t_a, provides_t_a)
if packages: if packages:

@ -21,6 +21,20 @@ from britney2.utils import ifilter_except, iter_except, get_dependency_solvers
from britney2.installability.solver import InstallabilitySolver from britney2.installability.solver import InstallabilitySolver
def ma_parse_depends(dep_str):
"""Parse a dependency string into a list of triples
This is like apt_pkg.parse_depends but filters out :any and :native
Multi-Arch prefixes. We don't use apt_pkg.parse_depends(dep_str, True)
as that would also filter out arch specific dependencies like :amd64.
"""
res = apt_pkg.parse_depends(dep_str, False)
filtered = []
for or_clause in res:
filtered.append([(p.replace(':any', '').replace(':native', ''), v, r) for (p, v, r) in or_clause])
return filtered
def build_installability_tester(binaries, archs): def build_installability_tester(binaries, archs):
"""Create the installability tester""" """Create the installability tester"""
@ -43,10 +57,10 @@ def build_installability_tester(binaries, archs):
# We do not differentiate between depends and pre-depends # We do not differentiate between depends and pre-depends
if pkgdata.depends: if pkgdata.depends:
depends.extend(apt_pkg.parse_depends(pkgdata.depends, False)) depends.extend(ma_parse_depends(pkgdata.depends))
if pkgdata.conflicts: if pkgdata.conflicts:
conflicts = apt_pkg.parse_depends(pkgdata.conflicts, False) conflicts = ma_parse_depends(pkgdata.conflicts)
with builder.relation_builder(pkg_id) as relations: with builder.relation_builder(pkg_id) as relations:

Loading…
Cancel
Save