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

Re: [PATCH v3 2/2] help: cleanup the contruction of keys_uniq

From
Junio C Hamano <gitster@pobox.com>
Date
Feb 22, 2026, 05:05 UTC
Message-ID
<xmqqwm05qsei.fsf@gitster.g>
In-Reply-To
<20260221162359.43336-2-amishhhaaaa@gmail.com>
Amisha Chhajed <amishhhaaaa@gmail.com> writes:
Show 11 quoted lines
> From: Amisha Chhajed <136238836+amishhaa@users.noreply.github.com>
>
> +static void show_config_sections(struct string_list *keys)
> +{
> ...
> +}
> +
> +static void show_config_vars(struct string_list *keys)
> +{
> ...
> +}

The striking similarity of the body of the loops in these two functions bothered me enough to try writing this; the result does not look too bad, I think.

By the way, I'd really prefer to see contributors *NOT* to use undeliverable and/or bouncing e-mail addresses when working on this project, as I'd always have to edit the Cc: list to avoid getting bounces.

Thanks.
 builtin/help.c | 72 ++++++++++++++++++++++------------------------------------
 1 file changed, 27 insertions(+), 45 deletions(-)
diff --git c/builtin/help.c w/builtin/help.c
index b70de09864..bc5c5a556c 100644
--- c/builtin/help.c
+++ w/builtin/help.c
@@ -120,36 +120,37 @@ static void show_config_human(struct string_list *keys)
 	}
 }
 
-static void show_config_sections(struct string_list *keys)
+static void grab_leading_part(struct string_list *keys, const char *var, int use_dot)
 {
-	struct string_list keys_uniq = STRING_LIST_INIT_DUP;
-	struct strbuf sb = STRBUF_INIT;
-	struct string_list_item *item;
+	const char *cut = NULL;
 
-	for (size_t i = 0; i < keys->nr; i++) {
-		const char *var = keys->items[i].string;
-		const char *dot = strchr(var, '.');
-		const char *wildcard = strchr(var, '*');
-		const char *tag = strchr(var, '<');
-		const char *cut;
-
-		if (dot)
-			cut = dot;
-		else if (wildcard && tag)
-			cut = wildcard < tag ? wildcard : tag;
-		else if (wildcard)
-			cut = wildcard;
-		else if (tag)
-			cut = tag;
-		else {
-			string_list_append(&keys_uniq, var);
-			continue;
-		}
+	if (use_dot)
+		cut = strchr(var, use_dot);
 
+	if (!cut) {
+		size_t prefix_len = strcspn(var, "*<");
+		if (var[prefix_len])
+			cut = var + prefix_len;
+	}
+
+	if (!cut)
+		string_list_append(keys, var);
+	else {
+		struct strbuf sb = STRBUF_INIT;
 		strbuf_add(&sb, var, cut - var);
-		string_list_append(&keys_uniq, sb.buf);
+		string_list_append(keys, sb.buf);
 		strbuf_release(&sb);
 	}
+}
+
+static void show_config_sections(struct string_list *keys)
+{
+	struct string_list keys_uniq = STRING_LIST_INIT_DUP;
+	struct string_list_item *item;
+
+	for (size_t i = 0; i < keys->nr; i++)
+		grab_leading_part(&keys_uniq, keys->items[i].string, '.');
+
 	string_list_sort_u(&keys_uniq, 0);
 	for_each_string_list_item(item, &keys_uniq)
 		puts(item->string);
@@ -159,30 +160,11 @@ static void show_config_sections(struct string_list *keys)
 static void show_config_vars(struct string_list *keys)
 {
 	struct string_list keys_uniq = STRING_LIST_INIT_DUP;
-	struct strbuf sb = STRBUF_INIT;
 	struct string_list_item *item;
 
-	for (size_t i = 0; i < keys->nr; i++) {
-		const char *var = keys->items[i].string;
-		const char *wildcard = strchr(var, '*');
-		const char *tag = strchr(var, '<');
-		const char *cut;
-
-		if (wildcard && tag)
-			cut = wildcard < tag ? wildcard : tag;
-		else if (wildcard)
-			cut = wildcard;
-		else if (tag)
-			cut = tag;
-		else {
-			string_list_append(&keys_uniq, var);
-			continue;
-		}
+	for (size_t i = 0; i < keys->nr; i++)
+		grab_leading_part(&keys_uniq, keys->items[i].string, '\0');
 
-		strbuf_add(&sb, var, cut - var);
-		string_list_append(&keys_uniq, sb.buf);
-		strbuf_release(&sb);
-	}
 	string_list_sort_u(&keys_uniq, 0);
 	for_each_string_list_item(item, &keys_uniq)
 		puts(item->string);
Previous: Amisha ChhajedNext: Amisha Chhajed
Message 16 of 31 in “clean leftover calls to string_list_remove_duplicates”
  1. 0/2 clean leftover calls to string_list_remove_duplicatesAmisha Chhajed, Feb 12, 2026
  2. 1/2 sparse-checkout: use string_list_sort_uAmisha Chhajed, Feb 12, 2026
  3. Junio C HamanoFeb 12, 2026
  4. 2/2 help: ensure &keys_uniq follows sort -uAmisha Chhajed, Feb 12, 2026
  5. Junio C HamanoFeb 12, 2026
  6. Amisha ChhajedFeb 12, 2026
  7. Junio C HamanoFeb 12, 2026
  8. 1/2 sparse-checkout: use string_list_sort_uAmisha Chhajed, Feb 13, 2026
  9. 2/2 help: cleanup the contruction of keys_uniqAmisha Chhajed, Feb 13, 2026
  10. Junio C HamanoFeb 13, 2026
  11. Eric SunshineFeb 13, 2026
  12. Junio C HamanoFeb 13, 2026
  13. Amisha ChhajedFeb 21, 2026
  14. 1/2 sparse-checkout: use string_list_sort_uAmisha Chhajed, Feb 21, 2026
  15. 2/2 help: cleanup the contruction of keys_uniqAmisha Chhajed, Feb 21, 2026
  16. Junio C HamanoFeb 22, 2026
  17. Amisha ChhajedFeb 22, 2026
  18. Junio C HamanoFeb 26, 2026
  19. Amisha ChhajedFeb 28, 2026
  20. Junio C HamanoMar 2, 2026
  21. Junio C HamanoFeb 22, 2026
  22. 0/1 Make keys_uniq stop depending on sort of keys_uniqAmisha Chhajed, Feb 28, 2026
  23. 1/1 help: cleanup the contruction of keys_uniqAmisha Chhajed, Feb 28, 2026
  24. Junio C HamanoMar 2, 2026
  25. Amisha ChhajedMar 11, 2026
  26. Junio C HamanoMar 11, 2026
  27. Eric SunshineMar 11, 2026
  28. Junio C HamanoMar 11, 2026
  29. Eric SunshineMar 11, 2026
  30. help: cleanup the contruction of keys_uniqAmisha Chhajed, Mar 11, 2026
  31. Junio C HamanoMar 11, 2026

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.