--- 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 _______________________________________________ Yum-devel mailing list Yum-devel@lists.baseurl.org http://lists.baseurl.org/mailman/listinfo/yum-devel