Commit ef06d74b authored by Junio C Hamano's avatar Junio C Hamano

Merge branch 'nd/parseopt-completion-more'

The mechanism to use parse-options API to automate the command line
completion continues to get extended and polished.

* nd/parseopt-completion-more:
  completion: use __gitcomp_builtin in _git_cherry
  completion: use __gitcomp_builtin in _git_ls_tree
  completion: delete option-only completion commands
  completion: add --option completion for most builtin commands
  completion: factor out _git_xxx calling code
  completion: mention the oldest version we need to support
  git.c: add hidden option --list-parseopt-builtins
  git.c: move cmd_struct declaration up
parents 51f813c6 c55c4a5b
......@@ -29,6 +29,8 @@
# tell the completion to use commit completion. This also works with aliases
# of form "!sh -c '...'". For example, "!sh -c ': git commit ; ... '".
#
# Compatible with bash 3.2.57.
#
# You can set the following environment variables to influence the behavior of
# the completion routines:
#
......@@ -1284,6 +1286,12 @@ _git_checkout ()
_git_cherry ()
{
case "$cur" in
--*)
__gitcomp_builtin cherry
return
esac
__git_complete_refs
}
......@@ -1503,16 +1511,6 @@ _git_fsck ()
esac
}
_git_gc ()
{
case "$cur" in
--*)
__gitcomp_builtin gc
return
;;
esac
}
_git_gitk ()
{
_gitk
......@@ -1637,6 +1635,13 @@ _git_ls_remote ()
_git_ls_tree ()
{
case "$cur" in
--*)
__gitcomp_builtin ls-tree
return
;;
esac
__git_complete_file
}
......@@ -1812,11 +1817,6 @@ _git_mv ()
fi
}
_git_name_rev ()
{
__gitcomp_builtin name-rev
}
_git_notes ()
{
local subcommands='add append copy edit get-ref list merge prune remove show'
......@@ -3036,6 +3036,45 @@ _git_worktree ()
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 () {
local command="$1"
local completion_func="_git_${command//-/_}"
if declare -f $completion_func >/dev/null 2>/dev/null; then
$completion_func
return 0
elif __git_support_parseopt_helper "$command"; then
__git_complete_common "$command"
return 0
else
return 1
fi
}
__git_main ()
{
local i c=1 command __git_dir __git_repo_path
......@@ -3095,14 +3134,12 @@ __git_main ()
return
fi
local completion_func="_git_${command//-/_}"
declare -f $completion_func >/dev/null 2>/dev/null && $completion_func && return
__git_complete_command "$command" && return
local expansion=$(__git_aliased_command "$command")
if [ -n "$expansion" ]; then
words[1]=$expansion
completion_func="_git_${expansion//-/_}"
declare -f $completion_func >/dev/null 2>/dev/null && $completion_func
__git_complete_command "$expansion"
fi
}
......
This diff is collapsed.
......@@ -1454,6 +1454,12 @@ test_expect_success 'completion used <cmd> completion for alias: !f() { : git <c
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' '
git init tmp && cd tmp &&
test_when_finished "cd .. && rm -rf tmp" &&
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment