|
|
@ -418,14 +418,11 @@ class Britney:
|
|
|
|
sources = {}
|
|
|
|
sources = {}
|
|
|
|
filename = os.path.join(basedir, "Sources")
|
|
|
|
filename = os.path.join(basedir, "Sources")
|
|
|
|
self.__log("Loading source packages from %s" % filename)
|
|
|
|
self.__log("Loading source packages from %s" % filename)
|
|
|
|
try:
|
|
|
|
|
|
|
|
Packages = apt_pkg.TagFile(open(filename))
|
|
|
|
Packages = apt_pkg.TagFile(open(filename))
|
|
|
|
get_field = Packages.section.get
|
|
|
|
get_field = Packages.section.get
|
|
|
|
step = Packages.step
|
|
|
|
step = Packages.step
|
|
|
|
except AttributeError:
|
|
|
|
|
|
|
|
Packages = apt_pkg.ParseTagFile(open(filename))
|
|
|
|
|
|
|
|
get_field = Packages.Section.get
|
|
|
|
|
|
|
|
step = Packages.Step
|
|
|
|
|
|
|
|
while step():
|
|
|
|
while step():
|
|
|
|
pkg = get_field('Package')
|
|
|
|
pkg = get_field('Package')
|
|
|
|
ver = get_field('Version')
|
|
|
|
ver = get_field('Version')
|
|
|
@ -433,7 +430,7 @@ class Britney:
|
|
|
|
# (in unstable) if some architectures have out-of-date
|
|
|
|
# (in unstable) if some architectures have out-of-date
|
|
|
|
# binaries. We only ever consider the source with the
|
|
|
|
# binaries. We only ever consider the source with the
|
|
|
|
# largest version for migration.
|
|
|
|
# largest version for migration.
|
|
|
|
if pkg in sources and apt_pkg.VersionCompare(sources[pkg][0], ver) > 0:
|
|
|
|
if pkg in sources and apt_pkg.version_compare(sources[pkg][0], ver) > 0:
|
|
|
|
continue
|
|
|
|
continue
|
|
|
|
sources[pkg] = [ver,
|
|
|
|
sources[pkg] = [ver,
|
|
|
|
get_field('Section'),
|
|
|
|
get_field('Section'),
|
|
|
@ -473,14 +470,11 @@ class Britney:
|
|
|
|
|
|
|
|
|
|
|
|
filename = os.path.join(basedir, "Packages_%s" % arch)
|
|
|
|
filename = os.path.join(basedir, "Packages_%s" % arch)
|
|
|
|
self.__log("Loading binary packages from %s" % filename)
|
|
|
|
self.__log("Loading binary packages from %s" % filename)
|
|
|
|
try:
|
|
|
|
|
|
|
|
Packages = apt_pkg.TagFile(open(filename))
|
|
|
|
Packages = apt_pkg.TagFile(open(filename))
|
|
|
|
get_field = Packages.section.get
|
|
|
|
get_field = Packages.section.get
|
|
|
|
step = Packages.step
|
|
|
|
step = Packages.step
|
|
|
|
except AttributeError:
|
|
|
|
|
|
|
|
Packages = apt_pkg.ParseTagFile(open(filename))
|
|
|
|
|
|
|
|
get_field = Packages.Section.get
|
|
|
|
|
|
|
|
step = Packages.Step
|
|
|
|
|
|
|
|
while step():
|
|
|
|
while step():
|
|
|
|
pkg = get_field('Package')
|
|
|
|
pkg = get_field('Package')
|
|
|
|
version = get_field('Version')
|
|
|
|
version = get_field('Version')
|
|
|
@ -489,7 +483,7 @@ class Britney:
|
|
|
|
# (in unstable) if some architectures have out-of-date
|
|
|
|
# (in unstable) if some architectures have out-of-date
|
|
|
|
# binaries. We only ever consider the package with the
|
|
|
|
# binaries. We only ever consider the package with the
|
|
|
|
# largest version for migration.
|
|
|
|
# largest version for migration.
|
|
|
|
if pkg in packages and apt_pkg.VersionCompare(packages[pkg][0], version) > 0:
|
|
|
|
if pkg in packages and apt_pkg.version_compare(packages[pkg][0], version) > 0:
|
|
|
|
continue
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
|
|
final_conflicts_list = []
|
|
|
|
final_conflicts_list = []
|
|
|
@ -547,7 +541,7 @@ class Britney:
|
|
|
|
# return a tuple with the list of real and virtual packages
|
|
|
|
# return a tuple with the list of real and virtual packages
|
|
|
|
return (packages, provides)
|
|
|
|
return (packages, provides)
|
|
|
|
|
|
|
|
|
|
|
|
def register_reverses(self, pkg, packages, provides, check_doubles=True, parse_depends=apt_pkg.ParseDepends):
|
|
|
|
def register_reverses(self, pkg, packages, provides, check_doubles=True, parse_depends=apt_pkg.parse_depends):
|
|
|
|
"""Register reverse dependencies and conflicts for the specified package
|
|
|
|
"""Register reverse dependencies and conflicts for the specified package
|
|
|
|
|
|
|
|
|
|
|
|
This method registers the reverse dependencies and conflicts for
|
|
|
|
This method registers the reverse dependencies and conflicts for
|
|
|
@ -643,7 +637,7 @@ class Britney:
|
|
|
|
for arch in self.options.architectures:
|
|
|
|
for arch in self.options.architectures:
|
|
|
|
if pkg not in self.binaries[dist][arch][0]: continue
|
|
|
|
if pkg not in self.binaries[dist][arch][0]: continue
|
|
|
|
pkgv = self.binaries[dist][arch][0][pkg][VERSION]
|
|
|
|
pkgv = self.binaries[dist][arch][0][pkg][VERSION]
|
|
|
|
if maxver == None or apt_pkg.VersionCompare(pkgv, maxver) > 0:
|
|
|
|
if maxver == None or apt_pkg.version_compare(pkgv, maxver) > 0:
|
|
|
|
maxver = pkgv
|
|
|
|
maxver = pkgv
|
|
|
|
return maxver
|
|
|
|
return maxver
|
|
|
|
|
|
|
|
|
|
|
@ -745,12 +739,12 @@ class Britney:
|
|
|
|
|
|
|
|
|
|
|
|
# if the package exists in testing and it is more recent, do nothing
|
|
|
|
# if the package exists in testing and it is more recent, do nothing
|
|
|
|
tsrcv = self.sources['testing'].get(l[0], None)
|
|
|
|
tsrcv = self.sources['testing'].get(l[0], None)
|
|
|
|
if tsrcv and apt_pkg.VersionCompare(tsrcv[VERSION], l[1]) >= 0:
|
|
|
|
if tsrcv and apt_pkg.version_compare(tsrcv[VERSION], l[1]) >= 0:
|
|
|
|
continue
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
|
|
# if the package doesn't exist in unstable or it is older, do nothing
|
|
|
|
# if the package doesn't exist in unstable or it is older, do nothing
|
|
|
|
usrcv = self.sources['unstable'].get(l[0], None)
|
|
|
|
usrcv = self.sources['unstable'].get(l[0], None)
|
|
|
|
if not usrcv or apt_pkg.VersionCompare(usrcv[VERSION], l[1]) < 0:
|
|
|
|
if not usrcv or apt_pkg.version_compare(usrcv[VERSION], l[1]) < 0:
|
|
|
|
continue
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
|
|
# update the urgency for the package
|
|
|
|
# update the urgency for the package
|
|
|
@ -810,7 +804,7 @@ class Britney:
|
|
|
|
if package in z and z[package] != key:
|
|
|
|
if package in z and z[package] != key:
|
|
|
|
hint2 = z[package][0]
|
|
|
|
hint2 = z[package][0]
|
|
|
|
if x in ['unblock', 'unblock-udeb']:
|
|
|
|
if x in ['unblock', 'unblock-udeb']:
|
|
|
|
if apt_pkg.VersionCompare(hint2.version, hint.version) < 0:
|
|
|
|
if apt_pkg.version_compare(hint2.version, hint.version) < 0:
|
|
|
|
# This hint is for a newer version, so discard the old one
|
|
|
|
# This hint is for a newer version, so discard the old one
|
|
|
|
self.__log("Overriding %s[%s] = ('%s', '%s') with ('%s', '%s')" %
|
|
|
|
self.__log("Overriding %s[%s] = ('%s', '%s') with ('%s', '%s')" %
|
|
|
|
(x, package, hint2.version, hint2.user, hint.version, hint.user), type="W")
|
|
|
|
(x, package, hint2.version, hint2.user, hint.version, hint.user), type="W")
|
|
|
@ -970,7 +964,7 @@ class Britney:
|
|
|
|
"""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.ParseDepends) for the given architecture
|
|
|
|
block (as returned by apt_pkg.parse_depends) for the given architecture
|
|
|
|
and distribution.
|
|
|
|
and distribution.
|
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
@ -989,7 +983,7 @@ class Britney:
|
|
|
|
if name in binaries[0]:
|
|
|
|
if name in binaries[0]:
|
|
|
|
package = binaries[0][name]
|
|
|
|
package = binaries[0][name]
|
|
|
|
# check the versioned dependency (if present)
|
|
|
|
# check the versioned dependency (if present)
|
|
|
|
if op == '' and version == '' or apt_pkg.CheckDep(package[VERSION], op, version):
|
|
|
|
if op == '' and version == '' or apt_pkg.check_dep(package[VERSION], op, version):
|
|
|
|
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
|
|
|
@ -1000,7 +994,7 @@ class Britney:
|
|
|
|
# TODO: this is forbidden by the debian policy, which says that versioned
|
|
|
|
# TODO: this is forbidden by the debian policy, which says that versioned
|
|
|
|
# dependencies on virtual packages are never satisfied. The old britney
|
|
|
|
# dependencies on virtual packages are never satisfied. The old britney
|
|
|
|
# does it and we have to go with it, but at least a warning should be raised.
|
|
|
|
# does it and we have to go with it, but at least a warning should be raised.
|
|
|
|
if op == '' and version == '' or not strict and apt_pkg.CheckDep(package[VERSION], op, version):
|
|
|
|
if op == '' and version == '' or not strict and apt_pkg.check_dep(package[VERSION], op, version):
|
|
|
|
packages.append(prov)
|
|
|
|
packages.append(prov)
|
|
|
|
|
|
|
|
|
|
|
|
return (len(packages) > 0, packages)
|
|
|
|
return (len(packages) > 0, packages)
|
|
|
@ -1020,7 +1014,7 @@ class Britney:
|
|
|
|
binary_u = self.binaries[suite][arch][0][pkg]
|
|
|
|
binary_u = self.binaries[suite][arch][0][pkg]
|
|
|
|
|
|
|
|
|
|
|
|
# local copies for better performances
|
|
|
|
# local copies for better performances
|
|
|
|
parse_depends = apt_pkg.ParseDepends
|
|
|
|
parse_depends = apt_pkg.parse_depends
|
|
|
|
get_dependency_solvers = self.get_dependency_solvers
|
|
|
|
get_dependency_solvers = self.get_dependency_solvers
|
|
|
|
strict = True # not self.options.compatible
|
|
|
|
strict = True # not self.options.compatible
|
|
|
|
|
|
|
|
|
|
|
@ -1170,7 +1164,7 @@ class Britney:
|
|
|
|
|
|
|
|
|
|
|
|
# at this point, the binary package is present in testing, so we can compare
|
|
|
|
# at this point, the binary package is present in testing, so we can compare
|
|
|
|
# the versions of the packages ...
|
|
|
|
# the versions of the packages ...
|
|
|
|
vcompare = apt_pkg.VersionCompare(binary_t[VERSION], binary_u[VERSION])
|
|
|
|
vcompare = apt_pkg.version_compare(binary_t[VERSION], binary_u[VERSION])
|
|
|
|
|
|
|
|
|
|
|
|
# ... if updating would mean downgrading, then stop here: there is something wrong
|
|
|
|
# ... if updating would mean downgrading, then stop here: there is something wrong
|
|
|
|
if vcompare > 0:
|
|
|
|
if vcompare > 0:
|
|
|
@ -1229,7 +1223,7 @@ class Britney:
|
|
|
|
if src in self.sources['testing']:
|
|
|
|
if src in self.sources['testing']:
|
|
|
|
source_t = self.sources['testing'][src]
|
|
|
|
source_t = self.sources['testing'][src]
|
|
|
|
# if testing and unstable have the same version, then this is a candidate for binary-NMUs only
|
|
|
|
# if testing and unstable have the same version, then this is a candidate for binary-NMUs only
|
|
|
|
if apt_pkg.VersionCompare(source_t[VERSION], source_u[VERSION]) == 0:
|
|
|
|
if apt_pkg.version_compare(source_t[VERSION], source_u[VERSION]) == 0:
|
|
|
|
return False
|
|
|
|
return False
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
source_t = None
|
|
|
|
source_t = None
|
|
|
@ -1245,7 +1239,7 @@ class Britney:
|
|
|
|
update_candidate = True
|
|
|
|
update_candidate = True
|
|
|
|
|
|
|
|
|
|
|
|
# if the version in unstable is older, then stop here with a warning in the excuse and return False
|
|
|
|
# if the version in unstable is older, then stop here with a warning in the excuse and return False
|
|
|
|
if source_t and apt_pkg.VersionCompare(source_u[VERSION], source_t[VERSION]) < 0:
|
|
|
|
if source_t and apt_pkg.version_compare(source_u[VERSION], source_t[VERSION]) < 0:
|
|
|
|
excuse.addhtml("ALERT: %s is newer in testing (%s %s)" % (src, source_t[VERSION], source_u[VERSION]))
|
|
|
|
excuse.addhtml("ALERT: %s is newer in testing (%s %s)" % (src, source_t[VERSION], source_u[VERSION]))
|
|
|
|
self.excuses.append(excuse)
|
|
|
|
self.excuses.append(excuse)
|
|
|
|
return False
|
|
|
|
return False
|
|
|
@ -2583,10 +2577,10 @@ class Britney:
|
|
|
|
continue
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
|
|
inunstable = pkg.package in self.sources['unstable']
|
|
|
|
inunstable = pkg.package in self.sources['unstable']
|
|
|
|
rightversion = inunstable and (apt_pkg.VersionCompare(self.sources['unstable'][pkg.package][VERSION], pkg.version) == 0)
|
|
|
|
rightversion = inunstable and (apt_pkg.version_compare(self.sources['unstable'][pkg.package][VERSION], pkg.version) == 0)
|
|
|
|
if pkg.suite == 'unstable' and not rightversion:
|
|
|
|
if pkg.suite == 'unstable' and not rightversion:
|
|
|
|
for suite in ['pu', 'tpu']:
|
|
|
|
for suite in ['pu', 'tpu']:
|
|
|
|
if pkg.package in self.sources[suite] and apt_pkg.VersionCompare(self.sources[suite][pkg.package][VERSION], pkg.version) == 0:
|
|
|
|
if pkg.package in self.sources[suite] and apt_pkg.version_compare(self.sources[suite][pkg.package][VERSION], pkg.version) == 0:
|
|
|
|
pkg.suite = suite
|
|
|
|
pkg.suite = suite
|
|
|
|
_pkgvers[idx] = pkg
|
|
|
|
_pkgvers[idx] = pkg
|
|
|
|
break
|
|
|
|
break
|
|
|
@ -2594,7 +2588,7 @@ class Britney:
|
|
|
|
# handle *-proposed-updates
|
|
|
|
# handle *-proposed-updates
|
|
|
|
if pkg.suite in ['pu', 'tpu']:
|
|
|
|
if pkg.suite in ['pu', 'tpu']:
|
|
|
|
if pkg.package not in self.sources[pkg.suite]: continue
|
|
|
|
if pkg.package not in self.sources[pkg.suite]: continue
|
|
|
|
if apt_pkg.VersionCompare(self.sources[pkg.suite][pkg.package][VERSION], pkg.version) != 0:
|
|
|
|
if apt_pkg.version_compare(self.sources[pkg.suite][pkg.package][VERSION], pkg.version) != 0:
|
|
|
|
self.output_write(" Version mismatch, %s %s != %s\n" % (pkg.package, pkg.version, self.sources[pkg.suite][pkg.package][VERSION]))
|
|
|
|
self.output_write(" Version mismatch, %s %s != %s\n" % (pkg.package, pkg.version, self.sources[pkg.suite][pkg.package][VERSION]))
|
|
|
|
ok = False
|
|
|
|
ok = False
|
|
|
|
# does the package exist in unstable?
|
|
|
|
# does the package exist in unstable?
|
|
|
|