summaryrefslogtreecommitdiffstats
path: root/bin
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2008-04-27 00:21:24 +0000
committerZac Medico <zmedico@gentoo.org>2008-04-27 00:21:24 +0000
commit065fb3de81a3ab8d8a5a34c2d47dd6fbef69ff1d (patch)
tree5d1638868715cfe37220dc5185e4a752ce6d1b9a /bin
parentadfca70217f237f15d8d0b937f99af6f81c07bb2 (diff)
downloadportage-065fb3de81a3ab8d8a5a34c2d47dd6fbef69ff1d.tar.gz
portage-065fb3de81a3ab8d8a5a34c2d47dd6fbef69ff1d.tar.bz2
portage-065fb3de81a3ab8d8a5a34c2d47dd6fbef69ff1d.zip
Refactor the way that depgraph.altlist(), _complete_graph(), and
validate_blockers() interact with eachother. This simplifies things by eliminating the need for recursive calls to validate_blockers(). (trunk r9977) svn path=/main/branches/2.1.2/; revision=9984
Diffstat (limited to 'bin')
-rwxr-xr-xbin/emerge50
1 files changed, 22 insertions, 28 deletions
diff --git a/bin/emerge b/bin/emerge
index feceb8575..9aba5e6db 100755
--- a/bin/emerge
+++ b/bin/emerge
@@ -2706,10 +2706,9 @@ class depgraph(object):
missing += 1
print "Missing binary for:",xs[2]
- if not self._complete_graph():
- return False, myfavorites
-
- if not self.validate_blockers():
+ try:
+ self.altlist()
+ except self._unknown_internal_error:
return False, myfavorites
# We're true here unless we are missing binaries.
@@ -3379,25 +3378,6 @@ class depgraph(object):
if not self.blocker_parents[blocker]:
del self.blocker_parents[blocker]
- # This checks whether or not it's possible to resolve blocker
- # conflicts that depend on installation order or require
- # uninstallation of a currently installed package. Note that
- # this can lead to the current method being called recursively
- # if changes to the dependency graph are required.
- try:
- self.altlist()
- except self._unknown_internal_error:
- return False
-
- if self._slot_collision_info:
- # The user is only notified of a slot collision if there are no
- # unresolvable blocks.
- for x in self.altlist():
- if x[0] == "blocks":
- self._slot_collision_info.clear()
- return True
- if not self._accept_collisions():
- return False
return True
def _accept_collisions(self):
@@ -3422,6 +3402,7 @@ class depgraph(object):
def altlist(self, reversed=False):
while self._serialized_tasks_cache is None:
+ self._resolve_conflicts()
try:
self._serialized_tasks_cache = self._serialize_tasks()
except self._serialize_tasks_retry:
@@ -3432,6 +3413,13 @@ class depgraph(object):
retlist.reverse()
return retlist
+ def _resolve_conflicts(self):
+ if not self._complete_graph():
+ raise self._unknown_internal_error()
+
+ if not self.validate_blockers():
+ raise self._unknown_internal_error()
+
def _serialize_tasks(self):
mygraph=self.digraph.copy()
# Prune "nomerge" root nodes if nothing depends on them, since
@@ -3851,10 +3839,6 @@ class depgraph(object):
not complete and \
not myblocker_parents:
self.myparams.add("complete")
- if not self._complete_graph():
- raise self._unknown_internal_error("")
- if not self.validate_blockers():
- raise self._unknown_internal_error("")
raise self._serialize_tasks_retry("")
return retlist
@@ -4525,7 +4509,17 @@ class depgraph(object):
to ensure that the user is notified of problems with the graph.
"""
- self._show_slot_collision_notice()
+ task_list = self.altlist()
+
+ # Any blockers must be appended to the tail of the list,
+ # so we only need to check the last item.
+ have_blocker_conflict = \
+ bool(task_list and task_list[-1][0] == "blocks")
+
+ # The user is only notified of a slot conflict if
+ # there are no unresolvable blocker conflicts.
+ if not have_blocker_conflict:
+ self._show_slot_collision_notice()
# TODO: Add generic support for "set problem" handlers so that
# the below warnings aren't special cases for world only.