From dda287fc18111054553c6dfd3a0cd7bafe5e6cb9 Mon Sep 17 00:00:00 2001 From: Michael Schroeder Date: Fri, 20 Apr 2012 14:17:11 +0200 Subject: [PATCH] - support tilde in rpm version comparison --- src/evr.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- src/libsolv.ver | 3 +++ 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/src/evr.c b/src/evr.c index a27ed09..4de8d64 100644 --- a/src/evr.c +++ b/src/evr.c @@ -73,6 +73,77 @@ solv_vercmp_rpm(const char *s1, const char *q1, const char *s2, const char *q2) int r = 0; const char *e1, *e2; + for (;;) + { + while (s1 < q1 && !(*s1 >= '0' && *s1 <= '9') && + !(*s1 >= 'a' && *s1 <= 'z') && !(*s1 >= 'A' && *s1 <= 'Z') && *s1 != '~') + s1++; + while (s2 < q2 && !(*s2 >= '0' && *s2 <= '9') && + !(*s2 >= 'a' && *s2 <= 'z') && !(*s2 >= 'A' && *s2 <= 'Z') && *s2 != '~') + s2++; + if (s1 < q1 && *s1 == '~') + { + if (s2 < q2 && *s2 == '~') + { + s1++; + s2++; + continue; + } + return -1; + } + if (s2 < q2 && *s2 == '~') + return 1; + if (s1 >= q1 || s2 >= q2) + break; + if ((*s1 >= '0' && *s1 <= '9') || (*s2 >= '0' && *s2 <= '9')) + { + while (*s1 == '0' && s1[1] >= '0' && s1[1] <= '9') + s1++; + while (*s2 == '0' && s2[1] >= '0' && s2[1] <= '9') + s2++; + for (e1 = s1; *e1 >= '0' && *e1 <= '9'; ) + e1++; + for (e2 = s2; *e2 >= '0' && *e2 <= '9'; ) + e2++; + r = (e1 - s1) - (e2 - s2); + if (!r) + r = strncmp(s1, s2, e1 - s1); + if (r) + return r > 0 ? 1 : -1; + } + else + { + for (e1 = s1; (*e1 >= 'a' && *e1 <= 'z') || (*e1 >= 'A' && *e1 <= 'Z'); ) + e1++; + for (e2 = s2; (*e2 >= 'a' && *e2 <= 'z') || (*e2 >= 'A' && *e2 <= 'Z'); ) + e2++; + r = (e1 - s1) - (e2 - s2); + if (r > 0) + { + r = strncmp(s1, s2, e2 - s2); + return r >= 0 ? 1 : -1; + } + if (r < 0) + { + r = strncmp(s1, s2, e1 - s1); + return r <= 0 ? -1 : 1; + } + r = strncmp(s1, s2, e1 - s1); + if (r) + return r > 0 ? 1 : -1; + } + s1 = e1; + s2 = e2; + } + return s1 < q1 ? 1 : s2 < q2 ? -1 : 0; +} + +int +solv_vercmp_rpm_notilde(const char *s1, const char *q1, const char *s2, const char *q2) +{ + int r = 0; + const char *e1, *e2; + while (s1 < q1 && s2 < q2) { while (s1 < q1 && !(*s1 >= '0' && *s1 <= '9') && @@ -133,8 +204,10 @@ solv_vercmp_rpm(const char *s1, const char *q1, const char *s2, const char *q2) int solv_vercmp(const char *s1, const char *q1, const char *s2, const char *q2) { -#ifdef DEBIAN +#if defined(DEBIAN) return solv_vercmp_deb(s1, q1, s2, q2); +#elif defined(ARCHLINUX) + return solv_vercmp_rpm_notilde(s1, q1, s2, q2); #else return solv_vercmp_rpm(s1, q1, s2, q2); #endif @@ -144,6 +217,8 @@ solv_vercmp(const char *s1, const char *q1, const char *s2, const char *q2) # define solv_vercmp (*(pool->disttype == DISTTYPE_DEB ? &solv_vercmp_deb : &solv_ver##cmp_rpm)) #elif defined(DEBIAN) # define solv_vercmp solv_vercmp_deb +#elif defined(ARCHLINUX) +# define solv_vercmp solv_vercmp_rpm_notilde #else # define solv_vercmp solv_vercmp_rpm #endif diff --git a/src/libsolv.ver b/src/libsolv.ver index 0e141ef..ada43fa 100644 --- a/src/libsolv.ver +++ b/src/libsolv.ver @@ -240,6 +240,9 @@ SOLV_1.0 { solv_strdup; solv_timems; solv_vercmp; + solv_vercmp_deb; + solv_vercmp_rpm; + solv_vercmp_rpm_notilde; solv_version; solv_version_major; solv_version_minor; -- 2.7.4