[yum-commits] Branch 'yum-3_2_X' - test/skipbroken-tests.py yum/__init__.py

Tim Lauridsen timlau at osuosl.org
Tue Nov 11 07:18:46 UTC 2008


 test/skipbroken-tests.py |   56 +++++++++++++++++++++++++++++++++++++++++++++++
 yum/__init__.py          |   35 ++++++++++++++++++++++++-----
 2 files changed, 85 insertions(+), 6 deletions(-)

New commits:
commit af4feb628ace315ae37a30fdf55821812453ceea
Author: Tim Lauridsen <timlau at fedoraproject.org>
Date:   Tue Nov 11 08:18:37 2008 +0100

    make skip-broken handle a case where foo.x86_64 is skipped, and the foo.i386 is pulled in instead (rhbz #470291)

diff --git a/test/skipbroken-tests.py b/test/skipbroken-tests.py
index 968989c..d6f763c 100644
--- a/test/skipbroken-tests.py
+++ b/test/skipbroken-tests.py
@@ -526,6 +526,62 @@ class SkipBrokenTests(DepsolveTests):
         self.tsInfo.addUpdate(ur4, oldpo=r4)
         
         self.assertEquals('err', *self.resolveCode(skip=False))
+        
+    def testBumpedSoNameMultiArch(self):
+        """ 
+        if compat-db45.x86_64 get skipped, then compat-db45.i386 should not 
+        get pulled in instead
+        """
+        c1 = self.instPackage('cyrus-sasl-lib', '2.1.22',"18", arch='x86_64')
+        c1.addRequires("libdb-4.3.so")
+        
+        d1 = self.instPackage('compat-db', '4.6.21',"4", arch='x86_64')
+        d1.addProvides("libdb-4.3.so")
+        od1 = self.repoPackage('compat-db46', '4.6.21',"5", arch='x86_64')
+        od1.addProvides("libdb-4.6.so")
+        od1.addObsoletes("compat-db")
+        od2 = self.repoPackage('compat-db45', '4.6.21',"5", arch='x86_64')
+        od2.addProvides("libdb-4.5.so")
+        od2.addObsoletes("compat-db")
+        od3 = self.repoPackage('compat-db45', '4.6.21',"5", arch='i386')
+        od3.addProvides("libdb-4.5.so")
+        od3.addObsoletes("compat-db")
+        
+        r1 = self.instPackage('rpm', '4.6.0-0','0.rc1.3', arch='x86_64')
+        r1.addRequires("libdb-4.5.so")
+        r2 = self.instPackage('rpm-libs', '4.6.0-0','0.rc1.3', arch='x86_64')
+        r2.addRequires("libdb-4.5.so")
+        r3 = self.instPackage('rpm-build', '4.6.0-0','0.rc1.3', arch='x86_64')
+        r3.addRequires("libdb-4.5.so")
+        r4 = self.instPackage('rpm-python', '4.6.0-0','0.rc1.3', arch='x86_64')
+        r4.addRequires("libdb-4.5.so")
+
+        ur1 = self.repoPackage('rpm', '4.6.0-0','0.rc1.5', arch='x86_64')
+        ur1.addRequires("libdb-4.5.so")
+        ur1.addRequires("compat-db45")
+        ur2 = self.repoPackage('rpm-libs', '4.6.0-0','0.rc1.5', arch='x86_64')
+        ur2.addRequires("libdb-4.5.so")
+        ur2.addRequires("compat-db45")
+        ur3 = self.repoPackage('rpm-build', '4.6.0-0','0.rc1.5', arch='x86_64')
+        ur3.addRequires("libdb-4.5.so")
+        ur3.addRequires("compat-db45")
+        ur4 = self.repoPackage('rpm-python', '4.6.0-0','0.rc1.5', arch='x86_64')
+        ur4.addRequires("libdb-4.5.so")
+        ur4.addRequires("compat-db45")
+
+
+        self.tsInfo.addObsoleting(od2, oldpo=d1)
+        self.tsInfo.addObsoleted(d1, od2)
+        self.tsInfo.addObsoleting(od1, oldpo=d1)
+        self.tsInfo.addObsoleted(d1, od1)
+        self.tsInfo.addUpdate(ur1, oldpo=r1)
+        self.tsInfo.addUpdate(ur2, oldpo=r2)
+        self.tsInfo.addUpdate(ur3, oldpo=r3)
+        self.tsInfo.addUpdate(ur4, oldpo=r4)
+
+        self.assertEquals('empty', *self.resolveCode(skip=True))
+        self.assertResult([c1,d1,r1,r2,r3,r4])
+        
     
     def resolveCode(self,skip = False):
         solver = YumBase()
diff --git a/yum/__init__.py b/yum/__init__.py
index 94e732d..dc19660 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -684,11 +684,16 @@ class YumBase(depsolve.Depsolve):
             _remove_from_sack(po)
 
         def _remove_from_sack(po):
-            if not po.repoid == 'installed' and po not in removed_from_sack:
-                self.verbose_logger.debug('SKIPBROKEN: removing %s from pkgSack & updates' % str(po))
-                self.pkgSack.delPackage(po)
-                self.up.delPackage(po.pkgtup)
-                removed_from_sack.add(po)
+            # get all compatible arch packages from pkgSack
+            # we need to remove them to so a i386 paqckages is not 
+            # dragged in when a x86_64 is skipped.
+            pkgs = self._getPackagesToRemoveAllArch(po)
+            for pkg in pkgs:
+                if not po.repoid == 'installed' and pkg not in removed_from_sack:             
+                    self.verbose_logger.debug('SKIPBROKEN: removing %s from pkgSack & updates' % str(po))
+                    self.pkgSack.delPackage(pkg)
+                    self.up.delPackage(pkg.pkgtup)
+                    removed_from_sack.add(pkg)
 
         # Keep removing packages & Depsolve until all errors is gone
         # or the transaction is empty
@@ -780,7 +785,25 @@ class YumBase(depsolve.Depsolve):
                 if not self.tsInfo.exists(pkg.pkgtup):
                     self.verbose_logger.debug('SKIPBROKEN: Remove extra obsoleted %s (%s)' % (txmbr.po,pkg) )
                     self.tsInfo.remove(txmbr.po.pkgtup)
-                    
+
+    def _getPackagesToRemoveAllArch(self,po):
+        ''' get all compatible arch packages in pkgSack'''
+        pkgs = []
+        if rpmUtils.arch.isMultiLibArch():
+            archs = rpmUtils.arch.getArchList() 
+            n,a,e,v,r = po.pkgtup
+            # skip for all compat archs
+            for a in archs:
+                pkgtup = (n,a,e,v,r)
+                matched = self.pkgSack.searchNevra(n,e,v,r,a) 
+                pkgs.extend(matched)
+        else:
+            pkgs.append(po)
+        return pkgs   
+        
+                
+                
+        
 
     def _skipFromTransaction(self,po):
         skipped =  []


More information about the Yum-commits mailing list