Fix a regression caused by the code from bug #278729, which causes incorrect
authorZac Medico <zmedico@gentoo.org>
Tue, 4 Aug 2009 06:18:13 +0000 (06:18 -0000)
committerZac Medico <zmedico@gentoo.org>
Tue, 4 Aug 2009 06:18:13 +0000 (06:18 -0000)
preference evaluation for cases like kde-base/nepomuk:
  || (
    >=dev-libs/soprano-2.3.0[clucene,dbus,raptor,redland]
    >=dev-libs/soprano-2.3.0[clucene,dbus,raptor,java]
  )

In cases like this we need to prefer the choice which is already satisfied
by current USE configuration. Thanks to Maciej Mrozowski <reavertm@poczta.fm>
for reporting.

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

pym/portage/__init__.py

index a327bd6449de81def1756d717c0b97905a542deb..6f79a5540ec9ec8d7b87ddc40898c50e61bca1da 100644 (file)
@@ -7138,6 +7138,7 @@ def dep_zapdeps(unreduced, reduced, myroot, use_binaries=0, trees=None):
                        continue
 
                all_available = True
+               all_use_satisfied = True
                versions = {}
                for atom in atoms:
                        if atom[:1] == "!":
@@ -7153,9 +7154,21 @@ def dep_zapdeps(unreduced, reduced, myroot, use_binaries=0, trees=None):
                                all_available = False
                                break
 
+                       if atom.use:
+                               avail_pkg_use = mydbapi.match(atom)
+                               if not avail_pkg_use:
+                                       all_use_satisfied = False
+                               else:
+                                       # highest (ascending order)
+                                       avail_pkg_use = avail_pkg_use[-1]
+                                       if avail_pkg_use != avail_pkg:
+                                               avail_pkg = avail_pkg_use
+                                               avail_slot = "%s:%s" % (dep_getkey(atom),
+                                                       mydbapi.aux_get(avail_pkg, ["SLOT"])[0])
+
                        versions[avail_slot] = avail_pkg
 
-               this_choice = (atoms, versions, all_available)
+               this_choice = (atoms, versions, all_available, all_use_satisfied)
                if all_available:
                        # The "all installed" criterion is not version or slot specific.
                        # If any version of a package is already in the graph then we
@@ -7229,9 +7242,12 @@ def dep_zapdeps(unreduced, reduced, myroot, use_binaries=0, trees=None):
                preferred_any_slot + preferred_non_installed + other
 
        for allow_masked in (False, True):
-               for atoms, versions, all_available in preferred:
-                       if all_available or allow_masked:
-                               return atoms
+               for allow_unsatisfied_use in (False, True):
+                       for atoms, versions, all_available, all_use_satisfied in preferred:
+                               if all_use_satisfied or \
+                                       (all_available and allow_unsatisfied_use) \
+                                       or allow_masked:
+                                       return atoms
 
        assert(False) # This point should not be reachable