summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2011-07-09 18:57:50 -0700
committerZac Medico <zmedico@gentoo.org>2011-07-09 18:57:50 -0700
commit05a8d3512c5880d45f2e44b95127c2cac676be9d (patch)
tree118b55474038bc62f19d5c9d00ac158e1b2ec237
parent58766559735c0d643bf1a9e5f2979ec6548fff94 (diff)
downloadportage-05a8d3512c5880d45f2e44b95127c2cac676be9d.tar.gz
portage-05a8d3512c5880d45f2e44b95127c2cac676be9d.tar.bz2
portage-05a8d3512c5880d45f2e44b95127c2cac676be9d.zip
circular_dependency: fix REQUIRED_USE test
-rw-r--r--pym/_emerge/resolver/circular_dependency.py17
1 files changed, 17 insertions, 0 deletions
diff --git a/pym/_emerge/resolver/circular_dependency.py b/pym/_emerge/resolver/circular_dependency.py
index cb64962f2..e4d679f0f 100644
--- a/pym/_emerge/resolver/circular_dependency.py
+++ b/pym/_emerge/resolver/circular_dependency.py
@@ -138,7 +138,24 @@ class circular_dependency_handler(object):
usemask, useforce = self._get_use_mask_and_force(parent)
autounmask_changes = self._get_autounmask_changes(parent)
untouchable_flags = frozenset(chain(usemask, useforce, autounmask_changes))
+
affecting_use.difference_update(untouchable_flags)
+
+ #If any of the flags we're going to touch is in REQUIRED_USE, add all
+ #other flags in REQUIRED_USE to affecting_use, to not lose any solution.
+ required_use_flags = get_required_use_flags(parent.metadata["REQUIRED_USE"])
+
+ if affecting_use.intersection(required_use_flags):
+ # TODO: Find out exactly which REQUIRED_USE flags are
+ # entangled with affecting_use. We have to limit the
+ # number of flags since the number of loops is
+ # exponentially related (see bug #374397).
+ total_flags = set()
+ total_flags.update(affecting_use, required_use_flags)
+ if len(total_flags) <= 10:
+ affecting_use.update(required_use_flags)
+ affecting_use.difference_update(untouchable_flags)
+
affecting_use = tuple(affecting_use)
if not affecting_use: