diff options
author | Zac Medico <zmedico@gentoo.org> | 2010-11-26 22:18:05 -0800 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2010-11-26 22:18:05 -0800 |
commit | d3fcffbaa52bd5294e06645d134c39ec8e3b8f41 (patch) | |
tree | 75e47388df5cf3ab8aca8faa7f6e1d173deec95c | |
parent | 5e1efba49c8c0c425c6a06dc03b562ef9d890bde (diff) | |
download | portage-d3fcffbaa52bd5294e06645d134c39ec8e3b8f41.tar.gz portage-d3fcffbaa52bd5294e06645d134c39ec8e3b8f41.tar.bz2 portage-d3fcffbaa52bd5294e06645d134c39ec8e3b8f41.zip |
depgraph: tweak USE match logic for bug 345979
This should fix handling of some corner cases in which use.force
or use.mask might not have been handled correctly, and removes some
redundant IUSE related checks.
-rw-r--r-- | pym/_emerge/depgraph.py | 46 |
1 files changed, 25 insertions, 21 deletions
diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py index 49e5db2b9..e2d16453e 100644 --- a/pym/_emerge/depgraph.py +++ b/pym/_emerge/depgraph.py @@ -2981,37 +2981,41 @@ class depgraph(object): else: use = self._pkg_use_enabled(pkg) + use_match = True + can_adjust_use = not pkg.built + if atom.use.enabled: need_enabled = atom.use.enabled.difference(use) if need_enabled: need_enabled = need_enabled.difference( atom.use.missing_enabled.difference(pkg.iuse.all)) if need_enabled: - if not pkg.built: - if not pkg.use.mask.intersection(need_enabled): - # Be careful about masked flags, since they - # typically aren't adjustable by the user. - packages_with_invalid_use_config.append(pkg) - continue + use_match = False + if can_adjust_use: + if pkg.use.mask.intersection(need_enabled): + can_adjust_use = False if atom.use.disabled: need_disabled = atom.use.disabled.intersection(use) if need_disabled: - if not pkg.built: - if not pkg.use.force.difference( - pkg.use.mask).intersection(need_disabled): - # Be careful about forced flags, since they - # typically aren't adjustable by the user. - packages_with_invalid_use_config.append(pkg) - continue - - need_disabled = atom.use.disabled.difference( - pkg.iuse.all).difference(atom.use.missing_disabled) - if need_disabled: - # Don't add this to packages_with_invalid_use_config - # since missing_disabled indicates an IUSE issue, and - # IUSE cannot be adjusted by the user. - continue + need_disabled = need_disabled.difference( + atom.use.missing_disabled.difference(pkg.iuse.all)) + if need_disabled: + use_match = False + if can_adjust_use: + if pkg.use.force.difference( + pkg.use.mask).intersection(need_disabled): + can_adjust_use = False + + if can_adjust_use: + # Above we must ensure that this package has + # absolutely no use.force, use.mask, or IUSE + # issues that the user typically can't make + # adjustments to solve (see bug #345979). + packages_with_invalid_use_config.append(pkg) + + if not use_match: + continue elif atom.unevaluated_atom.use: #Make sure we don't miss a 'missing IUSE'. |