mirror of
https://git.launchpad.net/~ubuntu-release/britney/+git/britney2-ubuntu
synced 2025-03-10 10:51:08 +00:00
britney.py: Add all_binaries to store binaries by pkg_id
It can be used to A) to make the mismatch check more efficient and B) share identical binaries between suites. Signed-off-by: Niels Thykier <niels@thykier.net>
This commit is contained in:
parent
717804c5ab
commit
f5a52fcec4
72
britney.py
72
britney.py
@ -213,6 +213,19 @@ from consts import (VERSION, SECTION, BINARIES, MAINTAINER, FAKESRC,
|
||||
__author__ = 'Fabio Tranchitella and the Debian Release Team'
|
||||
__version__ = '2.0'
|
||||
|
||||
# NB: ESSENTIAL deliberately skipped as the 2011 and 2012
|
||||
# parts of the live-data tests require it (britney merges
|
||||
# this field correctly from the unstable version where
|
||||
# available)
|
||||
check_field_name = dict((globals()[fn], fn) for fn in
|
||||
(
|
||||
"SOURCE SOURCEVER ARCHITECTURE MULTIARCH" +
|
||||
" DEPENDS CONFLICTS PROVIDES"
|
||||
).split()
|
||||
)
|
||||
|
||||
check_fields = sorted(check_field_name)
|
||||
|
||||
class Britney(object):
|
||||
"""Britney, the Debian testing updater script
|
||||
|
||||
@ -260,6 +273,7 @@ class Britney(object):
|
||||
print('\n'.join('%4d %s' % (len(nuninst[x]), x) for x in self.options.architectures))
|
||||
return
|
||||
|
||||
self.all_binaries = {}
|
||||
# read the source and binary packages for the involved distributions
|
||||
self.sources['testing'] = self.read_sources(self.options.testing)
|
||||
self.sources['unstable'] = self.read_sources(self.options.unstable)
|
||||
@ -287,8 +301,6 @@ class Britney(object):
|
||||
# here.
|
||||
self.binaries['pu'][arch] = ({}, {})
|
||||
|
||||
self._check_mismatches(arch)
|
||||
|
||||
self.__log("Compiling Installability tester", type="I")
|
||||
self._build_installability_tester(self.options.architectures)
|
||||
|
||||
@ -329,43 +341,23 @@ class Britney(object):
|
||||
self.urgencies = self.read_urgencies(self.options.testing)
|
||||
self.excuses = []
|
||||
|
||||
def _check_mismatches(self, arch):
|
||||
suites = [s for s in self.binaries if arch in self.binaries[s]]
|
||||
def merge_pkg_entries(self, package, parch, pkg_entry1, pkg_entry2,
|
||||
check_fields=check_fields, check_field_name=check_field_name):
|
||||
bad = []
|
||||
for f in check_fields:
|
||||
if pkg_entry1[f] != pkg_entry2[f]:
|
||||
bad.append((f, pkg_entry1[f], pkg_entry2[f]))
|
||||
|
||||
# NB: ESSENTIAL deliberately skipped as the 2011 and 2012
|
||||
# parts of the live-data tests require it (britney merges
|
||||
# this field correctly from the unstable version where
|
||||
# available)
|
||||
check_field_name = dict( (globals()[fn], fn) for fn in
|
||||
("SOURCE SOURCEVER ARCHITECTURE MULTIARCH"
|
||||
+ " DEPENDS CONFLICTS PROVIDES").split() )
|
||||
check_fields = check_field_name.keys()
|
||||
if bad:
|
||||
self.__log("Mismatch found %s %s %s differs" % (
|
||||
package, pkg_entry1[VERSION], parch), type="E")
|
||||
for f, v1, v2 in bad:
|
||||
self.__log(" ... %s %s != %s" % (check_field_name[f], v1, v2))
|
||||
raise ValueError("Invalid data set")
|
||||
|
||||
any_mismatch = False
|
||||
for s1, s2 in product(suites, suites):
|
||||
if s1 >= s2: continue
|
||||
s1_pkgs = self.binaries[s1][arch][0]
|
||||
s2_pkgs = self.binaries[s2][arch][0]
|
||||
pkgs = set(s1_pkgs) & set(s2_pkgs)
|
||||
for p in pkgs:
|
||||
if s1_pkgs[p][VERSION] != s2_pkgs[p][VERSION]: continue
|
||||
bad = []
|
||||
for f in check_fields:
|
||||
if s1_pkgs[p][f] != s2_pkgs[p][f]:
|
||||
bad.append((f, s1_pkgs[p][f], s2_pkgs[p][f]))
|
||||
|
||||
if bad:
|
||||
any_mismatch = True
|
||||
self.__log("Mismatch found %s %s %s differs in %s vs %s" % (
|
||||
p, s1_pkgs[p][VERSION], arch, s1, s2), type="E")
|
||||
for f, v1, v2 in bad:
|
||||
self.__log(" ... %s %s != %s" % (check_field_name[f], v1, v2))
|
||||
|
||||
# test suite doesn't appreciate aborts of this nature
|
||||
if any_mismatch:
|
||||
self.__log("Mismatches found, exiting.", type="I")
|
||||
sys.exit(1)
|
||||
return
|
||||
# Merge ESSENTIAL if necessary
|
||||
if pkg_entry2[ESSENTIAL]:
|
||||
pkg_entry1[ESSENTIAL] = True
|
||||
|
||||
def __parse_arguments(self):
|
||||
"""Parse the command line arguments
|
||||
@ -618,6 +610,7 @@ class Britney(object):
|
||||
packages = {}
|
||||
provides = {}
|
||||
sources = self.sources
|
||||
all_binaries = self.all_binaries
|
||||
|
||||
filename = os.path.join(basedir, "Packages_%s" % arch)
|
||||
self.__log("Loading binary packages from %s" % filename)
|
||||
@ -639,6 +632,7 @@ class Britney(object):
|
||||
continue
|
||||
pkg = intern(pkg)
|
||||
version = intern(version)
|
||||
pkg_id = (pkg, version, arch)
|
||||
|
||||
# Merge Pre-Depends with Depends and Conflicts with
|
||||
# Breaks. Britney is not interested in the "finer
|
||||
@ -707,6 +701,10 @@ class Britney(object):
|
||||
|
||||
# add the resulting dictionary to the package list
|
||||
packages[pkg] = dpkg
|
||||
if pkg_id in all_binaries:
|
||||
self.merge_pkg_entries(pkg, arch, all_binaries[pkg_id], dpkg)
|
||||
else:
|
||||
all_binaries[pkg_id] = dpkg
|
||||
|
||||
# return a tuple with the list of real and virtual packages
|
||||
return (packages, provides)
|
||||
|
Loading…
x
Reference in New Issue
Block a user