summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpixdamix@gmail.com <pixdamix@gmail.com@e8e0d7a0-c8d9-11dd-a880-a1081c7ac358>2012-11-22 04:18:17 (EST)
committer pixdamix@gmail.com <pixdamix@gmail.com@e8e0d7a0-c8d9-11dd-a880-a1081c7ac358>2012-11-22 04:18:17 (EST)
commit932c8d8f499f26d3f7ac0b5b0307f6a886396a0d (patch)
tree76ae05d6d664f45e6cb3d2d649319dcef989f363
parent15f255915ce893750165c89af9d1ebbbc571a8dc (diff)
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 <Martin.Jansa@gmail.com> git-svn-id: http://opkg.googlecode.com/svn/trunk@644 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358
-rw-r--r--libopkg/pkg.c36
-rw-r--r--libopkg/pkg_depends.c73
-rw-r--r--libopkg/pkg_depends.h1
3 files changed, 59 insertions, 51 deletions
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