summaryrefslogtreecommitdiffstats
path: root/bin/emerge
diff options
context:
space:
mode:
Diffstat (limited to 'bin/emerge')
-rwxr-xr-xbin/emerge15
1 files changed, 13 insertions, 2 deletions
diff --git a/bin/emerge b/bin/emerge
index 5556f9368..a476fd9e3 100755
--- a/bin/emerge
+++ b/bin/emerge
@@ -1934,6 +1934,8 @@ class depgraph(object):
self._blocker_uninstalls = digraph()
# Contains only Package -> Blocker edges
self._blocker_parents = digraph()
+ # Contains only irrelevant Package -> Blocker edges
+ self._irrelevant_blockers = digraph()
# Contains only unsolvable Package -> Blocker edges
self._unsolvable_blockers = digraph()
self._slot_collision_info = set()
@@ -3325,10 +3327,17 @@ class depgraph(object):
blocker_atoms = None
blockers = None
if self.digraph.contains(pkg):
+ blockers = []
try:
- blockers = self._blocker_parents.child_nodes(pkg)
+ blockers.extend(
+ self._blocker_parents.child_nodes(pkg))
except KeyError:
- blockers = []
+ pass
+ try:
+ blockers.extend(
+ self._irrelevant_blockers.child_nodes(pkg))
+ except KeyError:
+ pass
if blockers is not None:
blockers = set("!" + blocker.atom \
for blocker in blockers)
@@ -3460,6 +3469,7 @@ class depgraph(object):
self._blocker_parents.remove(blocker)
# Discard any parents that don't have any more blockers.
for pkg in parent_pkgs:
+ self._irrelevant_blockers.add(blocker, pkg)
if not self._blocker_parents.child_nodes(pkg):
self._blocker_parents.remove(pkg)
continue
@@ -3534,6 +3544,7 @@ class depgraph(object):
# merged.
self._blocker_uninstalls.addnode(uninst_task, blocker)
if not unresolved_blocks and not depends_on_order:
+ self._irrelevant_blockers.add(blocker, parent)
self._blocker_parents.remove_edge(blocker, parent)
if not self._blocker_parents.parent_nodes(blocker):
self._blocker_parents.remove(blocker)