@@ -182,13 +182,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}"
@@ -228,7 +240,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
@@ -263,7 +275,7 @@ __gitcomp_builtin ()
eval "$var=\"$options\""
fi
- __gitcomp "$options"
+ __gitcomp_opts "$options"
}
# Generates completion reply from newline-separated possible completion words
@@ -900,7 +912,7 @@ __git_complete_strategy ()
return 0
;;
-X)
- __gitcomp "$__git_merge_strategy_options"
+ __gitcomp_opts "$__git_merge_strategy_options"
return 0
;;
esac
@@ -910,7 +922,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
@@ -1133,7 +1145,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
@@ -1387,7 +1399,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
@@ -1545,7 +1557,7 @@ _git_diff ()
return
;;
--*)
- __gitcomp "$__git_diff_difftool_options"
+ __gitcomp_opts "$__git_diff_difftool_options"
return
;;
esac
@@ -1839,7 +1851,7 @@ _git_log ()
return
;;
--*)
- __gitcomp "
+ __gitcomp_opts "
$__git_log_common_options
$__git_log_shortlog_options
$__git_log_gitk_options
@@ -1902,7 +1914,7 @@ _git_mergetool ()
return
;;
--*)
- __gitcomp "--tool= --prompt --no-prompt --gui --no-gui"
+ __gitcomp_opts "--tool= --prompt --no-prompt --gui --no-gui"
return
;;
esac
@@ -2050,7 +2062,7 @@ _git_range_diff ()
{
case "$cur" in
--*)
- __gitcomp "
+ __gitcomp_opts "
--creation-factor= --no-dual-color
$__git_diff_common_options
"
@@ -2067,11 +2079,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
@@ -2513,7 +2525,7 @@ __git_complete_config_variable_name ()
for (s in sections)
print s "."
}
- ')" "" "$cur_"
+ ')" "" "$cur_" ""
;;
esac
}
@@ -2691,7 +2703,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
@@ -2723,7 +2735,7 @@ _git_shortlog ()
case "$cur" in
--*)
- __gitcomp "
+ __gitcomp_opts "
$__git_log_common_options
$__git_log_shortlog_options
--numbered --summary --email
@@ -2761,7 +2773,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
@@ -2794,10 +2806,10 @@ _git_sparse_checkout ()
case "$subcommand,$cur" in
init,--*)
- __gitcomp "--cone"
+ __gitcomp_opts "--cone"
;;
set,--*)
- __gitcomp "--stdin"
+ __gitcomp_opts "--stdin"
;;
*)
;;
@@ -2815,7 +2827,7 @@ _git_stash ()
if [ -z "$subcommand" ]; then
case "$cur" in
--*)
- __gitcomp "$save_opts"
+ __gitcomp_opts "$save_opts"
;;
sa*)
if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
@@ -2831,22 +2843,22 @@ _git_stash ()
else
case "$subcommand,$cur" in
push,--*)
- __gitcomp "$save_opts --message"
+ __gitcomp_opts "$save_opts --message"
;;
save,--*)
- __gitcomp "$save_opts"
+ __gitcomp_opts "$save_opts"
;;
apply,--*|pop,--*)
- __gitcomp "--index --quiet"
+ __gitcomp_opts "--index --quiet"
;;
drop,--*)
- __gitcomp "--quiet"
+ __gitcomp_opts "--quiet"
;;
list,--*)
- __gitcomp "--name-status --oneline --patch-with-stat"
+ __gitcomp_opts "--name-status --oneline --patch-with-stat"
;;
show,--*)
- __gitcomp "$__git_diff_common_options"
+ __gitcomp_opts "$__git_diff_common_options"
;;
branch,--*)
;;
@@ -2877,7 +2889,7 @@ _git_submodule ()
if [ -z "$subcommand" ]; then
case "$cur" in
--*)
- __gitcomp "--quiet"
+ __gitcomp_opts "--quiet"
;;
*)
__gitcomp "$subcommands"
@@ -2888,29 +2900,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"
;;
*)
;;
@@ -2951,64 +2963,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"
;;
*)
;;
@@ -3223,7 +3235,7 @@ __git_main ()
;;
esac
case "$cur" in
- --*) __gitcomp "
+ --*) __gitcomp_opts "
--paginate
--no-pager
--git-dir=
@@ -3274,7 +3286,7 @@ __gitk_main ()
fi
case "$cur" in
--*)
- __gitcomp "
+ __gitcomp_opts "
$__git_log_common_options
$__git_log_gitk_options
$merge
@@ -53,6 +53,15 @@ __gitcomp ()
{
emulate -L zsh
+ local IFS=$' \t\n'
+ compset -P '*[=:]'
+ compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
+}
+
+__gitcomp_opts ()
+{
+ emulate -L zsh
+
local cur_="${3-$cur}"
case "$cur_" in
@@ -85,17 +85,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
}
@@ -450,8 +450,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
@@ -459,8 +459,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
@@ -469,32 +469,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
@@ -502,44 +502,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
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 | 114 ++++++++++++++----------- contrib/completion/git-completion.zsh | 9 ++ t/t9902-completion.sh | 58 ++++++------- 3 files changed, 101 insertions(+), 80 deletions(-)