britney: Move table lookup out of get_dependency_solvers

The callers of get_dependency_solvers need to do those table lookups
anyway.  By moving it out, it is now possible to reuse the results.

Signed-off-by: Niels Thykier <niels@thykier.net>
master
Niels Thykier 9 years ago
parent 681a7b8cd7
commit 6db0ed5ac8

@ -501,12 +501,13 @@ class Britney(object):
sat = set() sat = set()
for dep_dist in binaries: for dep_dist in binaries:
pkgs = solvers(block, arch, dep_dist) dep_packages_s_a = binaries[dep_dist][arch]
pkgs = solvers(block, dep_packages_s_a)
for p in pkgs: for p in pkgs:
# version and arch is already interned, but solvers use # version and arch is already interned, but solvers use
# the package name extracted from the field and it is therefore # the package name extracted from the field and it is therefore
# not interned. # not interned.
pdata = binaries[dep_dist][arch][0][p] pdata = dep_packages_s_a[0][p]
pt = (sys.intern(p), pdata[VERSION], arch) pt = (sys.intern(p), pdata[VERSION], arch)
if dep: if dep:
sat.add(pt) sat.add(pt)
@ -957,23 +958,19 @@ class Britney(object):
# Utility methods for package analysis # Utility methods for package analysis
# ------------------------------------ # ------------------------------------
def get_dependency_solvers(self, block, arch, distribution): def get_dependency_solvers(self, block, packages_s_a):
"""Find the packages which satisfy a dependency block """Find the packages which satisfy a dependency block
This method returns the list of packages which satisfy a dependency This method returns the list of packages which satisfy a dependency
block (as returned by apt_pkg.parse_depends) for the given architecture block (as returned by apt_pkg.parse_depends) in a package table
and distribution. for a given suite and architecture (a la self.binaries[suite][arch])
It returns a tuple with two items: the first is a boolean which is It returns a tuple with two items: the first is a boolean which is
True if the dependency is satisfied, the second is the list of the True if the dependency is satisfied, the second is the list of the
solving packages. solving packages.
""" """
packages = [] packages = []
# local copies for better performance
binaries = self.binaries[distribution][arch]
# for every package, version and operation in the block # for every package, version and operation in the block
for name, version, op in block: for name, version, op in block:
if ":" in name: if ":" in name:
@ -982,8 +979,8 @@ class Britney(object):
archqual = None archqual = None
# look for the package in unstable # look for the package in unstable
if name in binaries[0]: if name in packages_s_a[0]:
package = binaries[0][name] package = packages_s_a[0][name]
# check the versioned dependency and architecture qualifier # check the versioned dependency and architecture qualifier
# (if present) # (if present)
if (op == '' and version == '') or apt_pkg.check_dep(package[VERSION], op, version): if (op == '' and version == '') or apt_pkg.check_dep(package[VERSION], op, version):
@ -991,8 +988,8 @@ class Britney(object):
packages.append(name) packages.append(name)
# look for the package in the virtual packages list and loop on them # look for the package in the virtual packages list and loop on them
for prov in binaries[1].get(name, []): for prov in packages_s_a[1].get(name, []):
if prov not in binaries[0]: continue if prov not in packages_s_a[0]: continue
# A provides only satisfies: # A provides only satisfies:
# - an unversioned dependency (per Policy Manual §7.5) # - an unversioned dependency (per Policy Manual §7.5)
# - a dependency without an architecture qualifier # - a dependency without an architecture qualifier
@ -1013,7 +1010,9 @@ class Britney(object):
as parameter. as parameter.
""" """
# retrieve the binary package from the specified suite and arch # retrieve the binary package from the specified suite and arch
binary_u = self.binaries[suite][arch][0][pkg] package_s_a = self.binaries[suite][arch]
package_t_a = self.binaries['testing'][arch]
binary_u = package_s_a[0][pkg]
# local copies for better performance # local copies for better performance
parse_depends = apt_pkg.parse_depends parse_depends = apt_pkg.parse_depends
@ -1027,16 +1026,17 @@ 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, False), 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, arch, 'testing') packages = get_dependency_solvers(block, package_t_a)
if packages: if packages:
for p in packages: for p in packages:
if p not in self.binaries[suite][arch][0]: continue if p not in package_s_a[0]:
excuse.add_sane_dep(self.binaries[suite][arch][0][p][SOURCE]) continue
excuse.add_sane_dep(package_s_a[0][p][SOURCE])
continue continue
# check if the block can be satisfied in unstable, and list the solving packages # check if the block can be satisfied in the source suite, and list the solving packages
packages = get_dependency_solvers(block, arch, suite) packages = get_dependency_solvers(block, package_s_a)
packages = [self.binaries[suite][arch][0][p][SOURCE] for p in packages] packages = [package_s_a[0][p][SOURCE] for p in packages]
# if the dependency can be satisfied by the same source package, skip the block: # if the dependency can be satisfied by the same source package, skip the block:
# obviously both binary packages will enter testing together # obviously both binary packages will enter testing together

Loading…
Cancel
Save