git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCHv2 4/7] versioncmp: pass full tagnames to swap_prereleases()

From
SZEDER Gábor <szeder.dev@gmail.com>
Date
Dec 8, 2016, 14:23 UTC
Message-ID
<20161208142401.1329-5-szeder.dev@gmail.com>
In-Reply-To
<20161208142401.1329-1-szeder.dev@gmail.com>

The swap_prereleases() helper function is responsible for finding configured prerelease suffixes in a pair of tagnames to be compared, but this function currently gets to see only the parts of those two tagnames starting at the first different character. To fix some issues related to the common part of two tagnames overlapping with leading part of a prerelease suffix, this helper function must see both full tagnames.

In preparation for the fix in the following patch, refactor swap_prereleases() and its caller to pass two full tagnames and an additional offset indicating the position of the first different character.

While updating the comment describing that function, remove the sentence about not dealing with both tagnames having the same suffix. Currently it doesn't add much value (we know that there is a different character, so it's obvious that it can't possibly be the same suffix in both), and at the end of this patch series it won't even be true anymore.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
---
 versioncmp.c | 29 +++++++++++++----------------
 1 file changed, 13 insertions(+), 16 deletions(-)
diff --git a/versioncmp.c b/versioncmp.c
index 80bfd109f..a55c23ad5 100644
--- a/versioncmp.c
+++ b/versioncmp.c
@@ -25,32 +25,28 @@ static const struct string_list *prereleases;
 static int initialized;
 
 /*
- * p1 and p2 point to the first different character in two strings. If
- * either p1 or p2 starts with a prerelease suffix, it will be forced
- * to be on top.
+ * 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.
  *
- * If both p1 and p2 start with (different) suffix, the order is
- * determined by config file.
- *
- * Note that we don't have to deal with the situation when both p1 and
- * p2 start with the same suffix because the common part is already
- * consumed by the caller.
+ * If both s1 and s2 contain a (different) suffix at that position,
+ * their order is determined by the order of those two suffixes in the
+ * configuration.
  *
  * Return non-zero if *diff contains the return value for versioncmp()
  */
-static int swap_prereleases(const void *p1_,
-			    const void *p2_,
+static int swap_prereleases(const char *s1,
+			    const char *s2,
+			    int off,
 			    int *diff)
 {
-	const char *p1 = p1_;
-	const char *p2 = p2_;
 	int i, i1 = -1, i2 = -1;
 
 	for (i = 0; i < prereleases->nr; i++) {
 		const char *suffix = prereleases->items[i].string;
-		if (i1 == -1 && starts_with(p1, suffix))
+		if (i1 == -1 && starts_with(s1 + off, suffix))
 			i1 = i;
-		if (i2 == -1 && starts_with(p2, suffix))
+		if (i2 == -1 && starts_with(s2 + off, suffix))
 			i2 = i;
 	}
 	if (i1 == -1 && i2 == -1)
@@ -121,7 +117,8 @@ int versioncmp(const char *s1, const char *s2)
 		initialized = 1;
 		prereleases = git_config_get_value_multi("versionsort.prereleasesuffix");
 	}
-	if (prereleases && swap_prereleases(p1 - 1, p2 - 1, &diff))
+	if (prereleases && swap_prereleases(s1, s2, (const char *) p1 - s1 - 1,
+					    &diff))
 		return diff;
 
 	state = result_type[state * 3 + (((c2 == '0') + (isdigit (c2) != 0)))];
-- 
2.11.0.78.g5a2d011
Previous: SZEDER GáborNext: Jeff King
Message 35 of 40 in “2.10.0: multiple versionsort.prereleasesuffix buggy?”
  1. Leho Kraav (Conversion Ready)Sep 5, 2016
  2. Jeff KingSep 5, 2016
  3. SZEDER GáborSep 6, 2016
  4. Jeff KingSep 6, 2016
  5. SZEDER GáborSep 6, 2016
  6. 0/5 Fix version sort prerelease reordering bugSZEDER Gábor, Sep 7, 2016
  7. 1/5 t7004-tag: delete unnecessary tags with test_when_finishedSZEDER Gábor, Sep 7, 2016
  8. 2/5 t7004-tag: use test_config helperSZEDER Gábor, Sep 7, 2016
  9. 4/5 versioncmp: pass full tagnames to swap_prereleases()SZEDER Gábor, Sep 7, 2016
  10. Junio C HamanoSep 8, 2016
  11. SZEDER GáborSep 8, 2016
  12. Junio C HamanoSep 8, 2016
  13. 3/5 t7004-tag: add version sort tests to show prerelease reordering issuesSZEDER Gábor, Sep 7, 2016
  14. 5/5 versioncmp: cope with common leading parts in versionsort.prereleaseSuffixSZEDER Gábor, Sep 7, 2016
  15. SZEDER GáborSep 7, 2016
  16. Duy NguyenSep 9, 2016
  17. SZEDER GáborOct 5, 2016
  18. Junio C HamanoOct 5, 2016
  19. SZEDER GáborOct 5, 2016
  20. Junio C HamanoOct 5, 2016
  21. Jacob KellerOct 6, 2016
  22. Duy NguyenOct 6, 2016
  23. 0/7 Fix and generalize version sort reorderingSZEDER Gábor, Dec 8, 2016
  24. 1/7 t7004-tag: delete unnecessary tags with test_when_finishedSZEDER Gábor, Dec 8, 2016
  25. 3/7 t7004-tag: add version sort tests to show prerelease reordering issuesSZEDER Gábor, Dec 8, 2016
  26. 5/7 versioncmp: cope with common part overlapping with prerelease suffixSZEDER Gábor, Dec 8, 2016
  27. Junio C HamanoDec 12, 2016
  28. SZEDER GáborDec 13, 2016
  29. Junio C HamanoDec 13, 2016
  30. 7/7 versioncmp: generalize version sort suffix reorderingSZEDER Gábor, Dec 8, 2016
  31. Junio C HamanoDec 8, 2016
  32. 6/7 versioncmp: use earliest-longest contained suffix to determine sorting orderSZEDER Gábor, Dec 8, 2016
  33. 5/7 squash! versioncmp: use earliest-longest contained suffix to determine sorting orderSZEDER Gábor, Dec 8, 2016
  34. 2/7 t7004-tag: use test_config helperSZEDER Gábor, Dec 8, 2016
  35. 4/7 versioncmp: pass full tagnames to swap_prereleases()SZEDER Gábor, Dec 8, 2016
  36. Jeff KingDec 14, 2016
  37. Junio C HamanoDec 14, 2016
  38. SZEDER GáborDec 20, 2016
  39. Jeff KingDec 20, 2016
  40. Leho Kraav (Conversion Ready)Sep 6, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.