completion: add --option completion for most builtin commands
Many builtin commands use parseopt which can expose the option list via --git-completion-helper but do not have explicit support in git-completion.bash. This patch detects those commands and uses __gitcomp_builtin for option completion. This does not pollute the command name completion though. "git <tab>" will show you the same set as before. This only kicks in when you type the correct command name. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
48e1c69ade
commit
9f642a7169
@ -3035,12 +3035,40 @@ _git_worktree ()
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__git_complete_common () {
|
||||||
|
local command="$1"
|
||||||
|
|
||||||
|
case "$cur" in
|
||||||
|
--*)
|
||||||
|
__gitcomp_builtin "$command"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
__git_cmds_with_parseopt_helper=
|
||||||
|
__git_support_parseopt_helper () {
|
||||||
|
test -n "$__git_cmds_with_parseopt_helper" ||
|
||||||
|
__git_cmds_with_parseopt_helper="$(__git --list-parseopt-builtins)"
|
||||||
|
|
||||||
|
case " $__git_cmds_with_parseopt_helper " in
|
||||||
|
*" $1 "*)
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
__git_complete_command () {
|
__git_complete_command () {
|
||||||
local command="$1"
|
local command="$1"
|
||||||
local completion_func="_git_${command//-/_}"
|
local completion_func="_git_${command//-/_}"
|
||||||
if declare -f $completion_func >/dev/null 2>/dev/null; then
|
if declare -f $completion_func >/dev/null 2>/dev/null; then
|
||||||
$completion_func
|
$completion_func
|
||||||
return 0
|
return 0
|
||||||
|
elif __git_support_parseopt_helper "$command"; then
|
||||||
|
__git_complete_common "$command"
|
||||||
|
return 0
|
||||||
else
|
else
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
@ -1454,6 +1454,12 @@ test_expect_success 'completion used <cmd> completion for alias: !f() { : git <c
|
|||||||
EOF
|
EOF
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'completion without explicit _git_xxx function' '
|
||||||
|
test_completion "git version --" <<-\EOF
|
||||||
|
--build-options Z
|
||||||
|
EOF
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_failure 'complete with tilde expansion' '
|
test_expect_failure 'complete with tilde expansion' '
|
||||||
git init tmp && cd tmp &&
|
git init tmp && cd tmp &&
|
||||||
test_when_finished "cd .. && rm -rf tmp" &&
|
test_when_finished "cd .. && rm -rf tmp" &&
|
||||||
|
Reference in New Issue
Block a user