[yum-cvs] 3 commits - rpmUtils/updates.py yum/depsolve.py yum/__init__.py yum/transactioninfo.py

Seth Vidal skvidal at linux.duke.edu
Wed Oct 31 21:58:36 UTC 2007


 rpmUtils/updates.py    |    7 ++++---
 yum/__init__.py        |   39 ++++++++++++++++++++++-----------------
 yum/depsolve.py        |   21 ++++++++++-----------
 yum/transactioninfo.py |    5 +++--
 4 files changed, 39 insertions(+), 33 deletions(-)

New commits:
commit 1c3a1256de6cf2edce1027153a0d9c1bd7b0c5d0
Author: Seth Vidal <skvidal at fedoraproject.org>
Date:   Wed Oct 31 17:58:12 2007 -0400

    Applied patches from Florian Festi:
    
    "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."

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()
         
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)
commit 141377905b5851f937e8f76b0255ebac67b76ff7
Author: Seth Vidal <skvidal at fedoraproject.org>
Date:   Wed Oct 31 17:21:21 2007 -0400

    applied patch from florian festi:
    
    "The following patch tries to update already installed pkgs instead of just
    installing the "best" arch and think about updates later on. This makes
    updates for dependencies more like regular updates and avoids ending up with
    pkgs of different version and different arches installed at once - which
    will most likely result in multilib file conflicts."

diff --git a/yum/depsolve.py b/yum/depsolve.py
index b81b1b8..5747a15 100644
--- a/yum/depsolve.py
+++ b/yum/depsolve.py
@@ -489,18 +489,17 @@ class Depsolve(object):
         
 
         # find the best one 
-        # first, find out which arch of the ones we can choose from is closest
-        # to the arch of the requesting pkg
 
-        # we could be here from _requiringFromInstalled() - check to see if we have
-        # an entry in the ts first, if not - look in the rpmdb for the requiring arch
-        ts_reqs =  self.tsInfo.matchNaevr(name=name, ver=version, rel=release)
-        if len(ts_reqs):
-            reqpkg = ts_reqs[0]
-        else:
-            reqpkg = self.rpmdb.searchNevra(name=name, ver=version, rel=release)[0]
-            
-        thisarch = reqpkg.arch
+        # try updating the already install pkgs
+        for pkg in provSack.returnNewestByName():
+            txmbrs = self.update(name=pkg.name, epoch=pkg.epoch, version=pkg.version, rel=pkg.rel)
+            if txmbrs:
+                checkdeps = True
+                return checkdeps, missingdep
+
+        # find out which arch of the ones we can choose from is closest
+        # to the arch of the requesting pkg
+        thisarch = requiringPo.arch
         newest = provSack.returnNewestByNameArch()
         if len(newest) > 1: # there's no way this can be zero
             best = newest[0]
commit a9599e18debf99a0b7b4db5db6507cc0cee18a23
Author: Seth Vidal <skvidal at fedoraproject.org>
Date:   Wed Oct 31 17:14:50 2007 -0400

    commit patch from Florian Festi:
    
    "The attached patch makes sure that an updated pkg is removed even if the
    updating pkg already got added to the transaction. This fixes updates from
    multilib (32 and 64 bit installed) to noarch. Currently the first update
    operation (e.g. 32bit -> noarch) works but the second (64bit -> noarch) is
    ignored. As result there are two pkg in different arches and versions which
    will most likely result in an multilib file conflict. The current patch
    makes sure that the updated pkg is only rejected if itself is already in the
    transaction (as a REMOVE)."

diff --git a/yum/transactioninfo.py b/yum/transactioninfo.py
index 096a3c0..f914721 100644
--- a/yum/transactioninfo.py
+++ b/yum/transactioninfo.py
@@ -151,6 +151,9 @@ class TransactionData:
     def add(self, txmember):
         """add a package to the transaction"""
         
+        for oldpo in txmember.updates:
+            self.addUpdated(oldpo, txmember.po)
+
         if not self.pkgdict.has_key(txmember.pkgtup):
             self.pkgdict[txmember.pkgtup] = []
         else:
@@ -174,8 +177,6 @@ class TransactionData:
                 condtxmbr = self.addInstall(po)
                 condtxmbr.setAsDep(po=txmember.po)
         
-        for oldpo in txmember.updates:
-            self.addUpdated(oldpo, txmember.po)
 
     def remove(self, pkgtup):
         """remove a package from the transaction"""



More information about the Yum-cvs-commits mailing list