diff options
-rw-r--r-- | Documentation/config.txt | 8 | ||||
-rwxr-xr-x | t/t7004-tag.sh | 9 | ||||
-rw-r--r-- | versioncmp.c | 28 |
3 files changed, 34 insertions, 11 deletions
diff --git a/Documentation/config.txt b/Documentation/config.txt index a0ab66aae7..2e053f9048 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -3047,8 +3047,12 @@ versionsort.prereleaseSuffix:: This variable can be specified multiple times, once per suffix. The order of suffixes in the config file determines the sorting order (e.g. if "-pre" appears before "-rc" in the config file then 1.0-preXX -is sorted before 1.0-rcXX). The sorting order between different -suffixes is undefined if they are in multiple config files. +is sorted before 1.0-rcXX). +If more than one suffixes match the same tagname, then that tagname will +be sorted according to the matching suffix which comes first in the +configuration. +The sorting order between different suffixes is undefined if they are +in multiple config files. web.browser:: Specify a web browser that may be used by some commands. diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh index 6445aae29b..c7aaace8cd 100755 --- a/t/t7004-tag.sh +++ b/t/t7004-tag.sh @@ -1538,7 +1538,7 @@ test_expect_success 'reverse version sort with prerelease reordering' ' test_cmp expect actual ' -test_expect_failure 'version sort with prerelease reordering and common leading character' ' +test_expect_success 'version sort with prerelease reordering and common leading character' ' test_config versionsort.prereleaseSuffix -before && git tag foo1.7-before1 && git tag foo1.7 && @@ -1552,7 +1552,7 @@ test_expect_failure 'version sort with prerelease reordering and common leading test_cmp expect actual ' -test_expect_failure 'version sort with prerelease reordering, multiple suffixes and common leading character' ' +test_expect_success 'version sort with prerelease reordering, multiple suffixes and common leading character' ' test_config versionsort.prereleaseSuffix -before && git config --add versionsort.prereleaseSuffix -after && git tag -l --sort=version:refname "foo1.7*" >actual && @@ -1564,6 +1564,11 @@ test_expect_failure 'version sort with prerelease reordering, multiple suffixes test_cmp expect actual ' +test_expect_success 'version sort with very long prerelease suffix' ' + test_config versionsort.prereleaseSuffix -very-looooooooooooooooooooooooong-prerelease-suffix && + git tag -l --sort=version:refname +' + run_with_limited_stack () { (ulimit -s 128 && "$@") } 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; |