From d06268eafbfeff29343aa6665bd8b87f0cf887fe Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Thu, 29 May 2008 21:19:48 +0000 Subject: Make --skipfirst handle missing dependencies by dropping the merge tasks that have missing dependencies. This involves creating an entirely new depgraph each time that a missing dependency is discovered. This isn't the most efficient approach but it's simple and it works well. This new behavior can server as a fix for bug #12768 by calling emerge --resume --skipfirst each time that emerge exits unsuccessfully. This was possible before, but now packages with unsatisfied dependencies will be properly identified and dropped from the list. (trunk r10477:10482) svn path=/main/branches/2.1.2/; revision=10483 --- bin/emerge | 60 ++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 12 deletions(-) (limited to 'bin/emerge') diff --git a/bin/emerge b/bin/emerge index 0ece52862..87e2366a5 100755 --- a/bin/emerge +++ b/bin/emerge @@ -5351,13 +5351,6 @@ class depgraph(object): if not isinstance(mergelist, list): mergelist = [] - if mergelist and "--skipfirst" in self.myopts: - for i, task in enumerate(mergelist): - if isinstance(task, list) and \ - task and task[-1] == "merge": - del mergelist[i] - break - fakedb = self.mydbapi trees = self.trees serialized_tasks = [] @@ -8291,11 +8284,43 @@ def action_build(settings, trees, mtimedb, if show_spinner: print "Calculating dependencies ", myparams = create_depgraph_params(myopts, myaction) - mydepgraph = depgraph(settings, trees, - myopts, myparams, spinner) + + resume_data = mtimedb["resume"] + mergelist = resume_data["mergelist"] + if mergelist and "--skipfirst" in myopts: + for i, task in enumerate(mergelist): + if isinstance(task, list) and \ + task and task[-1] == "merge": + del mergelist[i] + break + + dropped_tasks = set() + success = False try: - success = mydepgraph.loadResumeCommand(mtimedb["resume"]) + while True: + mydepgraph = depgraph(settings, trees, + myopts, myparams, spinner) + try: + success = mydepgraph.loadResumeCommand(mtimedb["resume"]) + except depgraph.UnsatisfiedResumeDep, e: + if "--skipfirst" not in myopts: + raise + unsatisfied_parents = set(dep.parent for dep in e.value) + pruned_mergelist = [] + for task in mergelist: + if isinstance(task, list) and \ + tuple(task) in unsatisfied_parents: + continue + pruned_mergelist.append(task) + if not pruned_mergelist: + raise + mergelist[:] = pruned_mergelist + dropped_tasks.update(unsatisfied_parents) + del e, unsatisfied_parents + continue + else: + break except (portage_exception.PackageNotFound, mydepgraph.UnsatisfiedResumeDep), e: if show_spinner: @@ -8329,7 +8354,9 @@ def action_build(settings, trees, mtimedb, msg = "The resume list contains packages " + \ "with dependencies that have not been " + \ "installed yet. Please restart/continue " + \ - "the operation manually." + "the operation manually, or use --skipfirst " + \ + "to skip the first package in the list and " + \ + "any other packages that may have missing dependencies." for line in wrap(msg, 72): out.eerror(line) elif isinstance(e, portage_exception.PackageNotFound): @@ -8346,7 +8373,16 @@ def action_build(settings, trees, mtimedb, if show_spinner: print "\b\b... done!" - if not success: + if success: + if dropped_tasks: + portage.writemsg("!!! One or more packages have been " + \ + "dropped due to unsatisfied dependencies:\n\n", + noiselevel=-1) + for task in dropped_tasks: + portage.writemsg(" " + str(task) + "\n", noiselevel=-1) + portage.writemsg("\n", noiselevel=-1) + del dropped_tasks + else: mydepgraph.display_problems() if not (ask or pretend): # delete the current list and also the backup -- cgit v1.2.3-1-g7c22