From b84449fae4abf40ff3721002952dc37ccef24030 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Sun, 22 May 2011 22:39:57 -0700 Subject: _serialize_tasks: prefer unsatisfied asap child Optimally, satisfied deps are always merged after the asap nodes that depend on them. --- pym/_emerge/depgraph.py | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) (limited to 'pym/_emerge/depgraph.py') diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py index 37fdeeda3..ca1fe0d53 100644 --- a/pym/_emerge/depgraph.py +++ b/pym/_emerge/depgraph.py @@ -4931,6 +4931,7 @@ class depgraph(object): if nodes: # If there is a mixture of merges and uninstalls, # do the uninstalls first. + good_uninstalls = None if len(nodes) > 1: good_uninstalls = [] for node in nodes: @@ -4942,7 +4943,9 @@ class depgraph(object): else: nodes = nodes - if ignore_priority is None and not tree_mode: + if good_uninstalls or len(nodes) == 1 or \ + (ignore_priority is None and \ + not asap_nodes and not tree_mode): # Greedily pop all of these nodes since no # relationship has been ignored. This optimization # destroys --tree output, so it's disabled in tree @@ -4955,12 +4958,25 @@ class depgraph(object): # will not produce a leaf node, so avoid it. # * It's normal for a selected uninstall to be a # root node, so don't check them for parents. - for node in nodes: - if node.operation == "uninstall" or \ - mygraph.parent_nodes(node): - selected_nodes = [node] + if asap_nodes: + prefer_asap_parents = (True, False) + else: + prefer_asap_parents = (False,) + for check_asap_parent in prefer_asap_parents: + if check_asap_parent: + for node in nodes: + parents = mygraph.parent_nodes(node, + ignore_priority=DepPrioritySatisfiedRange.ignore_soft) + if parents and set(parents).intersection(asap_nodes): + selected_nodes = [node] + break + else: + for node in nodes: + if mygraph.parent_nodes(node): + selected_nodes = [node] + break + if selected_nodes: break - if selected_nodes: break -- cgit v1.2.3-1-g7c22