[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