[Yum-devel] [PATCH] Add pkg.filterObsoleters(), so we don't have to create the provide tuple and test "backwards". Also convert callers.

James Antill james at and.org
Thu Apr 15 17:28:00 UTC 2010


 We've screwed this up a few times, by doing provides checks instead and
this drops a few lines of code anyway ... so should be good.
---
 yum/__init__.py |   16 +++++++---------
 yum/depsolve.py |    3 +--
 yum/packages.py |   14 ++++++++++++++
 yum/rpmsack.py  |    6 ++----
 4 files changed, 24 insertions(+), 15 deletions(-)

diff --git a/yum/__init__.py b/yum/__init__.py
index 9e8fad9..ab2e6d5 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -2874,11 +2874,9 @@ class YumBase(depsolve.Depsolve):
                     installed_pkg =  self.getInstalledPackageObject(inst_tup)
                     yield installed_pkg
         else:
-            for (obs_n, obs_f, (obs_e, obs_v, obs_r)) in po.obsoletes:
+            for obs_n in po.obsoletes_names:
                 for pkg in self.rpmdb.searchNevra(name=obs_n):
-                    installedtup = (pkg.name, 'EQ', (pkg.epoch, 
-                                   pkg.ver, pkg.release))
-                    if po.inPrcoRange('obsoletes', installedtup):
+                    if pkg.filterObsoleters([po]):
                         yield pkg
 
     def _add_prob_flags(self, *flags):
@@ -3037,11 +3035,11 @@ class YumBase(depsolve.Depsolve):
                 # pull in foo.i586 when foo.x86_64 already obsoletes the pkg and
                 # is already installed
                 already_obs = None
-                poprovtup = (po.name, 'EQ', (po.epoch, po.ver, po.release))
-                for pkg in self.rpmdb.searchNevra(name=obsoleting_pkg.name):
-                    if pkg.inPrcoRange('obsoletes', poprovtup):
-                        already_obs = pkg
-                        continue
+                pkgs = self.rpmdb.searchNevra(name=obsoleting_pkg.name)
+                pkgs = po.filterObsoleters(pkgs, limit=1)
+                if pkgs:
+                    already_obs = pkgs[0]
+                    continue
 
                 if already_obs:
                     self.verbose_logger.warning(_('Package %s is obsoleted by %s which is already installed'), 
diff --git a/yum/depsolve.py b/yum/depsolve.py
index 48f77d5..8b02d7c 100644
--- a/yum/depsolve.py
+++ b/yum/depsolve.py
@@ -1203,8 +1203,7 @@ class Depsolve(object):
                     pkgresults[po] -= 1024
 
                 obsoleted = False
-                poprovtup = (po.name, 'EQ', (po.epoch, po.ver, po.release))
-                if nextpo.inPrcoRange('obsoletes', poprovtup):
+                if po.filterObsoleters([nextpo]):
                     obsoleted = True
                     pkgresults[po] -= 1024
                                 
diff --git a/yum/packages.py b/yum/packages.py
index c1a14d0..6108636 100644
--- a/yum/packages.py
+++ b/yum/packages.py
@@ -596,6 +596,20 @@ class RpmBase(object):
             using searchFiles(). """
         return self.repo.sack.have_fastReturnFileEntries()
 
+    def filterObsoleters(self, obsoleters, limit=0):
+        """ Returns list of obsoleters that obsolete this package. Note that we
+            don't do obsoleting loops. If limit is != 0, then we stop after
+            finding that many. """
+        provtup = (self.name, 'EQ', (self.epoch, self.version, self.release))
+        ret = []
+        for obspo in obsoleters:
+            if obspo.inPrcoRange('obsoletes', provtup):
+                ret.append(obspo)
+                if limit and len(ret) > limit:
+                    break
+        return ret
+
+
 
 # This is kind of deprecated
 class PackageEVR:
diff --git a/yum/rpmsack.py b/yum/rpmsack.py
index eba1409..996416b 100644
--- a/yum/rpmsack.py
+++ b/yum/rpmsack.py
@@ -1324,10 +1324,8 @@ class RPMDBPackageSack(PackageSackBase):
                 continue
             obsoleters.append(pkg)
         for pkg in sorted(self.returnPackages()):
-            provtup = (pkg.name, 'EQ', (pkg.epoch, pkg.version, pkg.release))
-            for obspo in obsoleters:
-                if obspo.inPrcoRange('obsoletes', provtup):
-                    problems.append(RPMDBProblemObsoleted(pkg, obsoleter=obspo))
+            for obspo in pkg.filterObsoleters(obsoleters):
+                problems.append(RPMDBProblemObsoleted(pkg, obsoleter=obspo))
         return problems
 
     def check_provides(self):
-- 
1.6.6.1



More information about the Yum-devel mailing list