[Yum-devel] [PATCH] Make skipbroken run again if packages has been added to transaction by a postresolve plugin
Seth Vidal
skvidal at fedoraproject.org
Tue Mar 2 16:04:46 UTC 2010
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
More information about the Yum-devel
mailing list