[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