Skip to content

Commit

Permalink
- support tilde in rpm version comparison
Browse files Browse the repository at this point in the history
  • Loading branch information
mlschroe committed Apr 20, 2012
1 parent 110d964 commit dda287f
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 1 deletion.
77 changes: 76 additions & 1 deletion src/evr.c
Original file line number Diff line number Diff line change
Expand Up @@ -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') &&
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down
3 changes: 3 additions & 0 deletions src/libsolv.ver
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit dda287f

Please sign in to comment.