completion: deduplicate configuration sections

The number of configuration variables listed by the completion script grew quite when we started to auto-generate it from the documentation [1], so we now complete them in two steps: first we list only the section names, then the rest [2]. To get the section names we simply strip everything following the first dot in each variable name, resulting in a lot of repeated section names, because most sections contain more than one configuration variable. This is not a correctness issue in practice, because Bash's completion facilities remove all repetitions anyway, but these repetitions make testing a bit harder. Replace the small 'sed' script removing subsections and variable names with an 'awk' script that does the same, and in addition removes any repeated configuration sections as well (by first creating and filling an associative array indexed by all encountered configuration sections, and then iterating over this array and printing the indices, i.e. the unique section names). This change makes the failing 'git config - section' test in 't9902-completion.sh' pass. Note that this changes the order of section names in the output, and makes it downright undeterministic, but this is not an issue, because Bash sorts them before presenting them to the user, and our completion tests sort them as well before comparing with the expected output. Yeah, it would be simpler and shorter to just append '| sort -u' to that command, but that would incur the overhead of one more external process and pipeline stage every time a user completes configuration sections. [1] e17ca92637 (completion: drop the hard coded list of config vars, 2018-05-26) [2] f22f682695 (completion: complete general config vars in two steps, 2018-05-27) Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

SZEDER Gábor committed Aug 13, 2019 at 14:26 UTC d9438873c4dd80057a86f4b9a082db5ec75275cb
2 files changed +10 -2
contrib/completion/git-completion.bash
+9 -1
@@ -2398,7 +2398,15 @@ _git_config ()
2398 ;;
2399 *)
2400 __git_compute_config_vars
2401 - __gitcomp "$(echo "$__git_config_vars" | sed 's/\.[^ ]*/./g')"
2401 + __gitcomp "$(echo "$__git_config_vars" |
2402 + awk -F . '{
2403 + sections[$1] = 1
2404 + }
2405 + END {
2406 + for (s in sections)
2407 + print s "."
2408 + }
2409 + ')"
2410 esac
2411 }
2412
t/t9902-completion.sh
+1 -1
@@ -1698,7 +1698,7 @@ do
1698 '
1699 done
1700
1701 -test_expect_failure 'git config - section' '
1701 +test_expect_success 'git config - section' '
1702 test_completion "git config br" <<-\EOF
1703 branch.Z
1704 browser.Z