Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=ebbf9baf757475b00612a9605c9c9569f2aa5264
commit ebbf9baf757475b00612a9605c9c9569f2aa5264 Author: Michel Hermier <[email protected]> Date: Wed May 1 08:58:53 2013 +0200 libpacman: Make _pacman_depcmp output 0 on success instead of previous logic, and vectorise all it's inlined versions. diff --git a/lib/libpacman/deps.c b/lib/libpacman/deps.c index ed4c72c..677d119 100644 --- a/lib/libpacman/deps.c +++ b/lib/libpacman/deps.c @@ -62,48 +62,58 @@ static void _pacman_graph_free(void *data) static int _pacman_depcmp(pmpkg_t *pkg, pmdepend_t *dep) { - int equal = 0, cmp; + int cmp = 1; const char *mod = "~="; - if(strcmp(pkg->name, dep->name) == 0 - || f_stringlist_find (_pacman_pkg_getinfo(pkg, PM_PKG_PROVIDES), dep->name)) { - if(dep->mod == PM_DEP_MOD_ANY) { - equal = 1; - } else { - cmp = _pacman_versioncmp(_pacman_pkg_getinfo(pkg, PM_PKG_VERSION), dep->version); - switch(dep->mod) { - case PM_DEP_MOD_EQ: equal = (cmp == 0); break; - case PM_DEP_MOD_GE: equal = (cmp >= 0); break; - case PM_DEP_MOD_LE: equal = (cmp <= 0); break; - case PM_DEP_MOD_LT: equal = (cmp < 0); break; - case PM_DEP_MOD_GT: equal = (cmp > 0); break; - default: equal = 1; break; - } - } + if (strcmp(pkg->name, dep->name) == 0) { + if(dep->mod == PM_DEP_MOD_ANY) { + cmp = 0; + } else { + int equal; - switch(dep->mod) { - case PM_DEP_MOD_EQ: mod = "=="; break; - case PM_DEP_MOD_GE: mod = ">="; break; - case PM_DEP_MOD_LE: mod = "<="; break; - case PM_DEP_MOD_LT: mod = "<"; break; - case PM_DEP_MOD_GT: mod = ">"; break; - default: break; + /* check for a release in depend.version. if it's + * missing remove it from p->version as well. + */ + cmp = _pacman_versioncmp(_pacman_pkg_getinfo(pkg, PM_PKG_VERSION), dep->version); + switch(dep->mod) { + case PM_DEP_MOD_EQ: equal = (cmp == 0); break; + case PM_DEP_MOD_GE: equal = (cmp >= 0); break; + case PM_DEP_MOD_LE: equal = (cmp <= 0); break; + case PM_DEP_MOD_LT: equal = (cmp < 0); break; + case PM_DEP_MOD_GT: equal = (cmp > 0); break; + default: equal = 1; break; + } + cmp = !equal; /* reverse test so 0 means success */ } + } else if (f_stringlist_find (_pacman_pkg_getinfo(pkg, PM_PKG_PROVIDES), dep->name) != NULL) { + /* accepts any version for provides */ + cmp = 0; + } else { + return 1; + } - if(strlen(dep->version) > 0) { - _pacman_log(PM_LOG_DEBUG, _("depcmp: %s-%s %s %s-%s => %s"), - _pacman_pkg_getinfo(pkg, PM_PKG_NAME), _pacman_pkg_getinfo(pkg, PM_PKG_NAME), - mod, dep->name, dep->version, - (equal ? "match" : "no match")); - } else { - _pacman_log(PM_LOG_DEBUG, _("depcmp: %s-%s %s %s => %s"), - _pacman_pkg_getinfo(pkg, PM_PKG_NAME), _pacman_pkg_getinfo(pkg, PM_PKG_VERSION), - mod, dep->name, - (equal ? "match" : "no match")); - } + switch(dep->mod) { + case PM_DEP_MOD_EQ: mod = "=="; break; + case PM_DEP_MOD_GE: mod = ">="; break; + case PM_DEP_MOD_LE: mod = "<="; break; + case PM_DEP_MOD_LT: mod = "<"; break; + case PM_DEP_MOD_GT: mod = ">"; break; + default: break; + } + + if(strlen(dep->version) > 0) { + _pacman_log(PM_LOG_DEBUG, _("depcmp: %s-%s %s %s-%s => %s"), + _pacman_pkg_getinfo(pkg, PM_PKG_NAME), _pacman_pkg_getinfo(pkg, PM_PKG_NAME), + mod, dep->name, dep->version, + (cmp == 0 ? "match" : "no match")); + } else { + _pacman_log(PM_LOG_DEBUG, _("depcmp: %s-%s %s %s => %s"), + _pacman_pkg_getinfo(pkg, PM_PKG_NAME), _pacman_pkg_getinfo(pkg, PM_PKG_VERSION), + mod, dep->name, + (cmp == 0 ? "match" : "no match")); } - return equal; + return cmp; } pmdepmissing_t *_pacman_depmiss_new(const char *target, unsigned char type, unsigned char depmod, @@ -192,7 +202,7 @@ pmlist_t *_pacman_sortbydeps(pmlist_t *targets, int mode) for(k = _pacman_pkg_getinfo(p_i, PM_PKG_DEPENDS); k && !child; k = k->next) { pmdepend_t depend; _pacman_splitdep(k->data, &depend); - child = _pacman_depcmp(p_j, &depend); + child = _pacman_depcmp(p_j, &depend) == 0; } if(child) { vertex_i->children = _pacman_list_add(vertex_i->children, vertex_j); @@ -297,7 +307,7 @@ pmlist_t *_pacman_checkdeps(pmtrans_t *trans, unsigned char op, pmlist_t *packag for(k = _pacman_pkg_getinfo(p, PM_PKG_DEPENDS); k; k = k->next) { /* don't break any existing dependencies (possible provides) */ _pacman_splitdep(k->data, &depend); - if(_pacman_depcmp(oldpkg, &depend) && !_pacman_depcmp(tp, &depend)) { + if(_pacman_depcmp(oldpkg, &depend) == 0 && _pacman_depcmp(tp, &depend) != 0) { _pacman_log(PM_LOG_DEBUG, _("checkdeps: updated '%s' won't satisfy a dependency of '%s'"), oldpkg->name, p->name); miss = _pacman_depmiss_new(p->name, PM_DEP_TYPE_DEPEND, depend.mod, @@ -320,30 +330,8 @@ pmlist_t *_pacman_checkdeps(pmtrans_t *trans, unsigned char op, pmlist_t *packag /* check database for literal packages */ for(k = _pacman_db_get_pkgcache(db); k && !found; k = k->next) { pmpkg_t *p = (pmpkg_t *)k->data; - if(!strcmp(p->name, depend.name)) { - if(depend.mod == PM_DEP_MOD_ANY) { - /* accept any version */ - found = 1; - } else { - char *ver = strdup(p->version); - /* check for a release in depend.version. if it's - * missing remove it from p->version as well. - */ - if(!index(depend.version,'-')) { - char *ptr; - for(ptr = ver; *ptr != '-'; ptr++); - *ptr = '\0'; - } - cmp = _pacman_versioncmp(ver, depend.version); - switch(depend.mod) { - case PM_DEP_MOD_EQ: found = (cmp == 0); break; - case PM_DEP_MOD_GE: found = (cmp >= 0); break; - case PM_DEP_MOD_LE: found = (cmp <= 0); break; - case PM_DEP_MOD_LT: found = (cmp < 0); break; - case PM_DEP_MOD_GT: found = (cmp > 0); break; - } - FREE(ver); - } + if (_pacman_depcmp(p, &depend) == 0) { + found = 1; } } /* check database for provides matches */ @@ -368,62 +356,19 @@ pmlist_t *_pacman_checkdeps(pmtrans_t *trans, unsigned char op, pmlist_t *packag continue; } - if(depend.mod == PM_DEP_MOD_ANY) { - /* accept any version */ + if (_pacman_depcmp(p, &depend) == 0) { found = 1; - } else { - char *ver = strdup(p->version); - /* check for a release in depend.version. if it's - * missing remove it from p->version as well. - */ - if(!index(depend.version,'-')) { - char *ptr; - for(ptr = ver; *ptr != '-'; ptr++); - *ptr = '\0'; - } - cmp = _pacman_versioncmp(ver, depend.version); - switch(depend.mod) { - case PM_DEP_MOD_EQ: found = (cmp == 0); break; - case PM_DEP_MOD_GE: found = (cmp >= 0); break; - case PM_DEP_MOD_LE: found = (cmp <= 0); break; - case PM_DEP_MOD_LT: found = (cmp < 0); break; - case PM_DEP_MOD_GT: found = (cmp > 0); break; - } - FREE(ver); } } FREELISTPTR(k); } - /* check other targets */ - for(k = packages; k && !found; k = k->next) { - pmpkg_t *p = (pmpkg_t *)k->data; - /* see if the package names match OR if p provides depend.name */ - if(!strcmp(p->name, depend.name) || f_stringlist_find (_pacman_pkg_getinfo(p, PM_PKG_PROVIDES), depend.name)) { - if(depend.mod == PM_DEP_MOD_ANY || - f_stringlist_find (_pacman_pkg_getinfo(p, PM_PKG_PROVIDES), depend.name)) { - /* depend accepts any version or p provides depend (provides - by - * definition - is for all versions) */ - found = 1; - } else { - char *ver = strdup(p->version); - /* check for a release in depend.version. if it's - * missing remove it from p->version as well. - */ - if(!index(depend.version,'-')) { - char *ptr; - for(ptr = ver; *ptr != '-'; ptr++); - *ptr = '\0'; - } - cmp = _pacman_versioncmp(ver, depend.version); - switch(depend.mod) { - case PM_DEP_MOD_EQ: found = (cmp == 0); break; - case PM_DEP_MOD_GE: found = (cmp >= 0); break; - case PM_DEP_MOD_LE: found = (cmp <= 0); break; - case PM_DEP_MOD_LT: found = (cmp < 0); break; - case PM_DEP_MOD_GT: found = (cmp > 0); break; - } - FREE(ver); - } + /* check other targets */ + for(k = packages; k && !found; k = k->next) { + pmpkg_t *p = (pmpkg_t *)k->data; + + /* see if the package names match OR if p provides depend.name */ + if (_pacman_depcmp(p, &depend) == 0) { + found = 1; } } /* else if still not found... */ _______________________________________________ Frugalware-git mailing list [email protected] http://frugalware.org/mailman/listinfo/frugalware-git
