From 932c8d8f499f26d3f7ac0b5b0307f6a886396a0d Mon Sep 17 00:00:00 2001 From: pixdamix@gmail.com Date: Thu, 22 Nov 2012 04:18:17 -0500 Subject: pkg_depends: fix version constraints * factor parsing version constraint to str_to_constraint and use that from pkg (pkg_version_satisfied) and also pkg_depends (parseDepends) * fix constraint_to_str(), for EARLIER and LATER it was using '<' and '>' which is parsed later as EARLIER_EQUAL and LATER_EQUAL * show notice when deprecated '<' or '>' is used Signed-off-by: Martin Jansa git-svn-id: http://opkg.googlecode.com/svn/trunk@644 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358 --- (limited to 'libopkg') diff --git a/libopkg/pkg.c b/libopkg/pkg.c index 39f4b30..23055f3 100644 --- a/libopkg/pkg.c +++ b/libopkg/pkg.c @@ -968,28 +968,24 @@ pkg_version_satisfied(pkg_t *it, pkg_t *ref, const char *op) int r; r = pkg_compare_versions(it, ref); + char *op2 = op; + enum version_constraint constraint = str_to_constraint(&op2); - if (strcmp(op, "<=") == 0 || strcmp(op, "<") == 0) { - return r <= 0; - } - - if (strcmp(op, ">=") == 0 || strcmp(op, ">") == 0) { - return r >= 0; - } - - if (strcmp(op, "<<") == 0) { - return r < 0; - } - - if (strcmp(op, ">>") == 0) { - return r > 0; - } - - if (strcmp(op, "=") == 0) { - return r == 0; + switch (constraint) + { + case EARLIER_EQUAL: + return r <= 0; + case LATER_EQUAL: + return r >= 0; + case EARLIER: + return r < 0; + case LATER: + return r > 0; + case EQUAL: + return r == 0; + case NONE: + opkg_msg(ERROR, "Unknown operator: %s.\n", op); } - - opkg_msg(ERROR, "Unknown operator: %s.\n", op); return 0; } diff --git a/libopkg/pkg_depends.c b/libopkg/pkg_depends.c index d45f697..243fac7 100644 --- a/libopkg/pkg_depends.c +++ b/libopkg/pkg_depends.c @@ -781,7 +781,7 @@ constraint_to_str(enum version_constraint c) case NONE: return ""; case EARLIER: - return "< "; + return "<< "; case EARLIER_EQUAL: return "<= "; case EQUAL: @@ -789,12 +789,51 @@ constraint_to_str(enum version_constraint c) case LATER_EQUAL: return ">= "; case LATER: - return "> "; + return ">> "; } return ""; } +enum version_constraint +str_to_constraint(char **str) +{ + if(!strncmp(*str, "<<", 2)){ + *str += 2; + return EARLIER; + } + else if(!strncmp(*str, "<=", 2)){ + *str += 2; + return EARLIER_EQUAL; + } + else if(!strncmp(*str, ">=", 2)){ + *str += 2; + return LATER_EQUAL; + } + else if(!strncmp(*str, ">>", 2)){ + *str += 2; + return LATER; + } + else if(!strncmp(*str, "=", 1)){ + *str += 1; + return EQUAL; + } + /* should these be here to support deprecated designations; dpkg does */ + else if(!strncmp(*str, "<", 1)){ + *str += 1; + opkg_msg(NOTICE, "Deprecated version constraint '<' was used with the same meaning as '<='. Use '<<' for EARLIER constraint.\n"); + return EARLIER_EQUAL; + } + else if(!strncmp(*str, ">", 1)){ + *str += 1; + opkg_msg(NOTICE, "Deprecated version constraint '>' was used with the same meaning as '>='. Use '>>' for LATER constraint.\n"); + return LATER_EQUAL; + } + else { + return NONE; + } +} + /* * Returns a printable string for pkg's dependency at the specified idx. The * resultant string must be passed to free() by the caller. @@ -949,35 +988,7 @@ static int parseDepends(compound_depend_t *compound_depend, /* extract constraint and version */ if(*src == '('){ src++; - if(!strncmp(src, "<<", 2)){ - possibilities[i]->constraint = EARLIER; - src += 2; - } - else if(!strncmp(src, "<=", 2)){ - possibilities[i]->constraint = EARLIER_EQUAL; - src += 2; - } - else if(!strncmp(src, ">=", 2)){ - possibilities[i]->constraint = LATER_EQUAL; - src += 2; - } - else if(!strncmp(src, ">>", 2)){ - possibilities[i]->constraint = LATER; - src += 2; - } - else if(!strncmp(src, "=", 1)){ - possibilities[i]->constraint = EQUAL; - src++; - } - /* should these be here to support deprecated designations; dpkg does */ - else if(!strncmp(src, "<", 1)){ - possibilities[i]->constraint = EARLIER_EQUAL; - src++; - } - else if(!strncmp(src, ">", 1)){ - possibilities[i]->constraint = LATER_EQUAL; - src++; - } + possibilities[i]->constraint = str_to_constraint(&src); /* now we have any constraint, pass space to version string */ while(isspace(*src)) src++; diff --git a/libopkg/pkg_depends.h b/libopkg/pkg_depends.h index ca0801f..685a722 100644 --- a/libopkg/pkg_depends.h +++ b/libopkg/pkg_depends.h @@ -87,6 +87,7 @@ pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg); int pkg_dependence_satisfiable(depend_t *depend); int pkg_dependence_satisfied(depend_t *depend); const char* constraint_to_str(enum version_constraint c); +enum version_constraint str_to_constraint(char **str); int is_pkg_in_pkg_vec(pkg_vec_t * vec, pkg_t * pkg); #endif -- cgit v0.9.1