From d3fcffbaa52bd5294e06645d134c39ec8e3b8f41 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Fri, 26 Nov 2010 22:18:05 -0800 Subject: 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. --- pym/_emerge/depgraph.py | 46 +++++++++++++++++++++++++--------------------- 1 file 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'. -- cgit v1.2.3-1-g7c22