[Yum-devel] [PATCH 1/2] Add obsoleted and provides index checking, don't default to doing them though
James Antill
james at and.org
Thu Apr 15 05:35:03 UTC 2010
---
yum/__init__.py | 19 ++++++++++++++++---
yum/rpmsack.py | 43 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 59 insertions(+), 3 deletions(-)
diff --git a/yum/__init__.py b/yum/__init__.py
index 35da86e..cc5064e 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -1139,9 +1139,11 @@ class YumBase(depsolve.Depsolve):
toRemove.add(dep)
self._getDepsToRemove(dep, deptree, toRemove)
- def _rpmdb_warn_checks(self, out=None, warn=True, chkcmd='all',header=None):
+ def _rpmdb_warn_checks(self, out=None, warn=True, chkcmd=None, header=None):
if out is None:
out = self.logger.warning
+ if chkcmd is None:
+ chkcmd = ['dependencies', 'duplicates']
if header is None:
# FIXME: _N()
msg = _("** Found %d pre-existing rpmdb problem(s),"
@@ -1150,17 +1152,28 @@ class YumBase(depsolve.Depsolve):
if warn:
out(_('Warning: RPMDB altered outside of yum.'))
+ if type(chkcmd) in (type([]), type(set())):
+ chkcmd = set(chkcmd)
+ else:
+ chkcmd = set([chkcmd])
+
rc = 0
probs = []
- if chkcmd in ('all', 'dependencies'):
+ if chkcmd.intersection(set(('all', 'dependencies'))):
prob2ui = {'requires' : _('missing requires'),
'conflicts' : _('installed conflict')}
probs.extend(self.rpmdb.check_dependencies())
- if chkcmd in ('all', 'duplicates'):
+ if chkcmd.intersection(set(('all', 'duplicates'))):
iopkgs = set(self.conf.installonlypkgs)
probs.extend(self.rpmdb.check_duplicates(iopkgs))
+ if chkcmd.intersection(set(('all', 'obsoleted'))):
+ probs.extend(self.rpmdb.check_obsoleted())
+
+ if chkcmd.intersection(set(('all', 'provides'))):
+ probs.extend(self.rpmdb.check_provides())
+
header(len(probs))
for prob in sorted(probs):
out(prob)
diff --git a/yum/rpmsack.py b/yum/rpmsack.py
index e113802..e18df3f 100644
--- a/yum/rpmsack.py
+++ b/yum/rpmsack.py
@@ -114,6 +114,23 @@ class RPMDBProblemDuplicate(RPMDBProblem):
return _("%s is a duplicate with %s") % (self.pkg, self.duplicate)
+class RPMDBProblemObsoleted(RPMDBProblem):
+ def __init__(self, pkg, **kwargs):
+ RPMDBProblem.__init__(self, pkg, "obsoleted", **kwargs)
+
+ def __str__(self):
+ return _("%s is obsoleted by %s") % (self.pkg, self.obsoleter)
+
+
+class RPMDBProblemProvides(RPMDBProblem):
+ def __init__(self, pkg, **kwargs):
+ RPMDBProblem.__init__(self, pkg, "provides", **kwargs)
+
+ def __str__(self):
+ return _("%s provides %s but it cannot be found") % (self.pkg,
+ self.provide)
+
+
class RPMDBPackageSack(PackageSackBase):
'''
Represent rpmdb as a packagesack
@@ -1298,6 +1315,32 @@ class RPMDBPackageSack(PackageSackBase):
problems.append(RPMDBProblemDuplicate(pkg, duplicate=last))
return problems
+ def check_obsoleted(self):
+ """ Checks for any packages which are obsoleted by other packages. """
+ obsoleters = []
+ problems = []
+ for pkg in sorted(self.returnPackages()):
+ if not pkg.obsoletes:
+ 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))
+ return problems
+
+ def check_provides(self):
+ """ For each package, check that a provides search for it's name (and
+ everything it provides) finds it. """
+ problems = []
+ for pkg in sorted(self.returnPackages()):
+ for provtup in pkg.provides:
+ name, flags, version = provtup
+ if pkg not in self.getProvides(name, flags, version):
+ problems.append(RPMDBProblemProvides(pkg, provide=provtup))
+ break
+ return problems
def _sanitize(path):
return path.replace('/', '').replace('~', '')
--
1.6.6.1
More information about the Yum-devel
mailing list