aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'pym/_emerge/depgraph.py')
-rw-r--r--pym/_emerge/depgraph.py20
1 files changed, 17 insertions, 3 deletions
diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py
index f7ea27c37..ac7ec9d84 100644
--- a/pym/_emerge/depgraph.py
+++ b/pym/_emerge/depgraph.py
@@ -358,6 +358,13 @@ class _rebuild_config(object):
return need_restart
+class _use_changes(tuple):
+ def __new__(cls, new_use, new_changes, required_use_satisfied=True):
+ obj = tuple.__new__(cls, [new_use, new_changes])
+ obj.required_use_satisfied = required_use_satisfied
+ return obj
+
+
class _dynamic_depgraph_config(object):
"""
@@ -6133,22 +6140,25 @@ class depgraph(object):
if new_changes != old_changes:
#Don't do the change if it violates REQUIRED_USE.
+ required_use_satisfied = True
required_use = pkg._metadata.get("REQUIRED_USE")
if required_use and check_required_use(required_use, old_use,
pkg.iuse.is_valid_flag, eapi=pkg.eapi) and \
not check_required_use(required_use, new_use,
pkg.iuse.is_valid_flag, eapi=pkg.eapi):
- return old_use
+ required_use_satisfied = False
if any(x in pkg.use.mask for x in new_changes) or \
any(x in pkg.use.force for x in new_changes):
return old_use
- self._dynamic_config._needed_use_config_changes[pkg] = (new_use, new_changes)
+ changes = _use_changes(new_use, new_changes,
+ required_use_satisfied=required_use_satisfied)
+ self._dynamic_config._needed_use_config_changes[pkg] = changes
backtrack_infos = self._dynamic_config._backtrack_infos
backtrack_infos.setdefault("config", {})
backtrack_infos["config"].setdefault("needed_use_config_changes", [])
- backtrack_infos["config"]["needed_use_config_changes"].append((pkg, (new_use, new_changes)))
+ backtrack_infos["config"]["needed_use_config_changes"].append((pkg, changes))
if want_restart_for_use_change(pkg, new_use):
self._dynamic_config._need_restart = True
return new_use
@@ -9388,6 +9398,10 @@ class depgraph(object):
return self._dynamic_config._need_config_reload
def autounmask_breakage_detected(self):
+ # Check for REQUIRED_USE violations.
+ for changes in self._dynamic_config._needed_use_config_changes.values():
+ if getattr(changes, 'required_use_satisfied', None) is False:
+ return True
try:
for pargs, kwargs in self._dynamic_config._unsatisfied_deps_for_display:
self._show_unsatisfied_dep(