Hi Tim!

Some more skip broken code:

Fix the endless loop (sorry, test case is still broken). Code is not that beautiful - feel free to adjust your personal taste ;)=

Tim Lauridsen wrote:
Added some patch to fix issues with skip-broken and updates.

If we remove an update, we have to remove the cleanup txmbr of the package being updated.
There is also a patch to fix the testcases.

Add support for obsoletes.

Have fun

Florian
>From e2f09a4030ef5c4d067fa01667bd9fc91d8b0771 Mon Sep 17 00:00:00 2001
From: Florian Festi <[EMAIL PROTECTED]>
Date: Tue, 27 Nov 2007 12:29:35 +0100
Subject: [PATCH] Fix endless loop in skipbroken
 New fixbroken test case

---
 test/skipbroken-tests.py |   21 +++++++++++++++++++--
 yum/__init__.py          |   11 +++++++----
 2 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/test/skipbroken-tests.py b/test/skipbroken-tests.py
index c9e2512..a6a55b5 100644
--- a/test/skipbroken-tests.py
+++ b/test/skipbroken-tests.py
@@ -55,8 +55,7 @@ class SkipBrokenTests(DepsolveTests):
         self.tsInfo.addUpdate(po2, oldpo=po1)
         self.rpmdb.addPackage(ipo)
         
-        # XXX endless loop
-        # self.assertEquals('ok', *self.resolveCode(skip=True))
+        self.assertEquals('ok', *self.resolveCode(skip=True))
         self.assertResult([ipo, po2])
 
     def testUpdateRequireOld(self):
@@ -74,6 +73,24 @@ class SkipBrokenTests(DepsolveTests):
         self.assertEquals('empty', *self.resolveCode(skip=True))
         self.assertResult([ipo, po1])
 
+    def testUpdateRequireBoth(self):
+        po1 = FakePackage('foo', '1', '0', '0', 'noarch')
+        po1.addRequires('foo-tools', 'EQ', ('0', '1', '0'))
+        po2 = FakePackage('foo', '2', '0', '0', 'noarch')
+        po2.addRequires('foo-tools', 'EQ', ('0', '2', '0'))
+
+        ipo = FakePackage('foo-tools', '1', '0', '0', 'noarch')
+        por =  FakePackage('foo-gui', '1', '0', '0', 'noarch')
+        por.addRequires('foo', 'EQ', ('0', '2', '0'))
+
+        self.rpmdb.addPackage(po1)
+        self.tsInfo.addUpdate(po2, oldpo=po1)
+        self.rpmdb.addPackage(ipo)
+        self.tsInfo.addInstall(por)
+
+        self.assertEquals('empty', *self.resolveCode(skip=True))
+        self.assertResult([ipo, po1])
+
     def testLoop(self):
         ipo = FakePackage('foo', '1', '0', '0', 'noarch')
         ipo2 = FakePackage('foo-tools', '1', '0', '0', 'noarch')
diff --git a/yum/__init__.py b/yum/__init__.py
index 71d51ba..2c7de74 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -585,24 +585,27 @@ class YumBase(depsolve.Depsolve):
         # The remove the broken packages from the transactions and
         # Try another depsolve
         if self.conf.skip_broken and rescode==1:
-            rescode, restring = self._skipPackagesWithProblems()
+            rescode, restring = self._skipPackagesWithProblems(rescode, restring)
             
         return rescode, restring
 
-    def _skipPackagesWithProblems(self):
+    def _skipPackagesWithProblems(self, rescode, restring):
         ''' Remove the packages with depsolve errors and depsolve again '''
-        rescode = 1
         # Keep removing packages & Depsolve until all errors is gone
         # or the transaction is empty
         while len(self.po_with_problems) > 0 and rescode == 1:
+            length = len(self.tsInfo)
             for po in self.po_with_problems:
                 self.verbose_logger.debug("skipping %s because of depsolving problems" % po)
                 self._skipDeps(po)
                 self.tsInfo.remove(po.pkgtup)
+                # self.pkgSack.delPackage(po)
+            if len(self.tsInfo) == length:
+                break
             rescode, restring = self.resolveDeps()
         return rescode, restring
 
-    def _skipDeps(self,pkg):
+    def _skipDeps(self, pkg):
         '''
         Remove the deps for a package with dep problem
         from the Transaction
-- 
1.5.3.3

>From 50d3f6bb765eb029d10bca7dc3a186b54ec6dec4 Mon Sep 17 00:00:00 2001
From: Florian Festi <[EMAIL PROTECTED]>
Date: Tue, 27 Nov 2007 12:30:56 +0100
Subject: [PATCH] Add support for obsoletes in skip broken

---
 yum/__init__.py |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/yum/__init__.py b/yum/__init__.py
index 2c7de74..0076dc2 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -617,7 +617,7 @@ class YumBase(depsolve.Depsolve):
                 self.tsInfo.remove(dep.pkgtup)
             # Move pkg being updated from transaction.
             if txmbr.ts_state == 'u':
-                for upd in txmbr.updates:
+                for upd in (txmbr.updates + txmbr.obsoletes):
                     self.verbose_logger.debug("skipping update %s because of depsolving problems in %s" % (upd,pkg))
                     self.tsInfo.remove(upd.pkgtup)
                 
-- 
1.5.3.3

_______________________________________________
Yum-devel mailing list
[email protected]
https://lists.dulug.duke.edu/mailman/listinfo/yum-devel

Reply via email to