[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