[Yum-devel] [PATCH 2/2] Fix the previous testcase, by:

James Antill james at and.org
Wed Aug 5 21:40:21 UTC 2009


1. We always call into _compare_providers(), don't rely on
NewestByNameArch to get the same result.

2. Filter out nevra's, using repo comparison.

...this should fix the weird ncurses-lib problem, however the previous
testcase doesn't model that exactly (it just shows a "problem" that if
fixed will fix it).
 Also the #1 part of the fix probably isn't needed for real life, but is
to fix the testcase because of the way the unittests use one repo. with
packages from multiple repos. (without using MetaSack).
---
 yum/depsolve.py |   32 ++++++++++++++++++++------------
 1 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/yum/depsolve.py b/yum/depsolve.py
index dc9b388..d6b1b02 100644
--- a/yum/depsolve.py
+++ b/yum/depsolve.py
@@ -554,18 +554,15 @@ class Depsolve(object):
                     self._last_req = pkg
                     return checkdeps, missingdep
 
-        # find out which arch of the ones we can choose from is closest
-        # to the arch of the requesting pkg
-        newest = provSack.returnNewestByNameArch()
-        if len(newest) > 1: # there's no way this can be zero
-                            
-            pkgresults = self._compare_providers(newest, requiringPo)
-            # take the first one...
-            best = pkgresults[0][0]                   
-                
-        elif len(newest) == 1:
-            best = newest[0]
-        
+        pkgs = provSack.returnPackages()
+        if len(pkgs) == 1: # Minor opt.
+            best = pkgs[0]
+        else:
+            #  Always do compare providers for multiple pkgs, it deals with
+            # newest etc. ... so no need to do NewestNameArch() ... and it
+            # stops compare_providers from being clever.
+            pkgresults = self._compare_providers(pkgs, requiringPo)
+            best = pkgresults[0][0]
         
         if self.rpmdb.contains(po=best): # is it already installed?
             missingdep = 1
@@ -1060,6 +1057,17 @@ class Depsolve(object):
             if y_dist == x_dist:
                 return None
             return x
+
+        #  Actual start of _compare_providers().
+
+        # Do a NameArch filtering, based on repo. __cmp__
+        unique_nevra_pkgs = {}
+        for pkg in pkgs:
+            if (pkg.pkgtup in unique_nevra_pkgs and
+                unique_nevra_pkgs[pkg.pkgtup].repo <= pkg.repo):
+                continue
+            unique_nevra_pkgs[pkg.pkgtup] = pkg
+        pkgs = unique_nevra_pkgs.values()
             
         pkgresults = {}
         ipkgresults = {}
-- 
1.6.2.5



More information about the Yum-devel mailing list