summaryrefslogtreecommitdiffstats
path: root/pym/_emerge/depgraph.py
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2011-02-13 19:28:07 -0800
committerZac Medico <zmedico@gentoo.org>2011-02-13 20:30:37 -0800
commiteca171c182113f6b45e0ef7efccbf70e193c1882 (patch)
tree1a7424a7fd5ac28585a92681bb3c25ad525350ad /pym/_emerge/depgraph.py
parent15b84386d7f91da7c96cb9b3533ee023ae03439f (diff)
downloadportage-eca171c182113f6b45e0ef7efccbf70e193c1882.tar.gz
portage-eca171c182113f6b45e0ef7efccbf70e193c1882.tar.bz2
portage-eca171c182113f6b45e0ef7efccbf70e193c1882.zip
get_dep_chain: prefer parents in merge list
This will fix bug #354747.
Diffstat (limited to 'pym/_emerge/depgraph.py')
-rw-r--r--pym/_emerge/depgraph.py30
1 files changed, 20 insertions, 10 deletions
diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py
index 2257318d2..1b76f5323 100644
--- a/pym/_emerge/depgraph.py
+++ b/pym/_emerge/depgraph.py
@@ -2373,20 +2373,20 @@ class depgraph(object):
# 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.
+ child = node
selected_parent = None
+ parent_arg = None
+ parent_merge = None
+
for parent in self._dynamic_config.digraph.parent_nodes(node):
if parent in traversed_nodes:
continue
if isinstance(parent, DependencyArg):
- if self._dynamic_config.digraph.parent_nodes(parent):
- selected_parent = parent
- child = node
- else:
- dep_chain.append(
- (_unicode_decode("%s") % (parent,), "argument"))
- selected_parent = None
- break
+ parent_arg = parent
else:
+ if isinstance(parent, Package) and \
+ parent.operation == "merge":
+ parent_merge = parent
if unsatisfied_dependency and node is start_node:
# Make sure that pkg doesn't satisfy parent's dependency.
# This ensures that we select the correct parent for use
@@ -2396,11 +2396,21 @@ class depgraph(object):
atom_set = InternalPackageSet(initial_atoms=(atom,))
if not atom_set.findAtomForPackage(start_node):
selected_parent = parent
- child = node
break
else:
selected_parent = parent
- child = node
+
+ if parent_merge is not None:
+ # Prefer parent in the merge list (bug #354747).
+ selected_parent = parent_merge
+ elif parent_arg is not None:
+ if self._dynamic_config.digraph.parent_nodes(parent_arg):
+ selected_parent = parent_arg
+ else:
+ dep_chain.append(
+ (_unicode_decode("%s") % (parent,), "argument"))
+ selected_parent = None
+
node = selected_parent
return dep_chain