[Yum-devel] [PATCH] Add pkg.filterObsoleters(), so we don't have to create the provide tuple and test "backwards". Also convert callers.
James Antill
james at and.org
Thu Apr 15 17:28:00 UTC 2010
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
More information about the Yum-devel
mailing list