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

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

bin/emerge

index ef970e4cf692de6a578be9a8cd97f528af7991f0..72955612f0ef7afb0f4505307446e686c7fc0d03 100755 (executable)
@@ -818,10 +818,19 @@ class InternalPackageSet(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[portage_dep.Atom(atom.replace(atom.cp, pkg.cp, 1))] = atom
+               best_match = portage.best_match_to_list(pkg, rev_transform.iterkeys())
+               if best_match:
+                       return rev_transform[best_match]
+               return None
 
        def iterAtomsForPackage(self, pkg):
                """