completion: complete values of configuration variables after 'git -c var='

'git config' expects a configuration variable's name and value in
separate options, so we complete values as they stand on their own on
the command line.  'git -c', however, expects them in a single option
joined by a '=' character, so we should be able to complete values
when they are following 'section.name=' in the same word.

Add new options to the __git_complete_config_variable_value() function
to allow callers to specify the current word to be completed and the
configuration variable whose value is to be completed, and use these
to complete possible values after 'git -c 'section.name=<TAB>'.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
SZEDER Gábor 2019-08-13 14:26:50 +02:00 committed by Junio C Hamano
parent e1e00089da
commit dd33472831
2 changed files with 48 additions and 24 deletions

View File

@ -2229,96 +2229,112 @@ __git_compute_config_vars ()
} }


# Completes possible values of various configuration variables. # Completes possible values of various configuration variables.
#
# Usage: __git_complete_config_variable_value [<option>]...
# --varname=<word>: The name of the configuration variable whose value is
# to be completed. Defaults to the previous word on the
# command line.
# --cur=<word>: The current value to be completed. Defaults to the current
# word to be completed.
__git_complete_config_variable_value () __git_complete_config_variable_value ()
{ {
local varname local varname="$prev" cur_="$cur"

while test $# != 0; do
case "$1" in
--varname=*) varname="${1##--varname=}" ;;
--cur=*) cur_="${1##--cur=}" ;;
*) return 1 ;;
esac
shift
done


if [ "${BASH_VERSINFO[0]:-0}" -ge 4 ]; then if [ "${BASH_VERSINFO[0]:-0}" -ge 4 ]; then
varname="${prev,,}" varname="${varname,,}"
else else
varname="$(echo "$prev" |tr A-Z a-z)" varname="$(echo "$varname" |tr A-Z a-z)"
fi fi


case "$varname" in case "$varname" in
branch.*.remote|branch.*.pushremote) branch.*.remote|branch.*.pushremote)
__gitcomp_nl "$(__git_remotes)" __gitcomp_nl "$(__git_remotes)" "" "$cur_"
return return
;; ;;
branch.*.merge) branch.*.merge)
__git_complete_refs __git_complete_refs --cur="$cur_"
return return
;; ;;
branch.*.rebase) branch.*.rebase)
__gitcomp "false true merges preserve interactive" __gitcomp "false true merges preserve interactive" "" "$cur_"
return return
;; ;;
remote.pushdefault) remote.pushdefault)
__gitcomp_nl "$(__git_remotes)" __gitcomp_nl "$(__git_remotes)" "" "$cur_"
return return
;; ;;
remote.*.fetch) remote.*.fetch)
local remote="${prev#remote.}" local remote="${varname#remote.}"
remote="${remote%.fetch}" remote="${remote%.fetch}"
if [ -z "$cur" ]; then if [ -z "$cur_" ]; then
__gitcomp_nl "refs/heads/" "" "" "" __gitcomp_nl "refs/heads/" "" "" ""
return return
fi fi
__gitcomp_nl "$(__git_refs_remotes "$remote")" __gitcomp_nl "$(__git_refs_remotes "$remote")" "" "$cur_"
return return
;; ;;
remote.*.push) remote.*.push)
local remote="${prev#remote.}" local remote="${varname#remote.}"
remote="${remote%.push}" remote="${remote%.push}"
__gitcomp_nl "$(__git for-each-ref \ __gitcomp_nl "$(__git for-each-ref \
--format='%(refname):%(refname)' refs/heads)" --format='%(refname):%(refname)' refs/heads)" "" "$cur_"
return return
;; ;;
pull.twohead|pull.octopus) pull.twohead|pull.octopus)
__git_compute_merge_strategies __git_compute_merge_strategies
__gitcomp "$__git_merge_strategies" __gitcomp "$__git_merge_strategies" "" "$cur_"
return return
;; ;;
color.pager) color.pager)
__gitcomp "false true" __gitcomp "false true" "" "$cur_"
return return
;; ;;
color.*.*) color.*.*)
__gitcomp " __gitcomp "
normal black red green yellow blue magenta cyan white normal black red green yellow blue magenta cyan white
bold dim ul blink reverse bold dim ul blink reverse
" " "" "$cur_"
return return
;; ;;
color.*) color.*)
__gitcomp "false true always never auto" __gitcomp "false true always never auto" "" "$cur_"
return return
;; ;;
diff.submodule) diff.submodule)
__gitcomp "$__git_diff_submodule_formats" __gitcomp "$__git_diff_submodule_formats" "" "$cur_"
return return
;; ;;
help.format) help.format)
__gitcomp "man info web html" __gitcomp "man info web html" "" "$cur_"
return return
;; ;;
log.date) log.date)
__gitcomp "$__git_log_date_formats" __gitcomp "$__git_log_date_formats" "" "$cur_"
return return
;; ;;
sendemail.aliasfiletype) sendemail.aliasfiletype)
__gitcomp "mutt mailrc pine elm gnus" __gitcomp "mutt mailrc pine elm gnus" "" "$cur_"
return return
;; ;;
sendemail.confirm) sendemail.confirm)
__gitcomp "$__git_send_email_confirm_options" __gitcomp "$__git_send_email_confirm_options" "" "$cur_"
return return
;; ;;
sendemail.suppresscc) sendemail.suppresscc)
__gitcomp "$__git_send_email_suppresscc_options" __gitcomp "$__git_send_email_suppresscc_options" "" "$cur_"
return return
;; ;;
sendemail.transferencoding) sendemail.transferencoding)
__gitcomp "7bit 8bit quoted-printable base64" __gitcomp "7bit 8bit quoted-printable base64" "" "$cur_"
return return
;; ;;
*.*) *.*)
@ -2430,7 +2446,8 @@ __git_complete_config_variable_name_and_value ()
{ {
case "$cur" in case "$cur" in
*=*) *=*)
# in the next patch... __git_complete_config_variable_value \
--varname="${cur%%=*}" --cur="${cur#*=}"
;; ;;
*) *)
__git_complete_config_variable_name --sfx='=' __git_complete_config_variable_name --sfx='='

View File

@ -1733,6 +1733,13 @@ test_expect_success 'git -c - variable name' '
EOF EOF
' '


test_expect_success 'git -c - value' '
test_completion "git -c color.pager=" <<-\EOF
false Z
true Z
EOF
'

test_expect_success 'sourcing the completion script clears cached commands' ' test_expect_success 'sourcing the completion script clears cached commands' '
__git_compute_all_commands && __git_compute_all_commands &&
verbose test -n "$__git_all_commands" && verbose test -n "$__git_all_commands" &&