When --deep is not enabled, many dependencies are dicarded and
authorZac Medico <zmedico@gentoo.org>
Wed, 26 Sep 2007 04:30:04 +0000 (04:30 -0000)
committerZac Medico <zmedico@gentoo.org>
Wed, 26 Sep 2007 04:30:04 +0000 (04:30 -0000)
left out of the digraph. This patch prevents dependencies from
being discarded in some cases where the are needed in order to
optimize merge order. It also modifies the DepPriority.rebuild
attribute so that it only applies to build time dependencies.
This leads to better merge order in some cases when --deep is
not enabled. For example, `emerge xf86-input-keyboard
xorg-server` will now properly merge xorg-server before
xf86-input-keyboard (problem from bug #192254, comment #5).
(trunk r7797)

svn path=/main/branches/2.1.2/; revision=7825

bin/emerge

index 5764e84bc07b8ad5941b1be2580586b94502c895..529767ebcd8f6b9d6704af9ed59d888ad624d7f0 100755 (executable)
@@ -797,9 +797,9 @@ class DepPriority(object):
                                return -1
                        if self.runtime_post:
                                return -2
-               if self.rebuild:
-                       return -3
                if self.buildtime:
+                       if self.rebuild:
+                               return -3
                        return -4
                if self.runtime:
                        return -5
@@ -1813,17 +1813,6 @@ class depgraph:
                                                ("blocks", p_root, x[1:]), set()).add(myparent)
                                continue
                        else:
-                               #We are not processing a blocker but a normal dependency
-                               if myparent:
-                                       """In some cases, dep_check will return deps that shouldn't
-                                       be proccessed any further, so they are identified and
-                                       discarded here."""
-                                       if "empty" not in self.myparams and \
-                                               "deep" not in self.myparams and \
-                                               not ("--update" in self.myopts and parent_arg) and \
-                                               vardb.match(x):
-                                               continue
-
                                # List of acceptable packages, ordered by type preference.
                                matched_packages = []
                                myeb_matches = portdb.xmatch("match-visible", x)
@@ -2012,6 +2001,29 @@ class depgraph:
                                # ordered by type preference ("ebuild" type is the last resort)
                                selected_pkg =  matched_packages[0]
 
+                               # In some cases, dep_check will return deps that shouldn't
+                               # be proccessed any further, so they are identified and
+                               # discarded here. Try to discard as few as possible since
+                               # discarded dependencies reduce the amount of information
+                               # available for optimization of merge order.
+                               if myparent and not arg and vardb.match(x) and \
+                                       not existing_node and \
+                                       "empty" not in self.myparams and \
+                                       "deep" not in self.myparams and \
+                                       not ("--update" in self.myopts and parent_arg):
+                                       (mytype, myroot, mykey), metadata = selected_pkg
+                                       myarg = None
+                                       if myroot == self.target_root:
+                                               try:
+                                                       myarg = self._set_atoms.findAtomForPackage(
+                                                               mykey, metadata)
+                                               except portage.exception.InvalidDependString:
+                                                       # This is already handled inside
+                                                       # self.create() when necessary.
+                                                       pass
+                                       if not myarg:
+                                               continue
+
                        if myparent:
                                #we are a dependency, so we want to be unconditionally added
                                mypriority = priority.copy()