On Tue, 2 Mar 2010, Tim Lauridsen wrote:

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

diff --git a/yum/__init__.py b/yum/__init__.py
index f21001d..69af7ba 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -866,20 +866,16 @@ class YumBase(depsolve.Depsolve):
        # works for downloads / mirror failover etc.
        self.rpmdb.ts = None

-        # if depsolve failed and skipbroken is enabled
-        # The remove the broken packages from the transactions and
-        # Try another depsolve
-        if self.conf.skip_broken and rescode==1:
-            self.skipped_packages = []    # reset the public list of skipped 
packages.
-            sb_st = time.time()
-            rescode, restring = self._skipPackagesWithProblems(rescode, 
restring)
-            self._printTransaction()
-            self.verbose_logger.debug('Skip-Broken time: %0.3f' % (time.time() 
- sb_st))
+        # do the skip broken magic, if enabled and problems exist
+        (rescode, restring) = self._doSkipBroken(rescode, restring)

        self.plugins.run('postresolve', rescode=rescode, restring=restring)

        if self.tsInfo.changed:
            (rescode, restring) = self.resolveDeps(rescode == 1)
+            # If transaction was changed by postresolve plugins then we should 
run skipbroken again
+            (rescode, restring) = self._doSkipBroken(rescode, restring, 
clear_skipped=False )
+
        if self.tsInfo.pkgSack is not None: # rm Transactions don't have pkgSack
            self.tsInfo.pkgSack.dropCachedData()
        self.rpmdb.dropCachedData()
@@ -887,6 +883,21 @@ class YumBase(depsolve.Depsolve):
        self.verbose_logger.debug('Depsolve time: %0.3f' % (time.time() - 
ds_st))
        return rescode, restring

+    def _doSkipBroken(self,rescode, restring, clear_skipped=True):
+        ''' do skip broken if it is enabled '''
+        # if depsolve failed and skipbroken is enabled
+        # The remove the broken packages from the transactions and
+        # Try another depsolve
+        if self.conf.skip_broken and rescode==1:
+            if clear_skipped:
+               self.skipped_packages = []    # reset the public list of 
skipped packages.
+            sb_st = time.time()
+            rescode, restring = self._skipPackagesWithProblems(rescode, 
restring)
+            self._printTransaction()
+            self.verbose_logger.debug('Skip-Broken time: %0.3f' % (time.time() 
- sb_st))
+        return (rescode, restring)
+
+
    def _skipPackagesWithProblems(self, rescode, restring):
        ''' Remove the packages with depsolve errors and depsolve again '''

@@ -983,7 +994,7 @@ class YumBase(depsolve.Depsolve):
            for po in skipped_list:
                msg = _("    %s from %s") % (str(po),po.repo.id)
                self.verbose_logger.info(msg)
-            self.skipped_packages = skipped_list    # make the skipped 
packages public
+            self.skipped_packages.extend(skipped_list)   # make the skipped 
packages public
        else:
            # If we cant solve the problems the show the original error 
messages.
            self.verbose_logger.info("Skip-broken could not solve problems")
--
1.6.6

If you've been able to replicate it as a test case (or if you could add a unittest) then ACK, definitely.

-sv

_______________________________________________
Yum-devel mailing list
Yum-devel@lists.baseurl.org
http://lists.baseurl.org/mailman/listinfo/yum-devel

Reply via email to