[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