Inside depgraph.validate_blockers(), prevent false positives in PROVIDE
authorZac Medico <zmedico@gentoo.org>
Sun, 29 Mar 2009 22:26:53 +0000 (22:26 -0000)
committerZac Medico <zmedico@gentoo.org>
Sun, 29 Mar 2009 22:26:53 +0000 (22:26 -0000)
virtual blocker matches that can occur for packages for packages that don't
actual have the appropriate value in PROVIDE (triggered by profile 'virtuals'
settings). Thanks to Ned Ludd <solar@g.o> for reporting.

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

pym/_emerge/__init__.py

index 0a0ab3414dff23ffcb92d4a40feb178262877c56..4fa46dbc1cd4eedd59c6a0dc98c7407664f9c38c 100644 (file)
@@ -6754,10 +6754,15 @@ class depgraph(object):
                        final_db = self.mydbapi[myroot]
                        
                        provider_virtual = False
-                       if blocker.cp in virtuals and \
+                       if blocker.cp.startswith('virtual/') and \
                                not self._have_new_virt(blocker.root, blocker.cp):
                                provider_virtual = True
 
+                       # Use this to check PROVIDE for each matched package
+                       # when necessary.
+                       atom_set = InternalPackageSet(
+                               initial_atoms=[blocker.atom])
+
                        if provider_virtual:
                                atoms = []
                                for provider_entry in virtuals[blocker.cp]:
@@ -6768,13 +6773,17 @@ class depgraph(object):
                        else:
                                atoms = [blocker.atom]
 
-                       blocked_initial = []
+                       blocked_initial = set()
                        for atom in atoms:
-                               blocked_initial.extend(initial_db.match_pkgs(atom))
+                               for pkg in initial_db.match_pkgs(atom):
+                                       if atom_set.findAtomForPackage(pkg):
+                                               blocked_initial.add(pkg)
 
-                       blocked_final = []
+                       blocked_final = set()
                        for atom in atoms:
-                               blocked_final.extend(final_db.match_pkgs(atom))
+                               for pkg in final_db.match_pkgs(atom):
+                                       if atom_set.findAtomForPackage(pkg):
+                                               blocked_final.add(pkg)
 
                        if not blocked_initial and not blocked_final:
                                parent_pkgs = self._blocker_parents.parent_nodes(blocker)