[Yum-devel] [PATCH] Add pkg.filterObsoleters(), so we don't have to create the provide tuple and test "backwards". Also convert callers.
Seth Vidal
skvidal at fedoraproject.org
Fri Apr 16 12:32:53 UTC 2010
On Thu, 15 Apr 2010, James Antill wrote:
> We've screwed this up a few times, by doing provides checks instead and
> this drops a few lines of code anyway ... so should be good.
> ---
> yum/__init__.py | 16 +++++++---------
> yum/depsolve.py | 3 +--
> yum/packages.py | 14 ++++++++++++++
> yum/rpmsack.py | 6 ++----
> 4 files changed, 24 insertions(+), 15 deletions(-)
>
> diff --git a/yum/__init__.py b/yum/__init__.py
> index 9e8fad9..ab2e6d5 100644
> --- a/yum/__init__.py
> +++ b/yum/__init__.py
> @@ -2874,11 +2874,9 @@ class YumBase(depsolve.Depsolve):
> installed_pkg = self.getInstalledPackageObject(inst_tup)
> yield installed_pkg
> else:
> - for (obs_n, obs_f, (obs_e, obs_v, obs_r)) in po.obsoletes:
> + for obs_n in po.obsoletes_names:
> for pkg in self.rpmdb.searchNevra(name=obs_n):
> - installedtup = (pkg.name, 'EQ', (pkg.epoch,
> - pkg.ver, pkg.release))
> - if po.inPrcoRange('obsoletes', installedtup):
> + if pkg.filterObsoleters([po]):
> yield pkg
>
> def _add_prob_flags(self, *flags):
> @@ -3037,11 +3035,11 @@ class YumBase(depsolve.Depsolve):
> # pull in foo.i586 when foo.x86_64 already obsoletes the pkg and
> # is already installed
> already_obs = None
> - poprovtup = (po.name, 'EQ', (po.epoch, po.ver, po.release))
> - for pkg in self.rpmdb.searchNevra(name=obsoleting_pkg.name):
> - if pkg.inPrcoRange('obsoletes', poprovtup):
> - already_obs = pkg
> - continue
> + pkgs = self.rpmdb.searchNevra(name=obsoleting_pkg.name)
> + pkgs = po.filterObsoleters(pkgs, limit=1)
> + if pkgs:
> + already_obs = pkgs[0]
> + continue
>
> if already_obs:
> self.verbose_logger.warning(_('Package %s is obsoleted by %s which is already installed'),
> diff --git a/yum/depsolve.py b/yum/depsolve.py
> index 48f77d5..8b02d7c 100644
> --- a/yum/depsolve.py
> +++ b/yum/depsolve.py
> @@ -1203,8 +1203,7 @@ class Depsolve(object):
> pkgresults[po] -= 1024
>
> obsoleted = False
> - poprovtup = (po.name, 'EQ', (po.epoch, po.ver, po.release))
> - if nextpo.inPrcoRange('obsoletes', poprovtup):
> + if po.filterObsoleters([nextpo]):
> obsoleted = True
> pkgresults[po] -= 1024
>
> diff --git a/yum/packages.py b/yum/packages.py
> index c1a14d0..6108636 100644
> --- a/yum/packages.py
> +++ b/yum/packages.py
> @@ -596,6 +596,20 @@ class RpmBase(object):
> using searchFiles(). """
> return self.repo.sack.have_fastReturnFileEntries()
>
> + def filterObsoleters(self, obsoleters, limit=0):
> + """ Returns list of obsoleters that obsolete this package. Note that we
> + don't do obsoleting loops. If limit is != 0, then we stop after
> + finding that many. """
> + provtup = (self.name, 'EQ', (self.epoch, self.version, self.release))
> + ret = []
> + for obspo in obsoleters:
> + if obspo.inPrcoRange('obsoletes', provtup):
> + ret.append(obspo)
> + if limit and len(ret) > limit:
> + break
> + return ret
> +
> +
>
> # This is kind of deprecated
> class PackageEVR:
> diff --git a/yum/rpmsack.py b/yum/rpmsack.py
> index eba1409..996416b 100644
> --- a/yum/rpmsack.py
> +++ b/yum/rpmsack.py
> @@ -1324,10 +1324,8 @@ class RPMDBPackageSack(PackageSackBase):
> continue
> obsoleters.append(pkg)
> for pkg in sorted(self.returnPackages()):
> - provtup = (pkg.name, 'EQ', (pkg.epoch, pkg.version, pkg.release))
> - for obspo in obsoleters:
> - if obspo.inPrcoRange('obsoletes', provtup):
> - problems.append(RPMDBProblemObsoleted(pkg, obsoleter=obspo))
> + for obspo in pkg.filterObsoleters(obsoleters):
> + problems.append(RPMDBProblemObsoleted(pkg, obsoleter=obspo))
> return problems
>
> def check_provides(self):
> --
> 1.6.6.1
I'm fine with the patch - I'm not sure I like 'filterObsoleters' as the
method name.
'filter' has almost no meaning to me in this context.
Would return_obsoleters_from_list().
something to think about I guess, since once the method is out there we're
stuck with it.
-sv
More information about the Yum-devel
mailing list