[yum-git] test/skipbroken-tests.py yum/__init__.py

Tim Lauridsen timlau at linux.duke.edu
Fri Feb 1 13:12:42 UTC 2008


 test/skipbroken-tests.py |   17 ++++++++++++++++
 yum/__init__.py          |   49 ++++++++++++++++++++++++++++++++++++++---------
 2 files changed, 57 insertions(+), 9 deletions(-)

New commits:
commit 4830cf0c074df07964734c40b40470a22ee1e7dc
Author: Tim Lauridsen <tla at rasmil.dk>
Date:   Fri Feb 1 14:07:00 2008 +0100

    * Added multilib skip-broken test case.
    * Make skip-broken remove packages with same nevr and combatible arch, to avoid error in the transaction test where foo-1.x86_64->foo-2.x86_64, get skipped, but foo-1.i386->foo.2.i386 is not.
    * If skip-broken cant fix the problems the tell it to the user and show the orignal problems

diff --git a/test/skipbroken-tests.py b/test/skipbroken-tests.py
index 970a3b0..e15ae56 100644
--- a/test/skipbroken-tests.py
+++ b/test/skipbroken-tests.py
@@ -343,6 +343,23 @@ class SkipBrokenTests(DepsolveTests):
 
         self.assertEquals('empty', *self.resolveCode(skip=True))
 
+    def testMultiLibUpdate(self):
+        '''
+        foo-1.i386 & foo-1.xf86_64 is updated by foo-2.i386 & foo-2.xf86_64
+        foo-2.xf86_64 has a missing req, and get skipped, foo-2.i386 has to be skipped to
+        or it will fail in the rpm test transaction
+        '''
+        ipo1 = self.instPackage('foo', '1',arch='i386')
+        ipo2 = self.instPackage('foo', '1',arch='x86_64')
+        po1 = self.repoPackage('foo', '2',arch='i386')
+        po2 = self.repoPackage('foo', '2',arch='x86_64')
+        po2.addRequires('notfound', 'EQ', ('0', '1', '0'))
+        self.tsInfo.addUpdate(po1, oldpo=ipo1)
+        self.tsInfo.addUpdate(po2, oldpo=ipo2)
+        self.assertEquals('empty', *self.resolveCode(skip=True))
+        self.assertResult([ipo1,ipo2])
+        
+
 
     def resolveCode(self,skip = False):
         solver = YumBase()
diff --git a/yum/__init__.py b/yum/__init__.py
index 63a8cb0..3cd2429 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -627,6 +627,7 @@ class YumBase(depsolve.Depsolve):
         # or the transaction is empty
         count = 0
         skip_messages = []
+        orig_restring = restring    # Keep the old error messages
         while len(self.po_with_problems) > 0 and rescode == 1:
             count += 1
             self.verbose_logger.debug(_("Skip-broken round %i"), count)
@@ -645,11 +646,8 @@ class YumBase(depsolve.Depsolve):
                     if not po.repoid == 'installed': # Only remove non installed packages from pkgSack
                         self.pkgSack.delPackage(po)
             for po in toRemove:
-                if self.tsInfo.exists(po.pkgtup):
-                    self.tsInfo.remove(po.pkgtup)
-                    if not po.repoid == 'installed':
-                        skip_messages.append("    %s from %s" % (str(po),po.repoid))
-
+                msgs = self._skipFromTransaction(po)
+                skip_messages.extend(msgs)
             if not toRemove: # Nothing was removed, so we still got a problem
                 break # Bail out
             rescode, restring = self.resolveDeps()
@@ -658,13 +656,46 @@ class YumBase(depsolve.Depsolve):
              # if there is no changes then we got a loop.
             if startTs-endTs == set():
                 break    # bail out
-        self.verbose_logger.debug(_("Skip-broken took %i rounds "), count)
-        self.verbose_logger.info(_('\nPackages skipped because for dependency problems:'))
-        for msg in skip_messages:
-            self.verbose_logger.info(msg)
+        if rescode != 1:
+            self.verbose_logger.debug(_("Skip-broken took %i rounds "), count)
+            self.verbose_logger.info(_('\nPackages skipped because of dependency problems:'))
+            skip_messages.sort()
+            for msg in skip_messages:
+                self.verbose_logger.info(msg)
+        else:
+            # If we cant solve the problems the show the original error messages.
+            self.verbose_logger.info("Skip-broken could not solve problems")
+            return 1, orig_restring
         
         return rescode, restring
 
+    def _skipFromTransaction(self,po):
+        messages =  []
+        if rpmUtils.arch.isMultiLibArch():
+            archs = rpmUtils.arch.getArchList() 
+            n,a,e,v,r = po.pkgtup
+            # skip for all combat archs
+            for a in archs:
+                pkgtup = (n,a,e,v,r)
+                if self.tsInfo.exists(pkgtup):
+                    for txmbr in self.tsInfo.getMembers(pkgtup):
+                        pkg = txmbr.po
+                        msgs = self._removePoFromTransaction(pkg)
+                        messages.extend(msgs)
+        else:
+            msgs = self._removePoFromTransaction(po)
+            messages.extend(msgs)
+        return messages
+
+    def _removePoFromTransaction(self,po):
+        messages =  []
+        if self.tsInfo.exists(po.pkgtup):
+            self.tsInfo.remove(po.pkgtup)
+            if not po.repoid == 'installed':
+                self.skipped_po.add(po)
+                messages.append("    %s from %s" % (str(po),po.repoid))
+        return messages  
+              
     def _buildDepTree(self):
         ''' create a dictionary with po and deps '''
         depTree = { }



More information about the Yum-cvs-commits mailing list