[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