summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2010-11-26 22:18:05 -0800
committerZac Medico <zmedico@gentoo.org>2010-11-26 22:18:05 -0800
commitd3fcffbaa52bd5294e06645d134c39ec8e3b8f41 (patch)
tree75e47388df5cf3ab8aca8faa7f6e1d173deec95c
parent5e1efba49c8c0c425c6a06dc03b562ef9d890bde (diff)
downloadportage-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.py46
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'.