In depgraph.loadResumeCommand(), account for unsatisfied dependencies of
authorZac Medico <zmedico@gentoo.org>
Wed, 11 Mar 2009 03:19:54 +0000 (03:19 -0000)
committerZac Medico <zmedico@gentoo.org>
Wed, 11 Mar 2009 03:19:54 +0000 (03:19 -0000)
installed packages if they are in the subgraph of dependencies of a package
which is scheduled to be installed. (trunk r12542)

svn path=/main/branches/2.1.6/; revision=12828

pym/_emerge/__init__.py

index bf070dd914ff7d534e55d1b57b26e5bce8f0da9a..b52dba05d4f469cf434175617a353c070b76e58b 100644 (file)
@@ -8499,11 +8499,35 @@ class depgraph(object):
                        if not self._create_graph(allow_unsatisfied=True):
                                return False
 
-                       # TODO: Add sanity checks to make sure that it's really
-                       # safe to ignore all the deps that can be ignored here.
-                       unsatisfied_deps = [x for x in self._unsatisfied_deps \
-                               if isinstance(x.parent, Package) and \
-                               x.parent.operation == "merge"]
+                       unsatisfied_deps = []
+                       for dep in self._unsatisfied_deps:
+                               if not isinstance(dep.parent, Package):
+                                       continue
+                               if dep.parent.operation == "merge":
+                                       unsatisfied_deps.append(dep)
+                                       continue
+
+                               # For unsatisfied deps of installed packages, only account for
+                               # them if they are in the subgraph of dependencies of a package
+                               # which is scheduled to be installed.
+                               unsatisfied_install = False
+                               traversed = set()
+                               dep_stack = self.digraph.parent_nodes(dep.parent)
+                               while dep_stack:
+                                       node = dep_stack.pop()
+                                       if not isinstance(node, Package):
+                                               continue
+                                       if node.operation == "merge":
+                                               unsatisfied_install = True
+                                               break
+                                       if node in traversed:
+                                               continue
+                                       traversed.add(node)
+                                       dep_stack.extend(self.digraph.parent_nodes(node))
+
+                               if unsatisfied_install:
+                                       unsatisfied_deps.append(dep)
+
                        if masked_tasks or unsatisfied_deps:
                                # This probably means that a required package
                                # was dropped via --skipfirst. It makes the