diff options
author | Sebastian Luther <SebastianLuther@gmx.de> | 2010-08-20 09:24:46 +0200 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2010-08-20 05:15:54 -0700 |
commit | c37423eca2a1284d66737baf83155130e6bf994d (patch) | |
tree | 914ef52509a4e1d8b81f695444158df971b3dfb8 /pym/_emerge | |
parent | e3d17216cc968214617b80d9be1ae5e0351e2e43 (diff) | |
download | portage-c37423eca2a1284d66737baf83155130e6bf994d.tar.gz portage-c37423eca2a1284d66737baf83155130e6bf994d.tar.bz2 portage-c37423eca2a1284d66737baf83155130e6bf994d.zip |
circular dependency handler: Add support for REQUIRED_USE
Diffstat (limited to 'pym/_emerge')
-rw-r--r-- | pym/_emerge/resolver/circular_dependency.py | 44 |
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 |