summaryrefslogtreecommitdiffstats
path: root/pym/_emerge/resolver/circular_dependency.py
diff options
context:
space:
mode:
authorSebastian Luther <SebastianLuther@gmx.de>2010-08-20 09:24:46 +0200
committerZac Medico <zmedico@gentoo.org>2010-08-20 05:15:54 -0700
commitc37423eca2a1284d66737baf83155130e6bf994d (patch)
tree914ef52509a4e1d8b81f695444158df971b3dfb8 /pym/_emerge/resolver/circular_dependency.py
parente3d17216cc968214617b80d9be1ae5e0351e2e43 (diff)
downloadportage-c37423eca2a1284d66737baf83155130e6bf994d.tar.gz
portage-c37423eca2a1284d66737baf83155130e6bf994d.tar.bz2
portage-c37423eca2a1284d66737baf83155130e6bf994d.zip
circular dependency handler: Add support for REQUIRED_USE
Diffstat (limited to 'pym/_emerge/resolver/circular_dependency.py')
-rw-r--r--pym/_emerge/resolver/circular_dependency.py44
1 files changed, 31 insertions, 13 deletions
diff --git a/pym/_emerge/resolver/circular_dependency.py b/pym/_emerge/resolver/circular_dependency.py
index 5029a7050..dbb1adf49 100644
--- a/pym/_emerge/resolver/circular_dependency.py
+++ b/pym/_emerge/resolver/circular_dependency.py
@@ -3,8 +3,10 @@
from __future__ import print_function
+from itertools import chain
+
from portage.util import writemsg
-from portage.dep import use_reduce, extract_affecting_use
+from portage.dep import use_reduce, extract_affecting_use, check_required_use, get_required_use_flags
from portage.output import colorize
from _emerge.DepPrioritySatisfiedRange import DepPrioritySatisfiedRange
@@ -118,9 +120,21 @@ class circular_dependency_handler(object):
# Make sure we don't want to change a flag that is
# a) in use.mask or use.force
# b) changed by autounmask
+
usemask, useforce = self._get_use_mask_and_force(parent)
autounmask_changes = self._get_autounmask_changes(parent)
- affecting_use.difference_update(usemask, useforce, autounmask_changes)
+ 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):
+ affecting_use.update(required_use_flags)
+ affecting_use.difference_update(untouchable_flags)
+
affecting_use = tuple(affecting_use)
if not affecting_use:
@@ -160,17 +174,21 @@ class circular_dependency_handler(object):
uselist=current_use, flat=True)
if parent_atom not in reduced_dep:
- #we found a valid solution
- solution = set()
- use = self.depgraph._pkg_use_enabled(parent)
- for flag, state in zip(affecting_use, use_state):
- if state == "enabled" and \
- flag not in use:
- solution.add((flag, True))
- elif state == "disabled" and \
- flag in use:
- solution.add((flag, False))
- solutions.add(frozenset(solution))
+ #We found an assignment that removes the atom from 'dep'.
+ #Make sure it doesn't conflict with REQUIRED_USE.
+ required_use = parent.metadata["REQUIRED_USE"]
+
+ if check_required_use(required_use, current_use, parent.iuse.is_valid_flag):
+ use = self.depgraph._pkg_use_enabled(parent)
+ solution = set()
+ for flag, state in zip(affecting_use, use_state):
+ if state == "enabled" and \
+ flag not in use:
+ solution.add((flag, True))
+ elif state == "disabled" and \
+ flag in use:
+ solution.add((flag, False))
+ solutions.add(frozenset(solution))
if not _next_use_state(use_state):
break