On Fri, 11 Dec 2009, James Antill wrote: ACK. -sv
--- yum/rpmsack.py | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 64 insertions(+), 0 deletions(-) diff --git a/yum/rpmsack.py b/yum/rpmsack.py index ee63c6e..23ebd3e 100644 --- a/yum/rpmsack.py +++ b/yum/rpmsack.py @@ -21,6 +21,7 @@ import os import os.path from rpmUtils import miscutils +from rpmUtils import arch from rpmUtils.transaction import initReadOnlyTransaction import misc import Errors @@ -34,6 +35,8 @@ import re from yum.i18n import to_unicode import constants +import yum.depsolve + class RPMInstalledPackage(YumInstalledPackage): def __init__(self, rpmhdr, index, rpmdb): @@ -1043,6 +1046,67 @@ class RPMDBPackageSack(PackageSackBase): return sorted(pkgs.keys()) + def check_dependencies(self, pkgs=None): + """ Checks for any missing dependencies. """ + + if pkgs is None: + pkgs = self.returnPackages() + + providers = set() # Speedup, as usual :) + problems = [] + for pkg in sorted(pkgs): # The sort here is mainly for "UI" + for rreq in pkg.requires: + if rreq[0].startswith('rpmlib'): continue + if rreq in providers: continue + + (req, flags, ver) = rreq + if self.getProvides(req, flags, ver): + providers.add(rreq) + continue + flags = yum.depsolve.flags.get(flags, flags) + missing = miscutils.formatRequire(req, ver, flags) + problems.append((pkg, "requires", missing, [])) + + for creq in pkg.conflicts: + if creq[0].startswith('rpmlib'): continue + + (req, flags, ver) = creq + res = self.getProvides(req, flags, ver) + if not res: + continue + flags = yum.depsolve.flags.get(flags, flags) + found = miscutils.formatRequire(req, ver, flags) + problems.append((pkg, "conflicts", found, res)) + return problems + + def _iter_two_pkgs(self, ignore): + last = None + for pkg in sorted(self.returnPackages()): + if pkg.name in ignore: + continue + if last is None: + last = pkg + continue + yield last, pkg + last = pkg + + def check_duplicates(self, ignore=[]): + """ Checks for any missing dependencies. """ + + problems = [] + for last, pkg in self._iter_two_pkgs(ignore): + if pkg.name != last.name: + continue + if pkg.verEQ(last) and pkg != last: + if arch.isMultiLibArch(pkg.arch) and last.arch != 'noarch': + continue + if arch.isMultiLibArch(last.arch) and pkg.arch != 'noarch': + continue + + # More than one pkg, they aren't version equal, or aren't multiarch + problems.append((pkg, "dup", last)) + return problems + def _sanitize(path): return path.replace('/', '').replace('~', '') -- 1.6.5.2 _______________________________________________ Yum-devel mailing list Yum-devel@lists.baseurl.org http://lists.baseurl.org/mailman/listinfo/yum-devel
_______________________________________________ Yum-devel mailing list Yum-devel@lists.baseurl.org http://lists.baseurl.org/mailman/listinfo/yum-devel