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

[PATCH] remote: improve sorting of "configure for git push" list

From
Jeff King <peff@peff.net>
Date
Mar 22, 2009, 08:59 UTC
Message-ID
<20090322085920.GA5201@coredump.intra.peff.net>
In-Reply-To
<20090319200308.GB17028@coredump.intra.peff.net>

The data structure used to store this list is a string_list of sources with the destination in the util member. The current code just sorts on the source; if a single source is pushed to two different destination refs at a remote, then the order in which they are printed is non-deterministic.

This patch implements a comparison using both fields. Besides being a little nicer on the eyes, giving a stable sort prevents false negatives in the test suite when comparing output.

Signed-off-by: Jeff King <peff@peff.net>
---
The discussion of the proper interface to the one-line wrapper to qsort
didn't really resolve anything. It seems that the constraints of C make
a nice wrapper a little painful, so let's just use a bare qsort. Once
again, I really don't care what it looks like, so feel free to mark it
up if you prefer differently; I just want it off my todo list, and to
let JSixt run his tests in peace.

I did have one somewhat sick thought for an API: have string_list's cmp_items (or an alternate cmp_items_with_util) treat a non-NULL util member as a pointer to a string, and use it as a secondary key in the sort. It works here because the first member of the push_info struct is the secondary key. But I think it is a bit too subtle for my taste.

 builtin-remote.c |   17 ++++++++++++++++-
 1 files changed, 16 insertions(+), 1 deletions(-)
diff --git a/builtin-remote.c b/builtin-remote.c
index 993acd6..9ef846f 100644
--- a/builtin-remote.c
+++ b/builtin-remote.c
@@ -922,6 +922,20 @@ int add_push_to_show_info(struct string_list_item *push_item, void *cb_data)
 	return 0;
 }
 
+/*
+ * Sorting comparison for a string list that has push_info
+ * structs in its util field
+ */
+static int cmp_string_with_push(const void *va, const void *vb)
+{
+	const struct string_list_item *a = va;
+	const struct string_list_item *b = vb;
+	const struct push_info *a_push = a->util;
+	const struct push_info *b_push = b->util;
+	int cmp = strcmp(a->string, b->string);
+	return cmp ? cmp : strcmp(a_push->dest, b_push->dest);
+}
+
 int show_push_info_item(struct string_list_item *item, void *cb_data)
 {
 	struct show_info *show_info = cb_data;
@@ -1032,7 +1046,8 @@ static int show(int argc, const char **argv)
 
 		info.width = info.width2 = 0;
 		for_each_string_list(add_push_to_show_info, &states.push, &info);
-		sort_string_list(info.list);
+		qsort(info.list->items, info.list->nr,
+			sizeof(*info.list->items), cmp_string_with_push);
 		if (info.list->nr)
 			printf("  Local ref%s configured for 'git push'%s:\n",
 				info.list->nr > 1 ? "s" : "",
-- 
1.6.2.1.276.gd47fa
Previous: Johannes SchindelinNext: Jay Soffian
Message 13 of 18 in “t5505-remote fails on Windows”
  1. Johannes SixtMar 18, 2009
  2. Jeff KingMar 19, 2009
  3. Jeff KingMar 19, 2009
  4. Jay SoffianMar 19, 2009
  5. Jeff KingMar 19, 2009
  6. Johannes SixtMar 19, 2009
  7. Jeff KingMar 19, 2009
  8. Johannes SchindelinMar 19, 2009
  9. Junio C HamanoMar 19, 2009
  10. Jay SoffianMar 19, 2009
  11. Jeff KingMar 19, 2009
  12. Johannes SchindelinMar 19, 2009
  13. remote: improve sorting of "configure for git push" listJeff King, Mar 22, 2009
  14. Jay SoffianMar 22, 2009
  15. Junio C HamanoMar 22, 2009
  16. Johannes SixtMar 23, 2009
  17. Junio C HamanoMar 23, 2009
  18. Jeff KingMar 19, 2009

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.