Fix PackageSet.findAtomForPackage() to find the most specific atom since
authorZac Medico <zmedico@gentoo.org>
Fri, 30 May 2008 23:46:08 +0000 (23:46 -0000)
committerZac Medico <zmedico@gentoo.org>
Fri, 30 May 2008 23:46:08 +0000 (23:46 -0000)
it can affect behavior when deciding whether or not to add a slot atom to
the world file.

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

pym/portage/sets/base.py

index 2ae4723fb30c5f0c0942f821e885bed2f865e87f..d9f2a8d91b034a95c553063998f083407ccbb535 100644 (file)
@@ -105,10 +105,19 @@ class PackageSet(object):
                None if there are no matches.  This matches virtual arguments against
                the PROVIDE metadata.  This can raise an InvalidDependString exception
                if an error occurs while parsing PROVIDE."""
-               try:
-                       return self.iterAtomsForPackage(pkg).next()
-               except StopIteration:
-                       return None
+
+               # Atoms matched via PROVIDE must be temporarily transformed since
+               # match_from_list() only works correctly when atom.cp == pkg.cp.
+               rev_transform = {}
+               for atom in self.iterAtomsForPackage(pkg):
+                       if atom.cp == pkg.cp:
+                               rev_transform[atom] = atom
+                       else:
+                               rev_transform[Atom(atom.replace(atom.cp, pkg.cp, 1))] = atom
+               best_match = best_match_to_list(pkg, rev_transform.iterkeys())
+               if best_match:
+                       return rev_transform[best_match]
+               return None
 
        def iterAtomsForPackage(self, pkg):
                """