diff options
author | Zac Medico <zmedico@gentoo.org> | 2012-10-26 00:43:20 -0700 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2012-10-26 00:43:20 -0700 |
commit | 222dfa56e8fb311f4bea54012bdfd5d1a474d56c (patch) | |
tree | d393e941291ceaf2595ef68948734ff35a3ef596 /pym/_emerge/depgraph.py | |
parent | 287636c98ca6841601372d32fb7c66ffdad9eaae (diff) | |
download | portage-222dfa56e8fb311f4bea54012bdfd5d1a474d56c.tar.gz portage-222dfa56e8fb311f4bea54012bdfd5d1a474d56c.tar.bz2 portage-222dfa56e8fb311f4bea54012bdfd5d1a474d56c.zip |
backtracking: discard extra rebuilds, bug #439688
Diffstat (limited to 'pym/_emerge/depgraph.py')
-rw-r--r-- | pym/_emerge/depgraph.py | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py index e129a810d..fd5dfe806 100644 --- a/pym/_emerge/depgraph.py +++ b/pym/_emerge/depgraph.py @@ -415,6 +415,7 @@ class _dynamic_depgraph_config(object): self._needed_use_config_changes = backtrack_parameters.needed_use_config_changes self._runtime_pkg_mask = backtrack_parameters.runtime_pkg_mask self._slot_operator_replace_installed = backtrack_parameters.slot_operator_replace_installed + self._prune_rebuilds = backtrack_parameters.prune_rebuilds self._need_restart = False # For conditions that always require user intervention, such as # unsatisfied REQUIRED_USE (currently has no autounmask support). @@ -633,7 +634,7 @@ class depgraph(object): line = colorize("INFORM", line) writemsg(line + "\n", noiselevel=-1) - def _show_missed_update(self): + def _get_missed_updates(self): # In order to minimize noise, show only the highest # missed update from each SLOT. @@ -659,6 +660,12 @@ class depgraph(object): missed_updates[k] = (pkg, mask_type, parent_atoms) break + return missed_updates + + def _show_missed_update(self): + + missed_updates = self._get_missed_updates() + if not missed_updates: return @@ -2737,6 +2744,23 @@ class depgraph(object): self.need_restart(): return False, myfavorites + if not self._dynamic_config._prune_rebuilds and \ + self._dynamic_config._slot_operator_replace_installed and \ + self._get_missed_updates(): + # When there are missed updates, we might have triggered + # some unnecessary rebuilds (see bug #439688). So, prune + # all the rebuilds and backtrack with the problematic + # updates masked. The next backtrack run should pull in + # any rebuilds that are really needed, and this + # prune_rebuilds path should never be entered more than + # once in a series of backtracking nodes (in order to + # avoid a backtracking loop). + backtrack_infos = self._dynamic_config._backtrack_infos + config = backtrack_infos.setdefault("config", {}) + config["prune_rebuilds"] = True + self._dynamic_config._need_restart = True + return False, myfavorites + # Any failures except those due to autounmask *alone* should return # before this point, since the success_without_autounmask flag that's # set below is reserved for cases where there are *zero* other |