[yum-cvs] rpmUtils/updates.py

Florian Festi ffesti at linux.duke.edu
Wed Dec 12 16:42:42 UTC 2007


 rpmUtils/updates.py |   52 ++++++++++++++++------------------------------------
 1 file changed, 16 insertions(+), 36 deletions(-)

New commits:
commit 9513f695e204adbd07db627a26e22a8eeb20e16e
Author: Florian Festi <ffesti at redhat.com>
Date:   Wed Dec 12 13:16:34 2007 +0100

    Reimplement Updates.checkForObsolete() for better runtime behavior

diff --git a/rpmUtils/updates.py b/rpmUtils/updates.py
index 94d8aa1..967e698 100644
--- a/rpmUtils/updates.py
+++ b/rpmUtils/updates.py
@@ -34,6 +34,7 @@ class Updates:
         self.installed = instlist # list of installed pkgs (n, a, e, v, r)
         self.available = availlist # list of available pkgs (n, a, e, v, r)
         self.rawobsoletes = {} # dict of obsoleting package->[what it obsoletes]
+        self._obsoletes_by_name = None
         self.exactarch = 1 # don't change archs by default
         self.exactarchlist = ['kernel', 'kernel-smp', 'glibc', 'kernel-hugemem',
                               'kernel-enterprise', 'kernel-bigmem', 'kernel-BOOT']
@@ -133,44 +134,23 @@ class Updates:
     def checkForObsolete(self, pkglist, newest=1):
         """accept a list of packages to check to see if anything obsoletes them
            return an obsoleted_dict in the format of makeObsoletedDict"""
-           
+        if self._obsoletes_by_name is None:
+            self._obsoletes_by_name = {}
+            for pkgtup, obsoletes in self.rawobsoletes.iteritems():
+                for name, flag, version in obsoletes:
+                    self._obsoletes_by_name.setdefault(name, []).append(
+                        (flag, version, pkgtup) )
+
         obsdict = {} # obseleting package -> [obsoleted package]
         pkgdict = self.makeNADict(pkglist, 1)
-        
-        # this needs to keep arch in mind
-        # if foo.i386 obsoletes bar
-        # it needs to obsoletes bar.i386 preferentially, not bar.x86_64
-        # if there is only one bar and only one foo then obsolete it, but try to
-        # match the arch.
-        
-        # look through all the obsoleting packages look for multiple archs per name
-        # if you find it look for the packages they obsolete
-        # 
-        for pkgtup in self.rawobsoletes.keys():
+
+        for pkgtup in pkglist:
             (name, arch, epoch, ver, rel) = pkgtup
-            for (obs_n, flag, (obs_e, obs_v, obs_r)) in self.rawobsoletes[(pkgtup)]:
-                if flag in [None, 0]: # unversioned obsolete
-                    if pkgdict.has_key((obs_n, None)):
-                        for (rpm_a, rpm_e, rpm_v, rpm_r) in pkgdict[(obs_n, None)]:
-                            # broken package obsoleting itself, rpm allows
-                            # this so just silently ignore it...
-                            if obs_n == name:
-                                continue
-                            if not obsdict.has_key(pkgtup):
-                                obsdict[pkgtup] = []
-                            obsdict[pkgtup].append((obs_n, rpm_a, rpm_e, rpm_v, rpm_r))
-
-                else: # versioned obsolete
-                    if pkgdict.has_key((obs_n, None)):
-                        for (rpm_a, rpm_e, rpm_v, rpm_r) in pkgdict[(obs_n, None)]:
-                            if rpmUtils.miscutils.rangeCheck((obs_n, flag, (obs_e, \
-                                                        obs_v, obs_r)), (obs_n,\
-                                                        rpm_a, rpm_e, rpm_v, rpm_r)):
-                                # make sure the obsoleting pkg is not already installed
-                                if not obsdict.has_key(pkgtup):
-                                    obsdict[pkgtup] = []
-                                obsdict[pkgtup].append((obs_n, rpm_a, rpm_e, rpm_v, rpm_r))
-        
+            for obs_flag, obs_version, obsoleting in self._obsoletes_by_name.get(name, []):
+                if obs_flag in [None, 0] and name == obsoleting[0]: continue
+                if rpmUtils.miscutils.rangeCheck( (name, obs_flag, obs_version), pkgtup):
+                    obsdict.setdefault(obsoleting, []).append(pkgtup)
+
         obslist = obsdict.keys()
         if newest:
             obslist = self._reduceListNewestByNameArch(obslist)
@@ -183,7 +163,7 @@ class Updates:
                 returndict[old].append(new)
         
         return returndict
-        
+
     def doObsoletes(self):
         """figures out what things available obsolete things installed, returns
            them in a dict attribute of the class."""



More information about the Yum-cvs-commits mailing list