X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=versioncmp.c;fp=versioncmp.c;h=f86ac562e294c59c829ff6da60eb0f99c712c0b4;hb=b8231660fa95f6e9e07b9e2483e254c2de045275;hp=a55c23ad57041a6f01b206e940706afb29cf21af;hpb=109064a0313c8a7c337f37936077ef3c9171d7ce;p=thirdparty%2Fgit.git diff --git a/versioncmp.c b/versioncmp.c index a55c23ad57..f86ac562e2 100644 --- a/versioncmp.c +++ b/versioncmp.c @@ -26,12 +26,15 @@ static int initialized; /* * off is the offset of the first different character in the two strings - * s1 and s2. If either s1 or s2 contains a prerelease suffix starting - * at that offset, it will be forced to be on top. + * s1 and s2. If either s1 or s2 contains a prerelease suffix containing + * that offset, then that string will be forced to be on top. * - * If both s1 and s2 contain a (different) suffix at that position, + * If both s1 and s2 contain a (different) suffix around that position, * their order is determined by the order of those two suffixes in the * configuration. + * If any of the strings contains more than one different suffixes around + * that position, then that string is sorted according to the contained + * suffix which comes first in the configuration. * * Return non-zero if *diff contains the return value for versioncmp() */ @@ -44,10 +47,21 @@ static int swap_prereleases(const char *s1, for (i = 0; i < prereleases->nr; i++) { const char *suffix = prereleases->items[i].string; - if (i1 == -1 && starts_with(s1 + off, suffix)) - i1 = i; - if (i2 == -1 && starts_with(s2 + off, suffix)) - i2 = i; + int j, start, suffix_len = strlen(suffix); + if (suffix_len < off) + start = off - suffix_len + 1; + else + start = 0; + for (j = start; j <= off; j++) + if (i1 == -1 && starts_with(s1 + j, suffix)) { + i1 = i; + break; + } + for (j = start; j <= off; j++) + if (i2 == -1 && starts_with(s2 + j, suffix)) { + i2 = i; + break; + } } if (i1 == -1 && i2 == -1) return 0;