[pacman-dev] [PATCH 2/5] alpm/depcmp: new NODEPVERSION flag

Dan McGee dpmcgee at gmail.com
Wed Jan 19 13:57:33 EST 2011


On Wed, Jan 19, 2011 at 11:13 AM, Florian Pritz <bluewind at xssn.at> wrote:
> From: Xavier Chantry <chantry.xavier at gmail.com>
>
> This flag allows to disable version checking in dependency resolving
> code.
>
> depcmp_tolerant respects the NODEPVERSION flag but we still keep the
> original strict depcmp. The idea is to reduce the impact of the
> NODEPVERSION flag by using it in fewer places.
>
> I replaced almost all depcmp calls by depcmp_tolerant in deps.c (except
> in the public find_satisfier used by deptest / pacman -T), but I kept
> depcmp in sync.c and conflict.c

Seems mostly OK, but without digging in I don't really understand why
some get changed and some do not.

> Signed-off-by: Xavier Chantry <chantry.xavier at gmail.com>
> ---
>  lib/libalpm/alpm.h |    2 +-
>  lib/libalpm/deps.c |   43 +++++++++++++++++++++++++++++++++++--------
>  lib/libalpm/deps.h |    1 +
>  3 files changed, 37 insertions(+), 9 deletions(-)
>
> diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
> index 7c4cd48..66258f8 100644
> --- a/lib/libalpm/alpm.h
> +++ b/lib/libalpm/alpm.h
> @@ -275,7 +275,7 @@ typedef enum _pmtransflag_t {
>        PM_TRANS_FLAG_NODEPS = 1,
>        PM_TRANS_FLAG_FORCE = (1 << 1),
>        PM_TRANS_FLAG_NOSAVE = (1 << 2),
> -       /* (1 << 3) flag can go here */
> +       PM_TRANS_FLAG_NODEPVERSION = (1 << 3),
>        PM_TRANS_FLAG_CASCADE = (1 << 4),
>        PM_TRANS_FLAG_RECURSE = (1 << 5),
>        PM_TRANS_FLAG_DBONLY = (1 << 6),
> diff --git a/lib/libalpm/deps.c b/lib/libalpm/deps.c
> index 3d4b1df..3c057a6 100644
> --- a/lib/libalpm/deps.c
> +++ b/lib/libalpm/deps.c
> @@ -195,7 +195,7 @@ pmpkg_t *_alpm_find_dep_satisfier(alpm_list_t *pkgs, pmdepend_t *dep)
>
>        for(i = pkgs; i; i = alpm_list_next(i)) {
>                pmpkg_t *pkg = i->data;
> -               if(_alpm_depcmp(pkg, dep)) {
> +               if(_alpm_depcmp_tolerant(pkg, dep)) {
>                        return(pkg);
>                }
>        }
> @@ -319,12 +319,20 @@ static int dep_vercmp(const char *version1, pmdepmod_t mod,
>        return(equal);
>  }
>
> -int _alpm_depcmp(pmpkg_t *pkg, pmdepend_t *dep)
> +/* nodepversion: skip version checking */
> +static int _depcmp(pmpkg_t *pkg, pmdepend_t *dep, int nodepversion)
>  {
>        alpm_list_t *i;
>        const char *pkgname = pkg->name;
>        const char *pkgversion = pkg->version;
>        int satisfy = 0;
> +       int depmod;
> +
> +       if(nodepversion) {
> +               depmod = PM_DEP_MOD_ANY;
> +       } else {
> +               depmod = dep->mod;
> +       }
>
>        /* check (pkg->name, pkg->version) */
>        if(pkg->name_hash && dep->name_hash
> @@ -332,7 +340,7 @@ int _alpm_depcmp(pmpkg_t *pkg, pmdepend_t *dep)
>                /* skip more expensive checks */
>        } else {
>                satisfy = (strcmp(pkgname, dep->name) == 0
> -                               && dep_vercmp(pkgversion, dep->mod, dep->version));
> +                               && dep_vercmp(pkgversion, depmod, dep->version));
>                if(satisfy) {
>                        return(satisfy);
>                }
> @@ -344,7 +352,7 @@ int _alpm_depcmp(pmpkg_t *pkg, pmdepend_t *dep)
>                const char *provver = strchr(provision, '=');
>
>                if(provver == NULL) { /* no provision version */
> -                       satisfy = (dep->mod == PM_DEP_MOD_ANY
> +                       satisfy = (depmod == PM_DEP_MOD_ANY
>                                        && strcmp(provision, dep->name) == 0);
>                } else {
>                        /* This is a bit tricker than the old code for performance reasons. To
> @@ -356,13 +364,32 @@ int _alpm_depcmp(pmpkg_t *pkg, pmdepend_t *dep)
>                        provver += 1;
>                        satisfy = (strlen(dep->name) == namelen
>                                        && strncmp(provision, dep->name, namelen) == 0
> -                                       && dep_vercmp(provver, dep->mod, dep->version));
> +                                       && dep_vercmp(provver, depmod, dep->version));
>                }
>        }
>
>        return(satisfy);
>  }
>
> +/* tolerant : respects NODEPVERSION flag */
> +int _alpm_depcmp_tolerant(pmpkg_t *pkg, pmdepend_t *dep)
> +{
> +       int nodepversion = 0;
> +       int flags = alpm_trans_get_flags();
> +
> +       if (flags != -1) {
> +               nodepversion = flags & PM_TRANS_FLAG_NODEPVERSION;
> +       }
> +
> +       return(_depcmp(pkg, dep, nodepversion));
> +}
> +
> +/* strict : ignores NODEPVERSION flag */
> +int _alpm_depcmp(pmpkg_t *pkg, pmdepend_t *dep)
> +{
> +       return(_depcmp(pkg, dep, 0));
> +}
> +
>  pmdepend_t *_alpm_splitdep(const char *depstring)
>  {
>        pmdepend_t *depend;
> @@ -527,7 +554,7 @@ pmpkg_t *_alpm_resolvedep(pmdepend_t *dep, alpm_list_t *dbs,
>        /* 1. literals */
>        for(i = dbs; i; i = i->next) {
>                pmpkg_t *pkg = _alpm_db_get_pkgfromcache(i->data, dep->name);
> -               if(pkg && _alpm_depcmp(pkg, dep) && !_alpm_pkg_find(excluding, pkg->name)) {
> +               if(pkg && _alpm_depcmp_tolerant(pkg, dep) && !_alpm_pkg_find(excluding, pkg->name)) {
>                        if(_alpm_pkg_should_ignore(pkg)) {
>                                int install = 0;
>                                if (prompt) {
> @@ -548,7 +575,7 @@ pmpkg_t *_alpm_resolvedep(pmdepend_t *dep, alpm_list_t *dbs,
>        for(i = dbs; i; i = i->next) {
>                for(j = _alpm_db_get_pkgcache(i->data); j; j = j->next) {
>                        pmpkg_t *pkg = j->data;
> -                       if(_alpm_depcmp(pkg, dep) && strcmp(pkg->name, dep->name) != 0 &&
> +                       if(_alpm_depcmp_tolerant(pkg, dep) && strcmp(pkg->name, dep->name) != 0 &&
>                                     !_alpm_pkg_find(excluding, pkg->name)) {
>                                if(_alpm_pkg_should_ignore(pkg)) {
>                                        int install = 0;
> @@ -674,7 +701,7 @@ int _alpm_dep_edge(pmpkg_t *pkg1, pmpkg_t *pkg2)
>  {
>        alpm_list_t *i;
>        for(i = alpm_pkg_get_depends(pkg1); i; i = i->next) {
> -               if(_alpm_depcmp(pkg2, i->data)) {
> +               if(_alpm_depcmp_tolerant(pkg2, i->data)) {
>                        return(1);
>                }
>        }
> diff --git a/lib/libalpm/deps.h b/lib/libalpm/deps.h
> index bd5e9a4..86070ab 100644
> --- a/lib/libalpm/deps.h
> +++ b/lib/libalpm/deps.h
> @@ -57,6 +57,7 @@ int _alpm_dep_edge(pmpkg_t *pkg1, pmpkg_t *pkg2);
>  pmdepend_t *_alpm_splitdep(const char *depstring);
>  pmpkg_t *_alpm_find_dep_satisfier(alpm_list_t *pkgs, pmdepend_t *dep);
>  int _alpm_depcmp(pmpkg_t *pkg, pmdepend_t *dep);
> +int _alpm_depcmp_tolerant(pmpkg_t *pkg, pmdepend_t *dep);
>
>  #endif /* _ALPM_DEPS_H */
>
> --
> 1.7.3.5
>
>


More information about the pacman-dev mailing list