From: Zac Medico Date: Mon, 14 Feb 2011 03:28:07 +0000 (-0800) Subject: get_dep_chain: prefer parents in merge list X-Git-Tag: v2.2.0_alpha24~15 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=b4f98ec5a1eb2e010a455b19db5bef8d61def241;p=portage.git get_dep_chain: prefer parents in merge list This will fix bug #354747. --- diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py index 30e70462f..ef4d1f02d 100644 --- a/pym/_emerge/depgraph.py +++ b/pym/_emerge/depgraph.py @@ -2359,20 +2359,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 @@ -2382,11 +2382,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