Bug #334365 - Fix depgraph._wrapped_select_pkg_highest_available_imp()
authorZac Medico <zmedico@gentoo.org>
Thu, 26 Aug 2010 04:50:51 +0000 (21:50 -0700)
committerZac Medico <zmedico@gentoo.org>
Thu, 26 Aug 2010 04:50:51 +0000 (21:50 -0700)
to avoid invalid or masked installed packages when necessary. This is
especially important for invalid packages since they need be replaced
so that their dependencies can be parsed for --depclean operations.

pym/_emerge/depgraph.py

index 435cc1a981249a918e2e00c2be4b93e12bae659d..f933378aaff1a514353072a7b8318d7d966d3570 100644 (file)
@@ -2624,10 +2624,21 @@ class depgraph(object):
                                        # Make --noreplace take precedence over --newuse.
                                        if not pkg.installed and noreplace and \
                                                cpv in vardb.match(atom):
-                                               # If the installed version is masked, it may
-                                               # be necessary to look at lower versions,
-                                               # in case there is a visible downgrade.
-                                               continue
+                                               inst_pkg = self._pkg(pkg.cpv, "installed",
+                                                       root_config, installed=True)
+                                               mreasons = None
+                                               if not inst_pkg.invalid:
+                                                       mreasons = _get_masking_status(inst_pkg,
+                                                               pkgsettings, root_config,
+                                                               use=self._pkg_use_enabled(inst_pkg))
+                                                       if mreasons and len(mreasons) == 1 and \
+                                                               mreasons[0].category  == 'KEYWORDS':
+                                                               mreasons = None
+                                               if not inst_pkg.invalid and not mreasons:
+                                                       # If the installed version is masked, it may
+                                                       # be necessary to look at lower versions,
+                                                       # in case there is a visible downgrade.
+                                                       continue
                                        reinstall_for_flags = None
 
                                        if not pkg.installed or \
@@ -2890,6 +2901,11 @@ class depgraph(object):
                                                        built_timestamp != installed_timestamp:
                                                        return built_pkg, existing_node
 
+                       for pkg in matched_packages:
+                               if pkg.installed and pkg.invalid:
+                                       matched_packages = [x for x in \
+                                               matched_packages if x is not pkg]
+
                        if avoid_update:
                                for pkg in matched_packages:
                                        if pkg.installed and self._pkg_visibility_check(pkg, \