Hi!

The attached patches improve YumBase.update to handle multilib updates and obsoletes better. This improves several situations:

Updating noarch to multilib (32 + 64 bit) and vice versa.

Check obsoletes not only for the updating pkg but also for pkgs obsoleted by the updating pkgs. Also handle noarch <-> multilib transitions in obsoletes better.

Florian
>From be9925868ec31642e698b44d8905f72799f58236 Mon Sep 17 00:00:00 2001
From: Florian Festi <[EMAIL PROTECTED]>
Date: Tue, 23 Oct 2007 14:34:20 +0200
Subject: [PATCH] Add .obsoleting_dict to updates object to have better access to obsoletes

---
 rpmUtils/updates.py |    7 ++++---
 1 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/rpmUtils/updates.py b/rpmUtils/updates.py
index 7111957..4a5eeba 100644
--- a/rpmUtils/updates.py
+++ b/rpmUtils/updates.py
@@ -260,6 +260,10 @@ class Updates:
                 if not self.obsoleted_dict.has_key(old):
                     self.obsoleted_dict[old] = []
                 self.obsoleted_dict[old].append(new)
+        self.obsoleting_dict = {}
+        for obsoleted, obsoletings in self.obsoleted_dict.iteritems():
+            for obsoleting in obsoletings:
+                self.obsoleting_dict.setdefault(obsoleting, []).append(obsoleted)
     
     def doUpdates(self):
         """check for key lists as populated then commit acts of evil to
@@ -473,16 +477,13 @@ class Updates:
                         
                     (rpm_e, rpm_v, rpm_r) = hipdict[(n, rpm_a)][0] # there can be just one
                     (e, v, r) = hapdict[(n, a)][0] # just one, I'm sure, I swear!
-
                     rc = rpmUtils.miscutils.compareEVR((e, v, r), (rpm_e, rpm_v, rpm_r))
-
                     if rc > 0:
                         # this is definitely an update - put it in the dict
                         if not updatedict.has_key((n, rpm_a, rpm_e, rpm_v, rpm_r)):
                             updatedict[(n, rpm_a, rpm_e, rpm_v, rpm_r)] = []
                         updatedict[(n, rpm_a, rpm_e, rpm_v, rpm_r)].append((n, a, e, v, r))
                    
-                   
         self.updatesdict = updatedict                    
         self.makeUpdatingDict()
         
-- 
1.5.2.4

>From 3feceef3116766d9c44fec73a14e3fd80c741136 Mon Sep 17 00:00:00 2001
From: Florian Festi <[EMAIL PROTECTED]>
Date: Tue, 23 Oct 2007 15:51:15 +0200
Subject: [PATCH] Fix some issues in YumBase.update() - handle more that one obsolete per pkg - handle pkgs obsoleted by updates - handle more than one update per packagFix some issues in YumBase.update() - handle more that one obsolete per pkg - handle pkgs obsoleted by updates - handle more than one update per packagee

---
 yum/__init__.py |   39 ++++++++++++++++++++++-----------------
 1 files changed, 22 insertions(+), 17 deletions(-)

diff --git a/yum/__init__.py b/yum/__init__.py
index 4a202df..056a330 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -1974,7 +1974,6 @@ class YumBase(depsolve.Depsolve):
         else:
             obsoletes = []
 
-
         tx_return = []
         if not po and not kwargs.keys(): # update everything (the easy case)
             self.verbose_logger.log(logginglevels.DEBUG_2, 'Updating Everything')
@@ -2032,33 +2031,39 @@ class YumBase(depsolve.Depsolve):
             # mark the package being updated or obsoleted away appropriately
             # and the package relationship in the tsInfo
             
-            for installed_pkg in instpkgs:
-                if self.up.obsoleted_dict.has_key(installed_pkg.pkgtup) and self.conf.obsoletes:
-                    obsoleting = self.up.obsoleted_dict[installed_pkg.pkgtup][0]
-                    obsoleting_pkg = self.getPackageObject(obsoleting)
-                    # FIXME check for what might be in there here
-                    txmbr = self.tsInfo.addObsoleting(obsoleting_pkg, installed_pkg)
-                    self.tsInfo.addObsoleted(installed_pkg, obsoleting_pkg)
-                    tx_return.append(txmbr)
-            
+            if self.conf.obsoletes:
+                for installed_pkg in instpkgs:
+                    for obsoleting in self.up.obsoleted_dict.get(installed_pkg.pkgtup, []):
+                        obsoleting_pkg = self.getPackageObject(obsoleting)
+                        # FIXME check for what might be in there here
+                        txmbr = self.tsInfo.addObsoleting(obsoleting_pkg, installed_pkg)
+                        self.tsInfo.addObsoleted(installed_pkg, obsoleting_pkg)
+                        tx_return.append(txmbr)
+                for available_pkg in availpkgs:
+                    for obsoleted in self.up.obsoleting_dict.get(available_pkg.pkgtup, []):
+                        obsoleted_pkg = self.getInstalledPackageObject(obsoleted)
+                        txmbr = self.tsInfo.addObsoleting(available_pkg, obsoleted_pkg)
+                        tx_return.append(txmbr)
+                        if self.tsInfo.isObsoleted(obsoleted):
+                            self.verbose_logger.log(logginglevels.DEBUG_2, 'Package is already obsoleted: %s.%s %s:%s-%s', obsoleted)
+                        else:
+                            txmbr = self.tsInfo.addObsoleted(obsoleted_pkg, available_pkg)
+                            tx_return.append(txmbr)
             for available_pkg in availpkgs:
-                if self.up.updating_dict.has_key(available_pkg.pkgtup):
-                    updated = self.up.updating_dict[available_pkg.pkgtup][0]
+                for updated in self.up.updating_dict.get(available_pkg.pkgtup, []):
                     if self.tsInfo.isObsoleted(updated):
                         self.verbose_logger.log(logginglevels.DEBUG_2, 'Not Updating Package that is already obsoleted: %s.%s %s:%s-%s', 
-                            updated)
+                                                updated)
                     else:
                         updated_pkg =  self.rpmdb.searchPkgTuple(updated)[0]
                         txmbr = self.tsInfo.addUpdate(available_pkg, updated_pkg)
                         tx_return.append(txmbr)
-                    
             for installed_pkg in instpkgs:
-                if self.up.updatesdict.has_key(installed_pkg.pkgtup):
-                    updating = self.up.updatesdict[installed_pkg.pkgtup][0]
+                for updating in self.up.updatesdict.get(installed_pkg.pkgtup, []):
                     updating_pkg = self.getPackageObject(updating)
                     if self.tsInfo.isObsoleted(installed_pkg.pkgtup):
                         self.verbose_logger.log(logginglevels.DEBUG_2, 'Not Updating Package that is already obsoleted: %s.%s %s:%s-%s', 
-                            installed_pkg.pkgtup)
+                                                installed_pkg.pkgtup)
                     else:
                         txmbr = self.tsInfo.addUpdate(updating_pkg, installed_pkg)
                         tx_return.append(txmbr)
-- 
1.5.2.4

_______________________________________________
Yum-devel mailing list
[email protected]
https://lists.dulug.duke.edu/mailman/listinfo/yum-devel

Reply via email to