diff options
-rwxr-xr-x | bin/emerge | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/bin/emerge b/bin/emerge index 0a35d4907..88c59c53d 100755 --- a/bin/emerge +++ b/bin/emerge @@ -1520,6 +1520,19 @@ class depgraph: self.blocker_parents[blocker] = myparents myparents.add(myparent) + modified_slots = {} + if self.blocker_parents: + for myroot in self.trees: + myslots = {} + modified_slots[myroot] = myslots + final_db = self.mydbapi[myroot] + for mycpv, mynode in self.pkg_node_map[myroot].iteritems(): + mytype, myroot, mycpv, mystatus = mynode + if mystatus == "merge": + slot_atom = "%s:%s" % (portage.dep_getkey(mycpv), + final_db.aux_get(mycpv, ["SLOT"])[0]) + modified_slots[myroot][slot_atom] = mycpv + for blocker in self.blocker_parents.keys(): mytype, myroot, mydep = blocker initial_db = self.trees[myroot]["vartree"].dbapi @@ -1544,6 +1557,7 @@ class depgraph: pdbapi = self.trees[proot][self.pkg_tree_map[ptype]].dbapi pslot = pdbapi.aux_get(pcpv, ["SLOT"])[0] pslot_atom = "%s:%s" % (portage.dep_getkey(pcpv), pslot) + parent_static = pslot_atom not in modified_slots[proot] unresolved_blocks = False depends_on_order = set() for cpv in blocked_initial: @@ -1554,6 +1568,11 @@ class depgraph: # node matters. In any case, this particular block is # automatically resolved. continue + if parent_static and \ + slot_atom not in modified_slots[myroot]: + # This blocker will be handled the next time that a + # merge of either package is triggered. + continue if pstatus == "merge" and \ slot_atom not in blocked_slots_final.values(): upgrade_matches = final_db.match(slot_atom) @@ -1573,6 +1592,11 @@ class depgraph: # The parent blocks itself, so the merge order does not # need to be enforced. continue + if parent_static and \ + slot_atom not in modified_slots[myroot]: + # This blocker will be handled the next time that a + # merge of either package is triggered. + continue # None of the above blocker resolutions techniques apply, # so apparently this one is unresolvable. unresolved_blocks = True |