circular_dependency: fix REQUIRED_USE test
authorZac Medico <zmedico@gentoo.org>
Sun, 10 Jul 2011 01:57:50 +0000 (18:57 -0700)
committerZac Medico <zmedico@gentoo.org>
Sun, 10 Jul 2011 01:57:50 +0000 (18:57 -0700)
pym/_emerge/resolver/circular_dependency.py

index cb64962f2b827d1764f4195744a9cba5d68b0e28..e4d679f0fe7774d5752ee5546721bf87fc7b5f9d 100644 (file)
@@ -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: