summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2006-12-11 21:38:02 +0000
committerZac Medico <zmedico@gentoo.org>2006-12-11 21:38:02 +0000
commit00cf943a1640410a134ac70bf52f85b05a3f2b03 (patch)
treec7ea4eb3d7b0b72e1ec4aa513d6f92e64af86c9c
parent4b34f215b65c5e057f283b16d906aaabb8e8f513 (diff)
downloadportage-00cf943a1640410a134ac70bf52f85b05a3f2b03.tar.gz
portage-00cf943a1640410a134ac70bf52f85b05a3f2b03.tar.bz2
portage-00cf943a1640410a134ac70bf52f85b05a3f2b03.zip
For bug #157823, ignore blocker collisions between two packages that are already installed if no merge is currently scheduled for either of those package slots. These blockers will be handled as necessary the next time that a merge of either package is triggered.
svn path=/main/trunk/; revision=5272
-rwxr-xr-xbin/emerge24
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