[Yum-devel] [PATCH 1/2] Add check_*() APIs to rpmdb, for when version doesn't match etc.

James Antill james at and.org
Fri Dec 11 07:11:09 UTC 2009


---
 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



More information about the Yum-devel mailing list