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

Tim Lauridsen timlau at osuosl.org
Fri Oct 31 12:07:10 UTC 2008


 test/skipbroken-tests.py |   57 +++++++++++++++++++++++++++++++++++++++++++++--
 yum/__init__.py          |   23 ++++++++++++++++++
 2 files changed, 77 insertions(+), 3 deletions(-)

New commits:
commit ca60206e366d2212ef83843f264a3707548869c4
Author: Tim Lauridsen <timlau at fedoraproject.org>
Date:   Fri Oct 31 12:58:35 2008 +0100

    * Added an extra depsolve on the result transaction after skip-broken has ripped out the disty stuff, to make sure that allready depsolved packages, not has been broken by the skipped package.
    * Added a check for missing TS_OBSOLETED members, this problem occours if multiple packages are obsoleting the same packages and one of these get skipped. (rhbz# 468785) (It is totally DIRTY HACK, but need for now)

diff --git a/test/skipbroken-tests.py b/test/skipbroken-tests.py
index 8723975..968989c 100644
--- a/test/skipbroken-tests.py
+++ b/test/skipbroken-tests.py
@@ -440,8 +440,10 @@ class SkipBrokenTests(DepsolveTests):
         d1.addProvides("libdb-4.3.so")
         od1 = self.repoPackage('compat-db46', '4.6.21',"5")
         od1.addProvides("libdb-4.6.so")
+        od1.addObsoletes("compat-db")
         od2 = self.repoPackage('compat-db45', '4.6.21',"5")
         od2.addProvides("libdb-4.5.so")
+        od2.addObsoletes("compat-db")
         
         r1 = self.instPackage('rpm', '4.6.0-0','0.rc1.3')
         r1.addRequires("libdb-4.5.so")
@@ -453,15 +455,18 @@ class SkipBrokenTests(DepsolveTests):
         r4.addRequires("libdb-4.5.so")
 
         ur1 = self.repoPackage('rpm', '4.6.0-0','0.rc1.5')
+        ur1.addRequires("libdb-4.5.so")
         ur1.addRequires("compat-db45")
         ur2 = self.repoPackage('rpm-libs', '4.6.0-0','0.rc1.5')
+        ur2.addRequires("libdb-4.5.so")
         ur2.addRequires("compat-db45")
         ur3 = self.repoPackage('rpm-build', '4.6.0-0','0.rc1.5')
+        ur3.addRequires("libdb-4.5.so")
         ur3.addRequires("compat-db45")
         ur4 = self.repoPackage('rpm-python', '4.6.0-0','0.rc1.5')
+        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)
@@ -471,8 +476,56 @@ class SkipBrokenTests(DepsolveTests):
         self.tsInfo.addUpdate(ur3, oldpo=r3)
         self.tsInfo.addUpdate(ur4, oldpo=r4)
         
-        self.assertEquals('ok', *self.resolveCode(skip=True))
+        self.assertEquals('empty', *self.resolveCode(skip=True))
         self.assertResult([c1,d1,r1,r2,r3,r4])
+
+    def testBumpedSoName3(self):
+        """ 
+        https://bugzilla.redhat.com/show_bug.cgi?id=468785
+        yum update compat-db46
+        """
+        c1 = self.instPackage('cyrus-sasl-lib', '2.1.22',"18")
+        c1.addRequires("libdb-4.3.so")
+        
+        d1 = self.instPackage('compat-db', '4.6.21',"4")
+        d1.addProvides("libdb-4.3.so")
+        od1 = self.repoPackage('compat-db46', '4.6.21',"5")
+        od1.addProvides("libdb-4.6.so")
+        od1.addObsoletes("compat-db")
+        od2 = self.repoPackage('compat-db45', '4.6.21',"5")
+        od2.addProvides("libdb-4.5.so")
+        od2.addObsoletes("compat-db")
+        
+        r1 = self.instPackage('rpm', '4.6.0-0','0.rc1.3')
+        r1.addRequires("libdb-4.5.so")
+        r2 = self.instPackage('rpm-libs', '4.6.0-0','0.rc1.3')
+        r2.addRequires("libdb-4.5.so")
+        r3 = self.instPackage('rpm-build', '4.6.0-0','0.rc1.3')
+        r3.addRequires("libdb-4.5.so")
+        r4 = self.instPackage('rpm-python', '4.6.0-0','0.rc1.3')
+        r4.addRequires("libdb-4.5.so")
+
+        ur1 = self.repoPackage('rpm', '4.6.0-0','0.rc1.5')
+        ur1.addRequires("libdb-4.5.so")
+        ur1.addRequires("compat-db45")
+        ur2 = self.repoPackage('rpm-libs', '4.6.0-0','0.rc1.5')
+        ur2.addRequires("libdb-4.5.so")
+        ur2.addRequires("compat-db45")
+        ur3 = self.repoPackage('rpm-build', '4.6.0-0','0.rc1.5')
+        ur3.addRequires("libdb-4.5.so")
+        ur3.addRequires("compat-db45")
+        ur4 = self.repoPackage('rpm-python', '4.6.0-0','0.rc1.5')
+        ur4.addRequires("libdb-4.5.so")
+        ur4.addRequires("compat-db45")
+
+        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('err', *self.resolveCode(skip=False))
     
     def resolveCode(self,skip = False):
         solver = YumBase()
diff --git a/yum/__init__.py b/yum/__init__.py
index 151806b..784e826 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -694,10 +694,11 @@ class YumBase(depsolve.Depsolve):
         removed_from_sack = set()
         orig_restring = restring    # Keep the old error messages 
         hard_restart = False
-        while len(self.po_with_problems) > 0 and rescode == 1:
+        while (len(self.po_with_problems) > 0 and rescode == 1):
             count += 1
             self.verbose_logger.debug(_("Skip-broken round %i"), count)
             depTree = self._buildDepTree()
+            print depTree
             startTs = set(self.tsInfo)
             toRemove = set()
             for po,wpo,err in self.po_with_problems:
@@ -734,6 +735,15 @@ class YumBase(depsolve.Depsolve):
                 else:
                     self.verbose_logger.debug('SKIPBROKEN: resetting already resovled packages (transaction not changed)' )
                     self.tsInfo.resetResolved(hard=True)
+            # if we are all clear, then we have to check that the whole current transaction 
+            # can complete the depsolve without error, because the packages skipped
+            # can have broken something that passed the tests earliere.
+            # FIXME: We need do this in a better way.
+            if rescode != 1:
+                self.verbose_logger.debug('SKIPBROKEN: Check the current transaction one last time' )
+                self.tsInfo.resetResolved(hard=True)
+                self._checkMissingObsoleted() # This is totally insane, but needed :(
+                rescode, restring = self.resolveDeps()
         if rescode != 1:
             self.verbose_logger.debug(_("Skip-broken took %i rounds "), count)
             self.verbose_logger.info(_('\nPackages skipped because of dependency problems:'))
@@ -750,6 +760,17 @@ class YumBase(depsolve.Depsolve):
         
         return rescode, restring
 
+    def _checkMissingObsoleted(self):
+        """ 
+        If multiple packages is obsoleting the same package
+        then the TS_OBSOLETED can get removed from the transaction
+        so we must make sure that they, exist and else create them
+        """
+        for txmbr in self.tsInfo:
+            for pkg in txmbr.obsoletes:
+                if not self.tsInfo.exists(pkg.pkgtup):
+                    self.tsInfo.addObsoleted(pkg,txmbr.po)
+
     def _skipFromTransaction(self,po):
         skipped =  []
         if rpmUtils.arch.isMultiLibArch():


More information about the Yum-commits mailing list