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

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

From
Junio C Hamano <gitster@pobox.com>
Date
Feb 13, 2026, 04:30 UTC
Message-ID
<xmqqecmpnu3g.fsf@gitster.g>
In-Reply-To
<20260213033729.50208-2-amishhhaaaa@gmail.com>
Amisha Chhajed <amishhhaaaa@gmail.com> writes:
> +	}
> +	else{
Style:
	} else {
Show 9 quoted lines
> +		for (size_t i = 0; i < keys.nr; i++) {
> +			const char *var = keys.items[i].string;
> +			const char *wildcard, *tag, *cut;
> +			const char *dot = NULL;
> +			struct strbuf sb = STRBUF_INIT;
> +
> +			if (type == SHOW_CONFIG_SECTIONS) {
> +				dot = strchr(var, '.');
> +			}

No {braces} around a single-statement block. Wouldn't it easier to follow if we do not rely on the initialization? I.e.,

			if (type == SHOW_CONFIG_SECTIONS)
				dot = strchr(var, '.');
			else /* SHOW_CONFIG_VARS */
				dot = NULL;
or even
   			switch (type) {
                        case SHOW_CONFIG_SECTIONS:
				dot = strchr(var, '.');
				break;
			case SHOW_CONFIG_VARS:
				dot = NULL;
				break;
			default:
				BUG("%d: unexpected type", type);
			}
?
But all of the above might become a moot point; see below.
Show 16 quoted lines
> +			wildcard = strchr(var, '*');
> +			tag = strchr(var, '<');
>  
> +			if (!dot && !wildcard && !tag) {
> +				string_list_append(&keys_uniq, var);
> +				continue;
> +			}
>  
> +			if (dot)
> +				cut = dot;
> +			else if (wildcard && !tag)
> +				cut = wildcard;
> +			else if (!wildcard && tag)
> +				cut = tag;
> +			else
> +				cut = wildcard < tag ? wildcard : tag;

How much are you saving by conflating SHOW_CONFIG_SECTIONS and SHOW_CONFIG_VARS into this same "else" block? In CONFIG_VARS mode, dot is always NULL, and when dot is not NULL, neither wildcard or tag affect the final output at all. Would the logic become clearer if you split these two mode into two, I have to wonder?

Show 11 quoted lines
> +			strbuf_add(&sb, var, cut - var);
> +			string_list_append(&keys_uniq, sb.buf);
> +			strbuf_release(&sb);
> +		}
>  	}
> +
>  	string_list_clear(&keys, 0);
> -	string_list_remove_duplicates(&keys_uniq, 0);
> +	string_list_sort_u(&keys_uniq, 0);
>  	for_each_string_list_item(item, &keys_uniq)
>  		puts(item->string);

You inherited the source of ugliness from the original. Even in HUMAN mode, you sort-u keys_uniq and run puts(), and the only thing that makes it a no-op is the fact that in the if/else above, keys_uniq is left untouched.

I wonder if the above should look more like this:
	switch (type) {
	case SHOW_CONFIG_HUMAN:
		show_config_human(&keys);
		break;
	case SHOW_CONFIG_SECTIONS:
		show_config_sections(&keys);
		break;
	case SHOW_CONFIG_VARS:
		show_config_vars(&keys);
		break;
	default:
		BUG("%d: unexpected type", type);
	}
	string_list_clear(&keys);
        return;

without keys_uniq string list in this function (it would be an implementation detail in show_config_sections() and _vars().

q> diff --git a/t/t0012-help.sh b/t/t0012-help.sh
Show 20 quoted lines
> index d3a0967e9d..0dbe6dd46f 100755
> --- a/t/t0012-help.sh
> +++ b/t/t0012-help.sh
> @@ -160,6 +160,24 @@ test_expect_success 'git help --config-for-completion' '
>  	test_cmp human.munged vars
>  '
>  
> +test_expect_success 'git help --config-for-completion' '
> +	file="$GIT_SOURCE_DIR/Documentation/config/add.adoc" &&
> +	test_when_finished "git -C \"$GIT_SOURCE_DIR\" checkout -- Documentation/config/add.adoc" &&
> +	cat <<-\EOF >>"$file" &&
> +	aa*.b::
> +	aa.b::
> +	EOF
> +	git help -c >human &&
> +	grep -E \
> +	     -e "^[^.]+\.[^.]+$" \
> +	     -e "^[^.]+\.[^.]+\.[^.]+$" human |
> +	     sed -e "s/\*.*//" -e "s/<.*//" |
> +	     sort -u >human.munged &&
Dedent "sed" and "sort" to the same level as "grep -E".
Show 7 quoted lines
> +	git help --config-for-completion >vars &&
> +	test_cmp human.munged vars
> +'
> +
>  test_expect_success 'git help --config-sections-for-completion' '
>  	git help -c >human &&
>  	grep -E \
Previous: Amisha ChhajedNext: Eric Sunshine
Message 10 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.