Fix the CompositDbapi.match() logic wrt "selective" behavior and installed
authorZac Medico <zmedico@gentoo.org>
Sun, 6 Apr 2008 18:53:21 +0000 (18:53 -0000)
committerZac Medico <zmedico@gentoo.org>
Sun, 6 Apr 2008 18:53:21 +0000 (18:53 -0000)
packages so that it correctly handles false argument matches due to PROVIDE
when a corresponding new-style virtual exists.

svn path=/main/trunk/; revision=9729

pym/_emerge/__init__.py

index f40cf46cc5227b9478f0a84c604463c47fbafa2e..53f09e8d0ce9cfcffe6a85f4ee5a9632dcdd7915 100644 (file)
@@ -1443,13 +1443,22 @@ class CompositeDbapi(object):
                else:
                        if pkg.installed and "selective" not in self._depgraph.myparams:
                                try:
-                                       self._depgraph._iter_args_for_pkg(pkg).next()
-                               except StopIteration:
-                                       pass
+                                       args = list(self._depgraph._iter_args_for_pkg(pkg))
                                except portage.exception.InvalidDependString:
-                                       pass
-                               else:
-                                       ret = []
+                                       args = []
+                               for arg in args:
+                                       arg_cp = portage.dep_getkey(arg.atom)
+                                       if arg and arg_cp != pkg.cp:
+                                               # If this argument matches via PROVIDE but there is a
+                                               # new-style virtual available, then the argument does
+                                               # not really apply to this package.
+                                               virt_pkg, virt_existing = \
+                                                       self._depgraph._select_package(self._root, arg_cp)
+                                               if virt_pkg and virt_pkg.cp == arg_cp:
+                                                       arg = None
+                                       if arg:
+                                               ret = []
+                                               break
                        if ret is None:
                                self._cpv_tree_map[pkg.cpv] = \
                                        self._depgraph.pkg_tree_map[pkg.type_name]