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