Blob Blame History Raw
From 7b0868bfcacb950266753301b551eca8bc5366ee Mon Sep 17 00:00:00 2001
From: Tim Lauridsen <timlau@fedoraproject.org>
Date: Wed, 16 Sep 2009 19:00:48 +0200
Subject: [PATCH] Make skip broken handle cases where pkg dupes are installed
 and an update updates both of them but has dep problems.
 Make sure we get all the TS_UPDATED members cleaned from the
 transaction.

https://bugzilla.redhat.com/show_bug.cgi?id=522112
---
 test/skipbroken-tests.py |   18 ++++++++++++++++++
 yum/__init__.py          |   16 ++++++++++++++++
 2 files changed, 34 insertions(+), 0 deletions(-)

diff --git a/test/skipbroken-tests.py b/test/skipbroken-tests.py
index db71a21..f8896f1 100644
--- a/test/skipbroken-tests.py
+++ b/test/skipbroken-tests.py
@@ -582,6 +582,24 @@ class SkipBrokenTests(DepsolveTests):
         self.assertEquals('empty', *self.resolveCode(skip=True))
         self.assertResult([c1,d1,r1,r2,r3,r4])
         
+    def testDualPackageUpdate(self):    
+        '''
+        RHBZ #522112
+        two version of the same package installed on the system
+        and update will update both, but if it fail some dep only
+        One of the updated packages will be removed from the
+        transaction.
+        '''
+        i1 = self.instPackage('xorg-x11-server-Xorg','1.6.99.900')
+        i2 = self.instPackage('xorg-x11-server-Xorg','1.6.3')
+        u1 = self.repoPackage('xorg-x11-server-Xorg', '1.6.99.901')
+        u1.addRequires("notfound")
+        self.tsInfo.addUpdate(u1, oldpo=i1)
+        self.tsInfo.addUpdate(u1, oldpo=i2)
+        self.assertEquals('empty', *self.resolveCode(skip=True))
+        self.assertResult([i1,i2])
+        
+    
     
     def resolveCode(self,skip = False):
         solver = YumBase()
diff --git a/yum/__init__.py b/yum/__init__.py
index d13f7a9..6c27f50 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -879,6 +879,7 @@ class YumBase(depsolve.Depsolve):
                 self.verbose_logger.debug('SKIPBROKEN: sanity check the current transaction' )
                 self.tsInfo.resetResolved(hard=True)
                 self._checkMissingObsoleted() # This is totally insane, but needed :(
+                self._checkUpdatedLeftovers() # Cleanup updated leftovers
                 rescode, restring = self.resolveDeps()
         if rescode != 1:
             self.verbose_logger.debug(_("Skip-broken took %i rounds "), count)
@@ -914,6 +915,21 @@ class YumBase(depsolve.Depsolve):
                     self.verbose_logger.debug('SKIPBROKEN: Remove extra obsoleted %s (%s)' % (txmbr.po,pkg) )
                     self.tsInfo.remove(txmbr.po.pkgtup)
 
+    def _checkUpdatedLeftovers(self):
+        """ 
+        If multiple packages is updated the same package
+        and this package get removed because of an dep issue
+        then make sure that all the TS_UPDATED get removed.
+        """
+        for txmbr in self.tsInfo.getMembersWithState(None, [TS_UPDATED]):
+            for pkg in txmbr.updated_by:
+                # check if the updating txmbr is in the transaction
+                # else remove the updated txmbr
+                # it clean out some really wierd cases with dupes installed on the system
+                if not self.tsInfo.exists(pkg.pkgtup):
+                    self.verbose_logger.debug('SKIPBROKEN: Remove extra updated %s (%s)' % (txmbr.po,pkg) )
+                    self.tsInfo.remove(txmbr.po.pkgtup)
+
     def _getPackagesToRemoveAllArch(self,po):
         ''' get all compatible arch packages in pkgSack'''
         pkgs = []
-- 
1.6.2.5