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

Seth Vidal skvidal at fedoraproject.org
Wed Dec 16 16:44:56 UTC 2009



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 at lists.baseurl.org
> http://lists.baseurl.org/mailman/listinfo/yum-devel
>


More information about the Yum-devel mailing list