diff options
author | Zac Medico <zmedico@gentoo.org> | 2009-07-04 05:32:59 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2009-07-04 05:32:59 +0000 |
commit | 88462b25ff80d247984319eb93d7d41fb5299874 (patch) | |
tree | 819b71c1ba491b8bde36645a72f28b263a03a916 /pym/_emerge/actions.py | |
parent | e1a2a0fdc08dc1deb019baf2fa98e1a133830e9a (diff) | |
download | portage-88462b25ff80d247984319eb93d7d41fb5299874.tar.gz portage-88462b25ff80d247984319eb93d7d41fb5299874.tar.bz2 portage-88462b25ff80d247984319eb93d7d41fb5299874.zip |
Bug #275217 - Part 5 - When a slot conflict occurs, mask the first package
that got pulled in and restart the calculation. Thanks to Sebastian Mingramm
(few) <s.mingramm@gmx.de> for the initial patch which I added some additional
features to:
* display message about missed updates
* cache frozen_config instance, to optimize performance
* disable backtracking if it fails, fall back to a normal
dep calculation + error message.
svn path=/main/trunk/; revision=13769
Diffstat (limited to 'pym/_emerge/actions.py')
-rw-r--r-- | pym/_emerge/actions.py | 54 |
1 files changed, 39 insertions, 15 deletions
diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py index 9213211a0..85a8170ff 100644 --- a/pym/_emerge/actions.py +++ b/pym/_emerge/actions.py @@ -40,7 +40,7 @@ from _emerge.clear_caches import clear_caches from _emerge.countdown import countdown from _emerge.create_depgraph_params import create_depgraph_params from _emerge.Dependency import Dependency -from _emerge.depgraph import depgraph, resume_depgraph +from _emerge.depgraph import depgraph, resume_depgraph, _frozen_depgraph_config from _emerge.DepPrioritySatisfiedRange import DepPrioritySatisfiedRange from _emerge.emergelog import emergelog from _emerge.is_valid_package_atom import is_valid_package_atom @@ -297,25 +297,49 @@ def action_build(settings, trees, mtimedb, print darkgreen("emerge: It seems we have nothing to resume...") return os.EX_OK - myparams = create_depgraph_params(myopts, myaction) if "--quiet" not in myopts and "--nodeps" not in myopts: print "Calculating dependencies ", sys.stdout.flush() - mydepgraph = depgraph(settings, trees, myopts, myparams, spinner) - try: - retval, favorites = mydepgraph.select_files(myfiles) - except portage.exception.PackageNotFound, e: - portage.writemsg("\n!!! %s\n" % str(e), noiselevel=-1) - return 1 - except portage.exception.PackageSetNotFound, e: - root_config = trees[settings["ROOT"]]["root_config"] - display_missing_pkg_set(root_config, e.value) - return 1 + + runtime_pkg_mask = None + allow_backtracking = True + backtracked = False + frozen_config = _frozen_depgraph_config(settings, trees, + myopts, spinner) + myparams = create_depgraph_params(myopts, myaction) + while True: + mydepgraph = depgraph(settings, trees, myopts, myparams, spinner, + frozen_config=frozen_config, + allow_backtracking=allow_backtracking, + runtime_pkg_mask=runtime_pkg_mask) + try: + retval, favorites = mydepgraph.select_files(myfiles) + except portage.exception.PackageNotFound, e: + portage.writemsg("\n!!! %s\n" % str(e), noiselevel=-1) + return 1 + except portage.exception.PackageSetNotFound, e: + root_config = trees[settings["ROOT"]]["root_config"] + display_missing_pkg_set(root_config, e.value) + return 1 + if not retval: + if mydepgraph.need_restart(): + runtime_pkg_mask = mydepgraph.get_runtime_pkg_mask() + backtracked = True + elif backtracked and allow_backtracking: + # Backtracking failed, so disable it and do + # a plain dep calculation + error message. + allow_backtracking = False + runtime_pkg_mask = None + else: + mydepgraph.display_problems() + return 1 + else: + break + + del frozen_config + if show_spinner: print "\b\b... done!" - if not retval: - mydepgraph.display_problems() - return 1 if "--pretend" not in myopts and \ ("--ask" in myopts or "--tree" in myopts or \ |