Ensure reverse-dependencies of superseded packages are always checked.

If a binary package being processed as part of a hint has moved source
packages, the installability checks for the new version of the binary
need to include the reverse-dependency information from the previous
version.  In order to allow this, modify doop_source() to take an
optional list of undo information and iter_packages() to pass such
a list when processing hints.

Signed-off-by: Adam D. Barratt <adam@adam-barratt.org.uk>
debian
Adam D. Barratt 14 years ago
parent a8e4ce0063
commit 709ea952bb

@ -1994,9 +1994,12 @@ class Britney:
# check the package at the top of the tree # check the package at the top of the tree
return satisfy(pkg) return satisfy(pkg)
def doop_source(self, pkg): def doop_source(self, pkg, hint_undo=[]):
"""Apply a change to the testing distribution as requested by `pkg` """Apply a change to the testing distribution as requested by `pkg`
An optional list of undo actions related to packages processed earlier
in a hint may be passed in `hint_undo`.
This method applies the changes required by the action `pkg` tracking This method applies the changes required by the action `pkg` tracking
them so it will be possible to revert them. them so it will be possible to revert them.
@ -2112,6 +2115,22 @@ class Britney:
key = (p, parch) key = (p, parch)
if key not in affected: affected.append(key) if key not in affected: affected.append(key)
self.systems[parch].remove_binary(binary) self.systems[parch].remove_binary(binary)
else:
# if the binary was previously built by a different
# source package in testing, all of the reverse
# dependencies of the old binary are affected.
# reverse dependencies built from this source can be
# ignored as their reverse trees are already handled
# by this function
# XXX: and the reverse conflict tree?
for (tundo, tpkg, tpkg_name, tsuite) in hint_undo:
if p in tundo['binaries']:
for rdep in tundo['binaries'][p][RDEPENDS]:
if rdep in binaries[parch][0] and rdep not in source[BINARIES]:
affected.append( (rdep, parch) )
affected.extend( [ (x, parch) for x in \
self.get_reverse_tree(rdep, parch, 'testing') ] )
affected = list(set(affected))
# add/update the binary package # add/update the binary package
binaries[parch][0][binary] = self.binaries[suite][parch][0][binary] binaries[parch][0][binary] = self.binaries[suite][parch][0][binary]
self.systems[parch].add_binary(binary, binaries[parch][0][binary][:PROVIDES] + \ self.systems[parch].add_binary(binary, binaries[parch][0][binary][:PROVIDES] + \
@ -2258,7 +2277,7 @@ class Britney:
if pkg in pre_process: if pkg in pre_process:
pkg_name, suite, affected, undo = pre_process[pkg] pkg_name, suite, affected, undo = pre_process[pkg]
else: else:
pkg_name, suite, affected, undo = self.doop_source(pkg) pkg_name, suite, affected, undo = self.doop_source(pkg, lundo)
if hint: if hint:
lundo.append((undo, pkg, pkg_name, suite)) lundo.append((undo, pkg, pkg_name, suite))

Loading…
Cancel
Save