summaryrefslogtreecommitdiffstats
path: root/bin/emerge
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2008-04-10 18:45:28 +0000
committerZac Medico <zmedico@gentoo.org>2008-04-10 18:45:28 +0000
commitb4d2eb267b352b98041a8cb847b897ec27738d08 (patch)
treedec88fbb0640d430bf24f0c175e02085a99483b3 /bin/emerge
parent9007d72fee8d482db501032559fe4eb593f95fd9 (diff)
downloadportage-b4d2eb267b352b98041a8cb847b897ec27738d08.tar.gz
portage-b4d2eb267b352b98041a8cb847b897ec27738d08.tar.bz2
portage-b4d2eb267b352b98041a8cb847b897ec27738d08.zip
Implement expansion of catgories in DepcheckCompositeDB.match() for old
installed packages that may contain atoms that are not fully qualified. (trunk r9808) svn path=/main/branches/2.1.2/; revision=9813
Diffstat (limited to 'bin/emerge')
-rwxr-xr-xbin/emerge43
1 files changed, 42 insertions, 1 deletions
diff --git a/bin/emerge b/bin/emerge
index 575a03d53..fa1b4a0f0 100755
--- a/bin/emerge
+++ b/bin/emerge
@@ -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]