From dcaa4698402c5202947d1f7512683325bd76c943 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Wed, 28 May 2008 08:31:06 +0000 Subject: Bug #223447 - Adjust the "installed packages are masked" display to recognize packages that are masked by keywords and are eligible for uninstallation by depclean. This is a workaround for the fact that depclean may fail to recognize that the package is eligible for uninstall due to differences in visibility filtering which can lead to differences in || dep evaluation. TODO: Share visibility code to fix this inconsistency. svn path=/main/trunk/; revision=10465 --- pym/_emerge/__init__.py | 53 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 9 deletions(-) (limited to 'pym/_emerge') diff --git a/pym/_emerge/__init__.py b/pym/_emerge/__init__.py index f5a94221a..61141d675 100644 --- a/pym/_emerge/__init__.py +++ b/pym/_emerge/__init__.py @@ -1990,7 +1990,7 @@ class depgraph(object): self._displayed_list = None self._pprovided_args = [] self._missing_args = [] - self._masked_installed = [] + self._masked_installed = set() self._unsatisfied_deps_for_display = [] self._unsatisfied_blockers_for_display = None self._circular_deps_for_display = None @@ -2299,12 +2299,6 @@ class depgraph(object): del e return 0 - if pkg.installed: - # Warn if an installed package is masked and it - # is pulled into the graph. - if not visible(pkgsettings, pkg): - self._masked_installed.append((pkg, pkgsettings)) - if args: self._set_nodes.add(pkg) @@ -3424,11 +3418,51 @@ class depgraph(object): portdb = self.trees[myroot]["porttree"].dbapi pkgsettings = self.pkgsettings[myroot] final_db = self.mydbapi[myroot] + + graph_complete_for_root = "complete" in self.myparams or \ + (myroot == self.target_root and \ + ("deep" in self.myparams or "empty" in self.myparams) and \ + not self._required_set_names.difference(self._sets)) + blocker_cache = BlockerCache(myroot, vardb) stale_cache = set(blocker_cache) for pkg in vardb: cpv = pkg.cpv stale_cache.discard(cpv) + + # Check for masked installed packages. For keyword + # mask there are a couple of common cases that are + # likely to generate unwanted noise: + # + # * Packages missing /var/db/pkg/*/*/KEYWORDS entries + # due to having been installed by an old version of + # portage. + # + # * Packages installed by overriding ACCEPT_KEYWORDS + # via the environment. + # + # To avoid unwanted noise, only warn about keyword + # masks if all of the following are true: + # + # * KEYWORDS is not empty (not installed by old portage). + # + # * The graph is complete and the package has not been + # pulled into the dependency graph. It's eligible for + # depclean, but depclean may fail to recognize it as + # such due to differences in visibility filtering which + # can lead to differences in || dep evaluation. + # TODO: Share visibility code to fix this inconsistency. + + if pkg in final_db: + if not visible(pkgsettings, pkg): + self._masked_installed.add(pkg) + elif graph_complete_for_root and \ + pkgsettings.getMissingKeywords( + pkg.cpv, pkg.metadata) and \ + pkg.metadata["KEYWORDS"].split() and \ + not self.digraph.contains(pkg): + self._masked_installed.add(pkg) + blocker_atoms = None blockers = None if self.digraph.contains(pkg): @@ -5088,8 +5122,9 @@ class depgraph(object): sys.stderr.write("".join(msg)) masked_packages = [] - for pkg, pkgsettings in self._masked_installed: - root_config = self.roots[pkg.root] + for pkg in self._masked_installed: + root_config = pkg.root_config + pkgsettings = root_config.settings mreasons = get_masking_status(pkg, pkgsettings, root_config) masked_packages.append((root_config, pkgsettings, pkg.cpv, pkg.metadata, mreasons)) -- cgit v1.2.3-1-g7c22