summaryrefslogtreecommitdiffstats
path: root/bin/emerge
diff options
context:
space:
mode:
Diffstat (limited to 'bin/emerge')
-rwxr-xr-xbin/emerge48
1 files changed, 28 insertions, 20 deletions
diff --git a/bin/emerge b/bin/emerge
index c38e4d3c1..b9bebda6b 100755
--- a/bin/emerge
+++ b/bin/emerge
@@ -2346,7 +2346,7 @@ class depgraph:
break
ignore_priority_soft_range = [None]
ignore_priority_soft_range.extend(
- xrange(DepPriority.MIN, DepPriority.SOFT + 1))
+ xrange(DepPriority.MIN, DepPriority.MEDIUM_SOFT + 1))
tree_mode = "--tree" in self.myopts
# Tracks whether or not the current iteration should prefer asap_nodes
# if available. This is set to False when the previous iteration
@@ -2375,6 +2375,7 @@ class depgraph:
while not mygraph.empty():
selected_nodes = None
+ ignore_priority = None
if prefer_asap and asap_nodes:
"""ASAP nodes are merged before their soft deps."""
asap_nodes = [node for node in asap_nodes \
@@ -2411,6 +2412,7 @@ class depgraph:
(accept_root_node or ignore_priority is None):
# settle for a root node
selected_nodes = [nodes[0]]
+
if not selected_nodes:
nodes = get_nodes(ignore_priority=DepPriority.MEDIUM)
if nodes:
@@ -2454,6 +2456,14 @@ class depgraph:
if selected_nodes:
break
+ # If any nodes have been selected here, it's always
+ # possible that anything up to a MEDIUM_SOFT priority
+ # relationship has been ignored. This state is recorded
+ # in ignore_priority so that relevant nodes will be
+ # added to asap_nodes when appropriate.
+ if selected_nodes:
+ ignore_priority = DepPriority.MEDIUM_SOFT
+
if prefer_asap and asap_nodes and not selected_nodes:
# We failed to find any asap nodes to merge, so ignore
# them for the next iteration.
@@ -2466,25 +2476,23 @@ class depgraph:
accept_root_node = True
continue
- if selected_nodes and ignore_priority > DepPriority.SOFT:
- # Try to merge ignored medium deps as soon as possible.
- for node in selected_nodes:
- children = set(mygraph.child_nodes(node))
- soft = children.difference(
- mygraph.child_nodes(node,
- ignore_priority=DepPriority.SOFT))
- medium_soft = children.difference(
- mygraph.child_nodes(node,
- ignore_priority=DepPriority.MEDIUM_SOFT))
- medium_soft.difference_update(soft)
- for child in medium_soft:
- if child in selected_nodes:
- continue
- if child in asap_nodes:
- continue
- # TODO: Try harder to make these nodes get
- # merged absolutely as soon as possible.
- asap_nodes.append(child)
+ if selected_nodes and ignore_priority > DepPriority.SOFT:
+ # Try to merge ignored medium deps as soon as possible.
+ for node in selected_nodes:
+ children = set(mygraph.child_nodes(node))
+ soft = children.difference(
+ mygraph.child_nodes(node,
+ ignore_priority=DepPriority.SOFT))
+ medium_soft = children.difference(
+ mygraph.child_nodes(node,
+ ignore_priority=DepPriority.MEDIUM_SOFT))
+ medium_soft.difference_update(soft)
+ for child in medium_soft:
+ if child in selected_nodes:
+ continue
+ if child in asap_nodes:
+ continue
+ asap_nodes.append(child)
if not selected_nodes:
if not myblockers.is_empty():