Fix the code from bug #245358 so that it's guaranteed to traverse all the
authorZac Medico <zmedico@gentoo.org>
Sun, 23 Nov 2008 07:46:59 +0000 (07:46 -0000)
committerZac Medico <zmedico@gentoo.org>
Sun, 23 Nov 2008 07:46:59 +0000 (07:46 -0000)
way to a root node, even when circular deps are encountered.

svn path=/main/trunk/; revision=12051

pym/_emerge/__init__.py

index 1dd0575d8903e23608e3ef878d36f014a32479f0..ceae0395bf356f099e860ec3ab699b634ecd5a10 100644 (file)
@@ -5411,17 +5411,19 @@ class depgraph(object):
                        traversed_nodes.add(node)
                        msg.append('(dependency required by "%s" [%s])' % \
                                (colorize('INFORM', str(node.cpv)), node.type_name))
-                       parent = None
+                       # When traversing to parents, prefer arguments over packages
+                       # since arguments are root nodes. Never traverse the same
+                       # package twice, in order to prevent an infinite loop.
+                       selected_parent = None
                        for parent in self.digraph.parent_nodes(node):
-                               if parent in traversed_nodes:
-                                       parent = None
-                                       continue
                                if isinstance(parent, DependencyArg):
                                        msg.append('(dependency required by "%s" [argument])' % \
                                                (colorize('INFORM', str(parent))))
-                                       parent = None
+                                       selected_parent = None
                                        break
-                       node = parent
+                               if parent not in traversed_nodes:
+                                       selected_parent = parent
+                       node = selected_parent
                for line in msg:
                        print line