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

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Jeff King
Date: Sunday, March 22, 2009 - 1:59 am

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
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
t5505-remote fails on Windows, Johannes Sixt, (Wed Mar 18, 4:42 am)
Re: t5505-remote fails on Windows, Jeff King, (Wed Mar 18, 9:18 pm)
Re: t5505-remote fails on Windows, Jeff King, (Wed Mar 18, 9:43 pm)
Re: t5505-remote fails on Windows, Jay Soffian, (Wed Mar 18, 9:56 pm)
Re: t5505-remote fails on Windows, Jeff King, (Wed Mar 18, 10:03 pm)
Re: t5505-remote fails on Windows, Johannes Sixt, (Thu Mar 19, 12:20 am)
Re: t5505-remote fails on Windows, Johannes Schindelin, (Thu Mar 19, 3:36 am)
Re: t5505-remote fails on Windows, Junio C Hamano, (Thu Mar 19, 4:02 am)
Re: t5505-remote fails on Windows, Jay Soffian, (Thu Mar 19, 8:00 am)
Re: t5505-remote fails on Windows, Jeff King, (Thu Mar 19, 12:52 pm)
Re: t5505-remote fails on Windows, Jeff King, (Thu Mar 19, 1:03 pm)
Re: t5505-remote fails on Windows, Jeff King, (Thu Mar 19, 1:04 pm)
Re: t5505-remote fails on Windows, Johannes Schindelin, (Thu Mar 19, 4:15 pm)
[PATCH] remote: improve sorting of "configure for git push ..., Jeff King, (Sun Mar 22, 1:59 am)