completion: add and use __git_compute_first_level_config_vars_for_section

The function __git_complete_config_variable_name in the Bash completion
script hardcodes several config variable names. These variables are
those in config sections where user-defined names can appear, such as
"branch.<name>". These sections are treated first by the case statement,
and the two last "catch all" cases are used for other sections, making
use of the __git_compute_config_vars and __git_compute_config_sections
function, which omit listing any variables containing wildcards or
placeholders. Having hardcoded config variables introduces the risk of
the completion code becoming out of sync with the actual config
variables accepted by Git.

To avoid these hardcoded config variables, introduce a new function,
__git_compute_first_level_config_vars_for_section, making use of the
existing __git_config_vars variable. This function takes as argument a
config section name and computes the matching "first level" config
variables for that section, i.e. those _not_ containing any placeholder,
like 'branch.autoSetupMerge, 'remote.pushDefault', etc.  Use this
function and the variables it defines in the 'branch.*', 'remote.*' and
'submodule.*' switches of the case statement instead of hardcoding the
corresponding config variables.  Note that we use indirect expansion to
create a variable for each section, instead of using a single
associative array indexed by section names, because associative arrays
are not supported in Bash 3, on which macOS is stuck for licensing
reasons.

Use the existing pattern in the completion script of using global
variables to cache the list of config variables for each section. The
rationale for such caching is explained in eaa4e6ee2a (Speed up bash
completion loading, 2009-11-17), and the current approach to using and
defining them via 'test -n' is explained in cf0ff02a38 (completion: work
around zsh option propagation bug, 2012-02-02).

Adjust the name of one of the tests added in the previous commit,
reflecting that it now also tests the new function.

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Philippe Blain 2024-02-10 18:32:22 +00:00 коммит произвёл Junio C Hamano
Родитель b1d0cc68d1
Коммит 1e0ee4087e
2 изменённых файлов: 22 добавлений и 4 удалений

Просмотреть файл

@ -2596,6 +2596,15 @@ __git_compute_config_vars ()
__git_config_vars="$(git help --config-for-completion)" __git_config_vars="$(git help --config-for-completion)"
} }
__git_compute_first_level_config_vars_for_section ()
{
local section="$1"
__git_compute_config_vars
local this_section="__git_first_level_config_vars_for_section_${section}"
test -n "${!this_section}" ||
printf -v "__git_first_level_config_vars_for_section_${section}" %s "$(echo "$__git_config_vars" | grep -E "^${section}\.[a-z]" | awk -F. '{print $2}')"
}
__git_config_sections= __git_config_sections=
__git_compute_config_sections () __git_compute_config_sections ()
{ {
@ -2749,8 +2758,11 @@ __git_complete_config_variable_name ()
branch.*) branch.*)
local pfx="${cur_%.*}." local pfx="${cur_%.*}."
cur_="${cur_#*.}" cur_="${cur_#*.}"
local section="${pfx%.}"
__gitcomp_direct "$(__git_heads "$pfx" "$cur_" ".")" __gitcomp_direct "$(__git_heads "$pfx" "$cur_" ".")"
__gitcomp_nl_append $'autoSetupMerge\nautoSetupRebase\n' "$pfx" "$cur_" "${sfx:- }" __git_compute_first_level_config_vars_for_section "${section}"
local this_section="__git_first_level_config_vars_for_section_${section}"
__gitcomp_nl_append "${!this_section}" "$pfx" "$cur_" "${sfx:- }"
return return
;; ;;
guitool.*.*) guitool.*.*)
@ -2799,8 +2811,11 @@ __git_complete_config_variable_name ()
remote.*) remote.*)
local pfx="${cur_%.*}." local pfx="${cur_%.*}."
cur_="${cur_#*.}" cur_="${cur_#*.}"
local section="${pfx%.}"
__gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "." __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
__gitcomp_nl_append "pushDefault" "$pfx" "$cur_" "${sfx:- }" __git_compute_first_level_config_vars_for_section "${section}"
local this_section="__git_first_level_config_vars_for_section_${section}"
__gitcomp_nl_append "${!this_section}" "$pfx" "$cur_" "${sfx:- }"
return return
;; ;;
submodule.*.*) submodule.*.*)
@ -2812,8 +2827,11 @@ __git_complete_config_variable_name ()
submodule.*) submodule.*)
local pfx="${cur_%.*}." local pfx="${cur_%.*}."
cur_="${cur_#*.}" cur_="${cur_#*.}"
local section="${pfx%.}"
__gitcomp_nl "$(__git config -f "$(__git rev-parse --show-toplevel)/.gitmodules" --get-regexp 'submodule.*.path' | awk -F. '{print $2}')" "$pfx" "$cur_" "." __gitcomp_nl "$(__git config -f "$(__git rev-parse --show-toplevel)/.gitmodules" --get-regexp 'submodule.*.path' | awk -F. '{print $2}')" "$pfx" "$cur_" "."
__gitcomp_nl_append $'alternateErrorStrategy\nfetchJobs\nactive\nalternateLocation\nrecurse\npropagateBranches' "$pfx" "$cur_" "${sfx:- }" __git_compute_first_level_config_vars_for_section "${section}"
local this_section="__git_first_level_config_vars_for_section_${section}"
__gitcomp_nl_append "${!this_section}" "$pfx" "$cur_" "${sfx:- }"
return return
;; ;;
url.*.*) url.*.*)

Просмотреть файл

@ -2589,7 +2589,7 @@ test_expect_success 'setup for git config submodule tests' '
git submodule add ./sub git submodule add ./sub
' '
test_expect_success 'git config - variable name - submodule' ' test_expect_success 'git config - variable name - submodule and __git_compute_first_level_config_vars_for_section' '
test_completion "git config submodule." <<-\EOF test_completion "git config submodule." <<-\EOF
submodule.active Z submodule.active Z
submodule.alternateErrorStrategy Z submodule.alternateErrorStrategy Z