@@ -330,13 +330,25 @@ __gitcompadd ()
done
}
-# Creates completion replies, reorganizing options and adding suffixes as needed.
+# Creates completion replies.
# It accepts 1 to 4 arguments:
# 1: List of possible completion words.
# 2: A prefix to be added to each possible completion word (optional).
# 3: Generate possible completion matches for this word (optional).
# 4: A suffix to be appended to each possible completion word (optional).
__gitcomp ()
+{
+ local IFS=$' \t\n'
+ __gitcompadd "$1" "${2-}" "${3-$cur}" "${4- }"
+}
+
+# Creates completion replies, reorganizing options and adding suffixes as needed.
+# It accepts 1 to 4 arguments:
+# 1: List of possible completion words.
+# 2: A prefix to be added to each possible completion word (optional).
+# 3: Generate possible completion matches for this word (optional).
+# 4: A suffix to be appended to each possible completion word (optional).
+__gitcomp_opts ()
{
local cur_="${3-$cur}"
@@ -380,7 +392,7 @@ fi
# This function is equivalent to
#
-# __gitcomp "$(git xxx --git-completion-helper) ..."
+# __gitcomp_opts "$(git xxx --git-completion-helper) ..."
#
# except that the output is cached. Accept 1-3 arguments:
# 1: the git command to execute, this is also the cache key
@@ -415,7 +427,7 @@ __gitcomp_builtin ()
eval "$var=\"$options\""
fi
- __gitcomp "$options"
+ __gitcomp_opts "$options"
}
# Generates completion reply from newline-separated possible completion words
@@ -1066,7 +1078,7 @@ __git_complete_strategy ()
return 0
;;
-X)
- __gitcomp "$__git_merge_strategy_options"
+ __gitcomp_opts "$__git_merge_strategy_options"
return 0
;;
esac
@@ -1076,7 +1088,7 @@ __git_complete_strategy ()
return 0
;;
--strategy-option=*)
- __gitcomp "$__git_merge_strategy_options" "" "${cur##--strategy-option=}"
+ __gitcomp_opts "$__git_merge_strategy_options" "" "${cur##--strategy-option=}"
return 0
;;
esac
@@ -1318,7 +1330,7 @@ _git_am ()
{
__git_find_repo_path
if [ -d "$__git_repo_path"/rebase-apply ]; then
- __gitcomp "$__git_am_inprogress_options"
+ __gitcomp_opts "$__git_am_inprogress_options"
return
fi
case "$cur" in
@@ -1578,7 +1590,7 @@ _git_cherry_pick ()
{
__git_find_repo_path
if [ -f "$__git_repo_path"/CHERRY_PICK_HEAD ]; then
- __gitcomp "$__git_cherry_pick_inprogress_options"
+ __gitcomp_opts "$__git_cherry_pick_inprogress_options"
return
fi
@@ -1737,7 +1749,7 @@ _git_diff ()
return
;;
--*)
- __gitcomp "$__git_diff_difftool_options"
+ __gitcomp_opts "$__git_diff_difftool_options"
return
;;
esac
@@ -2031,7 +2043,7 @@ _git_log ()
return
;;
--*)
- __gitcomp "
+ __gitcomp_opts "
$__git_log_common_options
$__git_log_shortlog_options
$__git_log_gitk_options
@@ -2094,7 +2106,7 @@ _git_mergetool ()
return
;;
--*)
- __gitcomp "--tool= --prompt --no-prompt --gui --no-gui"
+ __gitcomp_opts "--tool= --prompt --no-prompt --gui --no-gui"
return
;;
esac
@@ -2242,7 +2254,7 @@ _git_range_diff ()
{
case "$cur" in
--*)
- __gitcomp "
+ __gitcomp_opts "
--creation-factor= --no-dual-color
$__git_diff_common_options
"
@@ -2259,11 +2271,11 @@ _git_rebase ()
{
__git_find_repo_path
if [ -f "$__git_repo_path"/rebase-merge/interactive ]; then
- __gitcomp "$__git_rebase_interactive_inprogress_options"
+ __gitcomp_opts "$__git_rebase_interactive_inprogress_options"
return
elif [ -d "$__git_repo_path"/rebase-apply ] || \
[ -d "$__git_repo_path"/rebase-merge ]; then
- __gitcomp "$__git_rebase_inprogress_options"
+ __gitcomp_opts "$__git_rebase_inprogress_options"
return
fi
__git_complete_strategy && return
@@ -2877,7 +2889,7 @@ _git_revert ()
{
__git_find_repo_path
if [ -f "$__git_repo_path"/REVERT_HEAD ]; then
- __gitcomp "$__git_revert_inprogress_options"
+ __gitcomp_opts "$__git_revert_inprogress_options"
return
fi
__git_complete_strategy && return
@@ -2909,7 +2921,7 @@ _git_shortlog ()
case "$cur" in
--*)
- __gitcomp "
+ __gitcomp_opts "
$__git_log_common_options
$__git_log_shortlog_options
--numbered --summary --email
@@ -2947,7 +2959,7 @@ _git_show ()
return
;;
--*)
- __gitcomp "--pretty= --format= --abbrev-commit --no-abbrev-commit
+ __gitcomp_opts "--pretty= --format= --abbrev-commit --no-abbrev-commit
--oneline --show-signature
--expand-tabs --expand-tabs= --no-expand-tabs
$__git_diff_common_options
@@ -3073,7 +3085,7 @@ _git_submodule ()
if [ -z "$subcommand" ]; then
case "$cur" in
--*)
- __gitcomp "--quiet"
+ __gitcomp_opts "--quiet"
;;
*)
__gitcomp "$subcommands"
@@ -3084,29 +3096,29 @@ _git_submodule ()
case "$subcommand,$cur" in
add,--*)
- __gitcomp "--branch --force --name --reference --depth"
+ __gitcomp_opts "--branch --force --name --reference --depth"
;;
status,--*)
- __gitcomp "--cached --recursive"
+ __gitcomp_opts "--cached --recursive"
;;
deinit,--*)
- __gitcomp "--force --all"
+ __gitcomp_opts "--force --all"
;;
update,--*)
- __gitcomp "
+ __gitcomp_opts "
--init --remote --no-fetch
--recommend-shallow --no-recommend-shallow
--force --rebase --merge --reference --depth --recursive --jobs
"
;;
set-branch,--*)
- __gitcomp "--default --branch"
+ __gitcomp_opts "--default --branch"
;;
summary,--*)
- __gitcomp "--cached --files --summary-limit"
+ __gitcomp_opts "--cached --files --summary-limit"
;;
foreach,--*|sync,--*)
- __gitcomp "--recursive"
+ __gitcomp_opts "--recursive"
;;
*)
;;
@@ -3147,64 +3159,64 @@ _git_svn ()
case "$subcommand,$cur" in
fetch,--*)
- __gitcomp "--revision= --fetch-all $fc_opts"
+ __gitcomp_opts "--revision= --fetch-all $fc_opts"
;;
clone,--*)
- __gitcomp "--revision= $fc_opts $init_opts"
+ __gitcomp_opts "--revision= $fc_opts $init_opts"
;;
init,--*)
- __gitcomp "$init_opts"
+ __gitcomp_opts "$init_opts"
;;
dcommit,--*)
- __gitcomp "
+ __gitcomp_opts "
--merge --strategy= --verbose --dry-run
--fetch-all --no-rebase --commit-url
--revision --interactive $cmt_opts $fc_opts
"
;;
set-tree,--*)
- __gitcomp "--stdin $cmt_opts $fc_opts"
+ __gitcomp_opts "--stdin $cmt_opts $fc_opts"
;;
create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
show-externals,--*|mkdirs,--*)
- __gitcomp "--revision="
+ __gitcomp_opts "--revision="
;;
log,--*)
- __gitcomp "
+ __gitcomp_opts "
--limit= --revision= --verbose --incremental
--oneline --show-commit --non-recursive
--authors-file= --color
"
;;
rebase,--*)
- __gitcomp "
+ __gitcomp_opts "
--merge --verbose --strategy= --local
--fetch-all --dry-run $fc_opts
"
;;
commit-diff,--*)
- __gitcomp "--message= --file= --revision= $cmt_opts"
+ __gitcomp_opts "--message= --file= --revision= $cmt_opts"
;;
info,--*)
- __gitcomp "--url"
+ __gitcomp_opts "--url"
;;
branch,--*)
- __gitcomp "--dry-run --message --tag"
+ __gitcomp_opts "--dry-run --message --tag"
;;
tag,--*)
- __gitcomp "--dry-run --message"
+ __gitcomp_opts "--dry-run --message"
;;
blame,--*)
- __gitcomp "--git-format"
+ __gitcomp_opts "--git-format"
;;
migrate,--*)
- __gitcomp "
+ __gitcomp_opts "
--config-dir= --ignore-paths= --minimize
--no-auth-cache --username=
"
;;
reset,--*)
- __gitcomp "--revision= --parent"
+ __gitcomp_opts "--revision= --parent"
;;
*)
;;
@@ -3444,7 +3456,7 @@ __git_main ()
esac
case "$cur" in
--*)
- __gitcomp "
+ __gitcomp_opts "
--paginate
--no-pager
--git-dir=
@@ -3501,7 +3513,7 @@ __gitk_main ()
fi
case "$cur" in
--*)
- __gitcomp "
+ __gitcomp_opts "
$__git_log_common_options
$__git_log_gitk_options
$merge
@@ -54,6 +54,14 @@ __gitcomp ()
{
emulate -L zsh
+ local IFS=$' \t\n'
+ compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
+}
+
+__gitcomp_opts ()
+{
+ emulate -L zsh
+
local cur_="${3-$cur}"
[[ "$cur_" == *= ]] && return
@@ -98,17 +98,17 @@ test_completion ()
test_cmp expected out_sorted
}
-# Test __gitcomp.
+# Test __gitcomp_opts.
# The first argument is the typed text so far (cur); the rest are
-# passed to __gitcomp. Expected output comes is read from the
+# passed to __gitcomp_opts. Expected output comes is read from the
# standard input, like test_completion().
-test_gitcomp ()
+test_gitcomp_opts ()
{
local -a COMPREPLY &&
sed -e 's/Z$//' >expected &&
local cur="$1" &&
shift &&
- __gitcomp "$@" &&
+ __gitcomp_opts "$@" &&
print_comp &&
test_cmp expected out
}
@@ -463,8 +463,8 @@ test_expect_success '__gitcomp_direct - puts everything into COMPREPLY as-is' '
test_cmp expected out
'
-test_expect_success '__gitcomp - trailing space - options' '
- test_gitcomp "--re" "--dry-run --reuse-message= --reedit-message=
+test_expect_success '__gitcomp_opts - trailing space - options' '
+ test_gitcomp_opts "--re" "--dry-run --reuse-message= --reedit-message=
--reset-author" <<-EOF
--reuse-message=Z
--reedit-message=Z
@@ -472,8 +472,8 @@ test_expect_success '__gitcomp - trailing space - options' '
EOF
'
-test_expect_success '__gitcomp - trailing space - config keys' '
- test_gitcomp "br" "branch. branch.autosetupmerge
+test_expect_success '__gitcomp_opts - trailing space - config keys' '
+ test_gitcomp_opts "br" "branch. branch.autosetupmerge
branch.autosetuprebase browser." <<-\EOF
branch.Z
branch.autosetupmerge Z
@@ -482,32 +482,32 @@ test_expect_success '__gitcomp - trailing space - config keys' '
EOF
'
-test_expect_success '__gitcomp - option parameter' '
- test_gitcomp "--strategy=re" "octopus ours recursive resolve subtree" \
+test_expect_success '__gitcomp_opts - option parameter' '
+ test_gitcomp_opts "--strategy=re" "octopus ours recursive resolve subtree" \
"" "re" <<-\EOF
recursive Z
resolve Z
EOF
'
-test_expect_success '__gitcomp - prefix' '
- test_gitcomp "branch.maint.me" "remote merge mergeoptions rebase" \
+test_expect_success '__gitcomp_opts - prefix' '
+ test_gitcomp_opts "branch.maint.me" "remote merge mergeoptions rebase" \
"branch.maint." "me" <<-\EOF
branch.maint.merge Z
branch.maint.mergeoptions Z
EOF
'
-test_expect_success '__gitcomp - suffix' '
- test_gitcomp "branch.ma" "master maint next seen" "branch." \
+test_expect_success '__gitcomp_opts - suffix' '
+ test_gitcomp_opts "branch.ma" "master maint next seen" "branch." \
"ma" "." <<-\EOF
branch.master.Z
branch.maint.Z
EOF
'
-test_expect_success '__gitcomp - ignore optional negative options' '
- test_gitcomp "--" "--abc --def --no-one -- --no-two" <<-\EOF
+test_expect_success '__gitcomp_opts - ignore optional negative options' '
+ test_gitcomp_opts "--" "--abc --def --no-one -- --no-two" <<-\EOF
--abc Z
--def Z
--no-one Z
@@ -515,44 +515,44 @@ test_expect_success '__gitcomp - ignore optional negative options' '
EOF
'
-test_expect_success '__gitcomp - ignore/narrow optional negative options' '
- test_gitcomp "--a" "--abc --abcdef --no-one -- --no-two" <<-\EOF
+test_expect_success '__gitcomp_opts - ignore/narrow optional negative options' '
+ test_gitcomp_opts "--a" "--abc --abcdef --no-one -- --no-two" <<-\EOF
--abc Z
--abcdef Z
EOF
'
-test_expect_success '__gitcomp - ignore/narrow optional negative options' '
- test_gitcomp "--n" "--abc --def --no-one -- --no-two" <<-\EOF
+test_expect_success '__gitcomp_opts - ignore/narrow optional negative options' '
+ test_gitcomp_opts "--n" "--abc --def --no-one -- --no-two" <<-\EOF
--no-one Z
--no-... Z
EOF
'
-test_expect_success '__gitcomp - expand all negative options' '
- test_gitcomp "--no-" "--abc --def --no-one -- --no-two" <<-\EOF
+test_expect_success '__gitcomp_opts - expand all negative options' '
+ test_gitcomp_opts "--no-" "--abc --def --no-one -- --no-two" <<-\EOF
--no-one Z
--no-two Z
EOF
'
-test_expect_success '__gitcomp - expand/narrow all negative options' '
- test_gitcomp "--no-o" "--abc --def --no-one -- --no-two" <<-\EOF
+test_expect_success '__gitcomp_opts - expand/narrow all negative options' '
+ test_gitcomp_opts "--no-o" "--abc --def --no-one -- --no-two" <<-\EOF
--no-one Z
EOF
'
-test_expect_success '__gitcomp - equal skip' '
- test_gitcomp "--option=" "--option=" <<-\EOF &&
+test_expect_success '__gitcomp_opts - equal skip' '
+ test_gitcomp_opts "--option=" "--option=" <<-\EOF &&
EOF
- test_gitcomp "option=" "option=" <<-\EOF
+ test_gitcomp_opts "option=" "option=" <<-\EOF
EOF
'
-test_expect_success '__gitcomp - doesnt fail because of invalid variable name' '
- run_func __gitcomp "$invalid_variable_name"
+test_expect_success '__gitcomp_opts - doesnt fail because of invalid variable name' '
+ run_func __gitcomp_opts "$invalid_variable_name"
'
read -r -d "" refs <<-\EOF
@@ -56,16 +56,16 @@ test_completion ()
test_cmp expected out_sorted
}
-# Test __gitcomp.
+# Test __gitcomp_opts.
# The first argument is the typed text so far (cur); the rest are
-# passed to __gitcomp. Expected output comes is read from the
+# passed to __gitcomp_opts. Expected output comes is read from the
# standard input, like test_completion().
-test_gitcomp ()
+test_gitcomp_opts ()
{
sed -e 's/Z$//' >expected &&
local cur="$1" &&
shift &&
- run_completion "git func __gitcomp $(printf "%q " "$@") $cur" &&
+ run_completion "git func __gitcomp_opts $(printf "%q " "$@") $cur" &&
test_cmp expected out
}
@@ -97,8 +97,8 @@ test_expect_success 'setup for __git_find_repo_path/__gitdir tests' '
git init -b main otherrepo
'
-test_expect_success '__gitcomp - trailing space - options' '
- test_gitcomp "--re" "--dry-run --reuse-message= --reedit-message=
+test_expect_success '__gitcomp_opts - trailing space - options' '
+ test_gitcomp_opts "--re" "--dry-run --reuse-message= --reedit-message=
--reset-author" <<-EOF
--reuse-message=Z
--reedit-message=Z
@@ -106,8 +106,8 @@ test_expect_success '__gitcomp - trailing space - options' '
EOF
'
-test_expect_success '__gitcomp - trailing space - config keys' '
- test_gitcomp "br" "branch. branch.autosetupmerge
+test_expect_success '__gitcomp_opts - trailing space - config keys' '
+ test_gitcomp_opts "br" "branch. branch.autosetupmerge
branch.autosetuprebase browser." <<-\EOF
branch.Z
branch.autosetupmerge Z
@@ -116,32 +116,32 @@ test_expect_success '__gitcomp - trailing space - config keys' '
EOF
'
-test_expect_success '__gitcomp - option parameter' '
- test_gitcomp "--strategy=re" "octopus ours recursive resolve subtree" \
+test_expect_success '__gitcomp_opts - option parameter' '
+ test_gitcomp_opts "--strategy=re" "octopus ours recursive resolve subtree" \
"" "re" <<-\EOF
recursive Z
resolve Z
EOF
'
-test_expect_failure '__gitcomp - prefix' '
- test_gitcomp "branch.maint.me" "remote merge mergeoptions rebase" \
+test_expect_failure '__gitcomp_opts - prefix' '
+ test_gitcomp_opts "branch.maint.me" "remote merge mergeoptions rebase" \
"branch.maint." "me" <<-\EOF
branch.maint.merge Z
branch.maint.mergeoptions Z
EOF
'
-test_expect_failure '__gitcomp - suffix' '
- test_gitcomp "branch.ma" "master maint next seen" "branch." \
+test_expect_failure '__gitcomp_opts - suffix' '
+ test_gitcomp_opts "branch.ma" "master maint next seen" "branch." \
"ma" "." <<-\EOF
branch.master.Z
branch.maint.Z
EOF
'
-test_expect_success '__gitcomp - ignore optional negative options' '
- test_gitcomp "--" "--abc --def --no-one -- --no-two" <<-\EOF
+test_expect_success '__gitcomp_opts - ignore optional negative options' '
+ test_gitcomp_opts "--" "--abc --def --no-one -- --no-two" <<-\EOF
--abc Z
--def Z
--no-one Z
@@ -149,38 +149,38 @@ test_expect_success '__gitcomp - ignore optional negative options' '
EOF
'
-test_expect_success '__gitcomp - ignore/narrow optional negative options' '
- test_gitcomp "--a" "--abc --abcdef --no-one -- --no-two" <<-\EOF
+test_expect_success '__gitcomp_opts - ignore/narrow optional negative options' '
+ test_gitcomp_opts "--a" "--abc --abcdef --no-one -- --no-two" <<-\EOF
--abc Z
--abcdef Z
EOF
'
-test_expect_success '__gitcomp - ignore/narrow optional negative options' '
- test_gitcomp "--n" "--abc --def --no-one -- --no-two" <<-\EOF
+test_expect_success '__gitcomp_opts - ignore/narrow optional negative options' '
+ test_gitcomp_opts "--n" "--abc --def --no-one -- --no-two" <<-\EOF
--no-one Z
--no-... Z
EOF
'
-test_expect_success '__gitcomp - expand all negative options' '
- test_gitcomp "--no-" "--abc --def --no-one -- --no-two" <<-\EOF
+test_expect_success '__gitcomp_opts - expand all negative options' '
+ test_gitcomp_opts "--no-" "--abc --def --no-one -- --no-two" <<-\EOF
--no-one Z
--no-two Z
EOF
'
-test_expect_success '__gitcomp - expand/narrow all negative options' '
- test_gitcomp "--no-o" "--abc --def --no-one -- --no-two" <<-\EOF
+test_expect_success '__gitcomp_opts - expand/narrow all negative options' '
+ test_gitcomp_opts "--no-o" "--abc --def --no-one -- --no-two" <<-\EOF
--no-one Z
EOF
'
-test_expect_success '__gitcomp - equal skip' '
- test_gitcomp "--option=" "--option=" <<-\EOF &&
+test_expect_success '__gitcomp_opts - equal skip' '
+ test_gitcomp_opts "--option=" "--option=" <<-\EOF &&
EOF
- test_gitcomp "option=" "option=" <<-\EOF
+ test_gitcomp_opts "option=" "option=" <<-\EOF
EOF
'
Create a new simplified version of __gitcomp for most callers, and __gitcomp_opts for the ones that need reorganizing all the options. Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com> --- contrib/completion/git-completion.bash | 94 +++++++++++++++----------- contrib/completion/git-completion.zsh | 8 +++ t/t9902-completion.sh | 58 ++++++++-------- t/t9904-completion-zsh.sh | 54 +++++++-------- 4 files changed, 117 insertions(+), 97 deletions(-)