Implement expansion of catgories in DepcheckCompositeDB.match() for old
authorZac Medico <zmedico@gentoo.org>
Thu, 10 Apr 2008 18:45:28 +0000 (18:45 -0000)
committerZac Medico <zmedico@gentoo.org>
Thu, 10 Apr 2008 18:45:28 +0000 (18:45 -0000)
installed packages that may contain atoms that are not fully qualified.
(trunk r9808)

svn path=/main/branches/2.1.2/; revision=9813

bin/emerge

index 575a03d5312dac12b795ac7a75144bffc98e0691..fa1b4a0f0c9e3c54b70312ff75d696b529b7c6c1 100755 (executable)
@@ -1595,6 +1595,9 @@ class DepcheckCompositeDB(object):
                ret = self._match_cache.get(atom)
                if ret is not None:
                        return ret[:]
+               orig_atom = atom
+               if "/" not in atom:
+                       atom = self._dep_expand(atom)
                pkg, existing = self._depgraph._select_package(self._root, atom)
                if not pkg:
                        ret = []
@@ -1614,9 +1617,47 @@ class DepcheckCompositeDB(object):
                        if ret is None:
                                self._cpv_pkg_map[pkg.cpv] = pkg
                                ret = [pkg.cpv]
-               self._match_cache[atom] = ret
+               self._match_cache[orig_atom] = ret
                return ret[:]
 
+       def _dep_expand(self, atom):
+               """
+               This is only needed for old installed packages that may
+               contain atoms that are not fully qualified with a specific
+               category. Emulate the cpv_expand() function that's used by
+               dbapi.match() in cases like this. If there are multiple
+               matches, it's often due to a new-style virtual that has
+               been added, so try to filter those out to avoid raising
+               a ValueError.
+               """
+               root_config = self._depgraph.roots[self._root]
+               orig_atom = atom
+               expanded_atoms = self._depgraph._dep_expand(root_config, atom)
+               if len(expanded_atoms) > 1:
+                       non_virtual_atoms = []
+                       for x in expanded_atoms:
+                               if not portage.dep_getkey(x).startswith("virtual/"):
+                                       non_virtual_atoms.append(x)
+                       if len(non_virtual_atoms) == 1:
+                               expanded_atoms = non_virtual_atoms
+               if len(expanded_atoms) > 1:
+                       # compatible with portage.cpv_expand()
+                       raise ValueError([portage.dep_getkey(x) \
+                               for x in expanded_atoms])
+               if expanded_atoms:
+                       atom = expanded_atoms[0]
+               else:
+                       null_atom = insert_category_into_atom(atom, "null")
+                       null_cp = portage.dep_getkey(null_atom)
+                       cat, atom_pn = portage.catsplit(null_cp)
+                       virts_p = root_config.settings.get_virts_p().get(atom_pn)
+                       if virts_p:
+                               # Allow the resolver to choose which virtual.
+                               atom = insert_category_into_atom(atom, "virtual")
+                       else:
+                               atom = insert_category_into_atom(atom, "null")
+               return atom
+
        def aux_get(self, cpv, wants):
                metadata = self._cpv_pkg_map[cpv].metadata
                return [metadata.get(x, "") for x in wants]