[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#625792: [britney2] Needs to be cleverer at deciding which packages to check for installability

tag 625792 + patch

On Fri, 2011-05-06 at 20:14 +0100, Adam D. Barratt wrote:
> On Fri, 2011-05-06 at 20:57 +0200, Julien Cristau wrote:
> > On Fri, May  6, 2011 at 00:27:18 +0100, Adam D. Barratt wrote:
> > 
> > > thunar-vfs
> > > - the source isn't in testing; so steps A, C and D are skipped
> > > - unstable's ristretto doesn't depend on libthunar-vfs-1-2, so the
> > > package isn't marked for checking again
> > > 
> > hrm, but why does unstable's ristretto matter at that point, rather than
> > testing's?  (Apologies if I'm missing something obvious.)
> It's not unstable's ristretto so much as unstable's thunar-vfs.
> After adding thunar-vfs to testing, the record for the libthunar-vfs-1-2
> binary built from that source is copied from unstable to testing,
> including the previously computed list of reverse dependencies, which is
> then used to look for affected packages.

So, the solution to this turned out to be reasonably simple, although it
took me a while to see that.  iter_packages() has a list of undo
dictionaries for the entire exo hint, which includes the fact that the
previous version of libthunar-vfs-1-2 had ristretto as a
reverse-dependency; the fix is to make doop_source() aware of that undo

Patch attached.  I'll probably push it in a day or so unless anyone
yells or points out issues with it.


diff --git a/britney.py b/britney.py
index 7c72a56..b03dc0d 100755
--- a/britney.py
+++ b/britney.py
@@ -1994,9 +1994,12 @@ class Britney:
         # check the package at the top of the tree
         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`
+        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
         them so it will be possible to revert them.
@@ -2112,6 +2115,22 @@ class Britney:
                             key = (p, parch)
                             if key not in affected: affected.append(key)
+                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
                 binaries[parch][0][binary] = self.binaries[suite][parch][0][binary]
                 self.systems[parch].add_binary(binary, binaries[parch][0][binary][:PROVIDES] + \
@@ -2258,7 +2277,7 @@ class Britney:
             if pkg in pre_process:
                 pkg_name, suite, affected, undo = pre_process[pkg]
-                pkg_name, suite, affected, undo = self.doop_source(pkg)
+                pkg_name, suite, affected, undo = self.doop_source(pkg, lundo)
             if hint:
                 lundo.append((undo, pkg, pkg_name, suite))

Reply to: