{"thread":{"id":"55961","subject":"[PATCH v2 00/45] completion: git-completion 1.3.3 patches","startedAt":"2021-06-18T18:25:23Z","lastAt":"2021-06-18T19:04:20Z","messageCount":48,"participants":["Felipe Contreras"],"isPatch":true,"patchVersion":2,"patchTotal":45},"messages":[{"id":"427845","messageId":"20210618182518.697912-1-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":null,"subject":"[PATCH v2 00/45] completion: git-completion 1.3.3 patches","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:33Z","receivedAt":"2021-06-18T18:25:23Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"completion: git-completion 1.3.1 patches\n\nThese patches represent what comprises git-completion 1.3.1, a friendly\nfork I'm maintaining.\n\nSome of these have already been sent, and should be in \"seen\", but for\nsome reason they are not [1]. Others have been sent, but probably won't\nreceive any review soon.\n\nSince the patches for git-completion 1.3.0 the only differece is a\nrebase on top of v2.31.0.\n\nCheers.\n\n[1] https://lore.kernel.org/git/5fea87e816fff_23821208d4@natae.notmuch/\n\nFelipe Contreras (45):\n  completion: fix __git_cmd_idx regression\n  completion: bash: fix prefix detection in branch.*\n  completion: fix for suboptions with value\n  completion: bash: fix for multiple dash commands\n  completion: bash: add correct suffix in variables\n  completion: zsh: add higher-priority location\n  completion: zsh: trivial improvement\n  completion: bash: do not modify COMP_WORDBREAKS\n  test: completion: fix currently typed words\n  test: completion: switch __gitcomp_nl prefix test\n  test: completion: add run_func() helper\n  completion: bash: remove non-append functionality\n  completion: bash: get rid of _append() functions\n  completion: bash: get rid of any non-append code\n  completion: zsh: fix options with arguments\n  completion: zsh: expand --git-dir file argument\n  completion: zsh: add support for general -C opts\n  completion: zsh: fix for undefined completions\n  completion: zsh: add support for general -c opts\n  completion: zsh: fix extra space on foo=\n  completion: zsh: add excluded options\n  completion: zsh: always set compset\n  completion: factor out check in __gitcomp\n  completion: simplify equal suffix check\n  completion: refactor __gitcomp\n  completion: simplify __gitcomp\n  completion: bash: change suffix check in __gitcomp\n  completion: improve __gitcomp suffix code\n  completion: bash: simplify config_variable_name\n  test: completion: add missing test\n  completion: bash: improve __gitcomp description\n  completion: add __gitcomp_opts\n  completion: bash: cleanup __gitcomp* invocations\n  completion: bash: shuffle __gitcomp functions\n  completion: zsh: simplify __gitcomp_direct\n  completion: zsh: shuffle __gitcomp* functions\n  completion: zsh: fix direct quoting\n  completion: zsh: add elements individually in __gitcomp_opts\n  completion: zsh: add __gitcompadd helper\n  completion: zsh: add correct removable suffix\n  completion: bash: simplify _get_comp_words_by_ref()\n  completion: bash: refactor _get_comp_words_by_ref()\n  completion: bash: cleanup _get_comp_words_by_ref()\n  completion: bash: trivial cleanup\n  completion: bash: rename _get_comp_words_by_ref()\n\n contrib/completion/git-completion.bash | 642 +++++++++++--------------\n contrib/completion/git-completion.zsh  | 141 +++---\n t/t9902-completion.sh                  | 159 +++---\n 3 files changed, 435 insertions(+), 507 deletions(-)\n\nRange-diff against v1:\n -:  ---------- >  1:  68e7376872 completion: fix __git_cmd_idx regression\n 1:  f318584861 =  2:  f942d5884a completion: bash: fix prefix detection in branch.*\n 2:  ce536d6e53 =  3:  c073c68d77 completion: fix for suboptions with value\n 3:  50a4e412d3 =  4:  60596a5f3a completion: bash: fix for multiple dash commands\n 4:  bf7dfb35d1 =  5:  40f67ea5fd completion: bash: add correct suffix in variables\n43:  8f1399c468 =  6:  20c22f5337 completion: zsh: add higher-priority location\n -:  ---------- >  7:  120a675092 completion: zsh: trivial improvement\n 5:  6338c510b4 =  8:  c58f5f8649 completion: bash: do not modify COMP_WORDBREAKS\n 6:  ab79e84b26 =  9:  46bfd0d7ca test: completion: fix currently typed words\n 7:  da3b5837df = 10:  4f44215d5e test: completion: switch __gitcomp_nl prefix test\n 8:  1f2278ea0f ! 11:  99954f41d4 test: completion: add run_func() helper\n    @@ t/t9902-completion.sh: test_path_completion ()\n      \ttest_cmp expected out\n      }\n     @@ t/t9902-completion.sh: do\n    - \t\t(\n      \t\t\twords=(git push '$flag' other ma) &&\n      \t\t\tcword=${#words[@]} cur=${words[cword-1]} &&\n    + \t\t\t__git_cmd_idx=1 &&\n     -\t\t\t__git_complete_remote_or_refspec &&\n     -\t\t\tprint_comp\n     +\t\t\trun_func __git_complete_remote_or_refspec\n    @@ t/t9902-completion.sh: do\n      \t\ttest_cmp expected out\n      \t'\n     @@ t/t9902-completion.sh: do\n    - \t\t(\n      \t\t\twords=(git push other '$flag' ma) &&\n      \t\t\tcword=${#words[@]} cur=${words[cword-1]} &&\n    + \t\t\t__git_cmd_idx=1 &&\n     -\t\t\t__git_complete_remote_or_refspec &&\n     -\t\t\tprint_comp\n     +\t\t\trun_func __git_complete_remote_or_refspec\n 9:  106cbd3e72 = 12:  3e2ea37938 completion: bash: remove non-append functionality\n10:  5145f47503 = 13:  d1162c8aa7 completion: bash: get rid of _append() functions\n11:  1bf917c007 = 14:  ca88e56fa2 completion: bash: get rid of any non-append code\n12:  ef1d6a3037 = 15:  54c3401eee completion: zsh: fix options with arguments\n13:  b8d3bcb7a0 = 16:  3bca7df93a completion: zsh: expand --git-dir file argument\n14:  89599ea5da ! 17:  2a3a5c3220 completion: zsh: add support for general -C opts\n    @@ contrib/completion/git-completion.zsh: __git_zsh_main ()\n      {\n      \tlocal curcontext=\"$curcontext\" state state_descr line\n      \ttypeset -A opt_args\n    --\tlocal -a orig_words\n    -+\tlocal -a orig_words __git_C_args\n    - \n    - \torig_words=( ${words[@]} )\n    ++\tlocal -a __git_C_args\n      \n    + \t_arguments -C \\\n    + \t\t'(-p --paginate --no-pager)'{-p,--paginate}'[pipe all output into ''less'']' \\\n     @@ contrib/completion/git-completion.zsh: __git_zsh_main ()\n      \t\t'--namespace=[set the git namespace]:' \\\n      \t\t'--no-replace-objects[do not use replacement refs to replace git objects]' \\\n    @@ contrib/completion/git-completion.zsh: __git_zsh_main ()\n     +\n      \t\t(( $+opt_args[--help] )) && command='help'\n      \n    - \t\twords=( ${orig_words[@]} )\n    + \t\twords=( git ${words[@]} )\n15:  ebc2bf8df1 = 18:  1bfe88f60c completion: zsh: fix for undefined completions\n16:  4e2762f040 = 19:  ad75eccb20 completion: zsh: add support for general -c opts\n17:  b856d42169 = 20:  d1587d19f7 completion: zsh: fix extra space on foo=\n18:  d61682bc45 ! 21:  a18f9d962b completion: zsh: add excluded options\n    @@ Commit message\n     \n      ## contrib/completion/git-completion.zsh ##\n     @@ contrib/completion/git-completion.zsh: __git_zsh_main ()\n    - \torig_words=( ${words[@]} )\n    + \tlocal -a __git_C_args\n      \n      \t_arguments -C \\\n     -\t\t'(-p --paginate --no-pager)'{-p,--paginate}'[pipe all output into ''less'']' \\\n19:  07819100c1 = 22:  c824921fa5 completion: zsh: always set compset\n20:  391372ddf7 = 23:  daf7bc19bb completion: factor out check in __gitcomp\n21:  1fd7477427 = 24:  41a9cd3e8d completion: simplify equal suffix check\n22:  fc7bcb5122 = 25:  dd47842d0d completion: refactor __gitcomp\n23:  85b5e719c7 = 26:  674a7ca73b completion: simplify __gitcomp\n24:  30124bf50f = 27:  f3f77bb5a6 completion: bash: change suffix check in __gitcomp\n25:  70653f57c0 = 28:  81e518f5a7 completion: improve __gitcomp suffix code\n26:  ae6bab5e4f = 29:  9b3242d412 completion: bash: simplify config_variable_name\n27:  f67cc99935 = 30:  869fafc5a7 test: completion: add missing test\n28:  17bc28a487 = 31:  7b1b05352f completion: bash: improve __gitcomp description\n29:  69f6533ef8 ! 32:  282221f9b6 completion: add __gitcomp_opts\n    @@ contrib/completion/git-completion.bash: _git_sparse_checkout ()\n      \t\t;;\n      \t*)\n      \t\t;;\n    -@@ contrib/completion/git-completion.bash: _git_stash ()\n    - \tif [ -z \"$subcommand\" ]; then\n    - \t\tcase \"$cur\" in\n    - \t\t--*)\n    --\t\t\t__gitcomp \"$save_opts\"\n    -+\t\t\t__gitcomp_opts \"$save_opts\"\n    - \t\t\t;;\n    - \t\tsa*)\n    - \t\t\tif [ -z \"$(__git_find_on_cmdline \"$save_opts\")\" ]; then\n    -@@ contrib/completion/git-completion.bash: _git_stash ()\n    - \telse\n    - \t\tcase \"$subcommand,$cur\" in\n    - \t\tpush,--*)\n    --\t\t\t__gitcomp \"$save_opts --message\"\n    -+\t\t\t__gitcomp_opts \"$save_opts --message\"\n    - \t\t\t;;\n    - \t\tsave,--*)\n    --\t\t\t__gitcomp \"$save_opts\"\n    -+\t\t\t__gitcomp_opts \"$save_opts\"\n    - \t\t\t;;\n    - \t\tapply,--*|pop,--*)\n    --\t\t\t__gitcomp \"--index --quiet\"\n    -+\t\t\t__gitcomp_opts \"--index --quiet\"\n    - \t\t\t;;\n    - \t\tdrop,--*)\n    --\t\t\t__gitcomp \"--quiet\"\n    -+\t\t\t__gitcomp_opts \"--quiet\"\n    - \t\t\t;;\n    - \t\tlist,--*)\n    --\t\t\t__gitcomp \"--name-status --oneline --patch-with-stat\"\n    -+\t\t\t__gitcomp_opts \"--name-status --oneline --patch-with-stat\"\n    - \t\t\t;;\n    - \t\tshow,--*)\n    --\t\t\t__gitcomp \"$__git_diff_common_options\"\n    -+\t\t\t__gitcomp_opts \"$__git_diff_common_options\"\n    - \t\t\t;;\n    - \t\tbranch,--*)\n    - \t\t\t;;\n     @@ contrib/completion/git-completion.bash: _git_submodule ()\n      \tif [ -z \"$subcommand\" ]; then\n      \t\tcase \"$cur\" in\n    @@ contrib/completion/git-completion.bash: _git_svn ()\n      \t\t*)\n      \t\t\t;;\n     @@ contrib/completion/git-completion.bash: __git_main ()\n    - \t\t\t;;\n      \t\tesac\n      \t\tcase \"$cur\" in\n    --\t\t--*)   __gitcomp \"\n    -+\t\t--*)   __gitcomp_opts \"\n    + \t\t--*)\n    +-\t\t\t__gitcomp \"\n    ++\t\t\t__gitcomp_opts \"\n      \t\t\t--paginate\n      \t\t\t--no-pager\n      \t\t\t--git-dir=\n30:  a1a9dbb915 = 33:  2d00a52d65 completion: bash: cleanup __gitcomp* invocations\n31:  9c17b3d3af = 34:  c34a4e0f93 completion: bash: shuffle __gitcomp functions\n32:  37f2c72c9e = 35:  12de564dae completion: zsh: simplify __gitcomp_direct\n33:  57ef037e81 = 36:  5c8aa847da completion: zsh: shuffle __gitcomp* functions\n34:  ecb79bc877 = 37:  b2e1bb7a02 completion: zsh: fix direct quoting\n35:  ae49a7c597 = 38:  43c3374fb2 completion: zsh: add elements individually in __gitcomp_opts\n36:  135f68ca27 = 39:  a1f335b841 completion: zsh: add __gitcompadd helper\n37:  e4f8591b72 = 40:  1416f590a7 completion: zsh: add correct removable suffix\n38:  49217d4aa3 = 41:  081982e432 completion: bash: simplify _get_comp_words_by_ref()\n39:  ef00c6e76e = 42:  2bd0507a7a completion: bash: refactor _get_comp_words_by_ref()\n40:  993d5c83ae = 43:  188c8749cc completion: bash: cleanup _get_comp_words_by_ref()\n41:  8b13e46fd3 = 44:  e08dc59d07 completion: bash: trivial cleanup\n42:  658b5cccc8 ! 45:  893c8527d6 completion: bash: rename _get_comp_words_by_ref()\n    @@ contrib/completion/git-completion.bash: if [[ -n ${ZSH_VERSION-} && -z ${GIT_SOU\n     +\n      __git_func_wrap ()\n      {\n    - \tlocal cur words cword prev\n    + \tlocal cur words cword prev __git_cmd_idx=1\n     -\t_get_comp_words_by_ref -n =: cur words cword prev\n     +\t__git_get_comp_words_by_ref\n      \t$1\n-- \n2.32.0\n\n"},{"id":"427846","messageId":"20210618182518.697912-2-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 01/45] completion: fix __git_cmd_idx regression","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:34Z","receivedAt":"2021-06-18T18:25:24Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"The commit 59d85a2a05 (git-completion.bash: use $__git_cmd_idx in more\nplaces, 2021-04-22) caused a regression when using __git_complete and a\ncommand relies on __git_cmd_idx.\n\nWe need the function wrapper to define __git_cmd_idx.\n\nIf the function wrapper defines __git_cmd_idx, then it's not necessary\nfor __git_zsh_main to do so.\n\nReported-by: Harrison McCullough <mccullough.harrison@gmail.com>\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash | 2 +-\n contrib/completion/git-completion.zsh  | 4 ++--\n 2 files changed, 3 insertions(+), 3 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex b50c5d0ea3..52a2d283cd 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -3511,7 +3511,7 @@ fi\n \n __git_func_wrap ()\n {\n-\tlocal cur words cword prev\n+\tlocal cur words cword prev __git_cmd_idx=1\n \t_get_comp_words_by_ref -n =: cur words cword prev\n \t$1\n }\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex cac6f61881..02ffeae768 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -251,7 +251,7 @@ __git_zsh_main ()\n \t\tdone\n \t\t;;\n \t(arg)\n-\t\tlocal command=\"${words[1]}\" __git_dir __git_cmd_idx=1\n+\t\tlocal command=\"${words[1]}\" __git_dir\n \n \t\tif (( $+opt_args[--bare] )); then\n \t\t\t__git_dir='.'\n@@ -271,7 +271,7 @@ __git_zsh_main ()\n _git ()\n {\n \tlocal _ret=1\n-\tlocal cur cword prev\n+\tlocal cur cword prev __git_cmd_idx=1\n \n \tcur=${words[CURRENT]}\n \tprev=${words[CURRENT-1]}\n-- \n2.32.0\n\n"},{"id":"427847","messageId":"20210618182518.697912-3-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 02/45] completion: bash: fix prefix detection in branch.*","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:35Z","receivedAt":"2021-06-18T18:25:26Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"Otherwise we are completely ignoring the --cur argument.\n\nThe issue can be tested with:\n\n  git clone --config=branch.<tab>\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash | 4 ++--\n 1 file changed, 2 insertions(+), 2 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex 52a2d283cd..f8a751c4ec 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -2649,8 +2649,8 @@ __git_complete_config_variable_name ()\n \t\treturn\n \t\t;;\n \tbranch.*)\n-\t\tlocal pfx=\"${cur%.*}.\"\n-\t\tcur_=\"${cur#*.}\"\n+\t\tlocal pfx=\"${cur_%.*}.\"\n+\t\tcur_=\"${cur_#*.}\"\n \t\t__gitcomp_direct \"$(__git_heads \"$pfx\" \"$cur_\" \".\")\"\n \t\t__gitcomp_nl_append $'autoSetupMerge\\nautoSetupRebase\\n' \"$pfx\" \"$cur_\" \"$sfx\"\n \t\treturn\n-- \n2.32.0\n\n"},{"id":"427848","messageId":"20210618182518.697912-4-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 03/45] completion: fix for suboptions with value","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:36Z","receivedAt":"2021-06-18T18:25:29Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"We need to ignore options that don't start with -- as well.\n\nDepending on the value of COMP_WORDBREAKS, the last word could be\nduplicated otherwise.\n\nCan be tested with:\n\n  git merge -X diff-algorithm=<tab>\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash |  2 +-\n contrib/completion/git-completion.zsh  |  2 +-\n t/t9902-completion.sh                  | 15 +++++++++++++++\n 3 files changed, 17 insertions(+), 2 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex f8a751c4ec..80b7c3eda8 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -356,7 +356,7 @@ __gitcomp ()\n \tlocal cur_=\"${3-$cur}\"\n \n \tcase \"$cur_\" in\n-\t--*=)\n+\t*=)\n \t\t;;\n \t--no-*)\n \t\tlocal c i=0 IFS=$' \\t\\n'\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex 02ffeae768..4a4df3b37c 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -55,7 +55,7 @@ __gitcomp ()\n \tlocal cur_=\"${3-$cur}\"\n \n \tcase \"$cur_\" in\n-\t--*=)\n+\t*=)\n \t\t;;\n \t--no-*)\n \t\tlocal c IFS=$' \\t\\n'\ndiff --git a/t/t9902-completion.sh b/t/t9902-completion.sh\nindex cb057ef161..6b56e54fc3 100755\n--- a/t/t9902-completion.sh\n+++ b/t/t9902-completion.sh\n@@ -540,6 +540,15 @@ test_expect_success '__gitcomp - expand/narrow all negative options' '\n \tEOF\n '\n \n+test_expect_success '__gitcomp - equal skip' '\n+\ttest_gitcomp \"--option=\" \"--option=\" <<-\\EOF &&\n+\n+\tEOF\n+\ttest_gitcomp \"option=\" \"option=\" <<-\\EOF\n+\n+\tEOF\n+'\n+\n test_expect_success '__gitcomp - doesnt fail because of invalid variable name' '\n \t__gitcomp \"$invalid_variable_name\"\n '\n@@ -2380,6 +2389,12 @@ test_expect_success 'git clone --config= - value' '\n \tEOF\n '\n \n+test_expect_success 'options with value' '\n+\ttest_completion \"git merge -X diff-algorithm=\" <<-\\EOF\n+\n+\tEOF\n+'\n+\n test_expect_success 'sourcing the completion script clears cached commands' '\n \t__git_compute_all_commands &&\n \tverbose test -n \"$__git_all_commands\" &&\n-- \n2.32.0\n\n"},{"id":"427849","messageId":"20210618182518.697912-5-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 04/45] completion: bash: fix for multiple dash commands","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:37Z","receivedAt":"2021-06-18T18:25:35Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"Otherwise commands like 'for-each-ref' are not completed.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash | 2 +-\n 1 file changed, 1 insertion(+), 1 deletion(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex 80b7c3eda8..279d2d8b1e 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -421,7 +421,7 @@ __gitcomp_builtin ()\n \tlocal incl=\"${2-}\"\n \tlocal excl=\"${3-}\"\n \n-\tlocal var=__gitcomp_builtin_\"${cmd/-/_}\"\n+\tlocal var=__gitcomp_builtin_\"${cmd//-/_}\"\n \tlocal options\n \teval \"options=\\${$var-}\"\n \n-- \n2.32.0\n\n"},{"id":"427850","messageId":"20210618182518.697912-6-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 05/45] completion: bash: add correct suffix in variables","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:38Z","receivedAt":"2021-06-18T18:25:36Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"__gitcomp automatically adds a suffix, but __gitcomp_nl and others\ndon't, we need to specify a space by default.\n\nCan be tested with:\n\n  git config branch.autoSetupMe<tab>\n\nThis fix only works for versions of bash greater than 4.0, before that\n\"local sfx\" creates an empty string, therefore the unset expansion\ndoesn't work. The same happens in zsh.\n\nTherefore we don't add the test for that for now.\n\nThe correct fix for all shells requires semantic changes in __gitcomp,\nbut that can be done later.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash | 6 +++---\n 1 file changed, 3 insertions(+), 3 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex 279d2d8b1e..943995689f 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -2652,7 +2652,7 @@ __git_complete_config_variable_name ()\n \t\tlocal pfx=\"${cur_%.*}.\"\n \t\tcur_=\"${cur_#*.}\"\n \t\t__gitcomp_direct \"$(__git_heads \"$pfx\" \"$cur_\" \".\")\"\n-\t\t__gitcomp_nl_append $'autoSetupMerge\\nautoSetupRebase\\n' \"$pfx\" \"$cur_\" \"$sfx\"\n+\t\t__gitcomp_nl_append $'autoSetupMerge\\nautoSetupRebase\\n' \"$pfx\" \"$cur_\" \"${sfx- }\"\n \t\treturn\n \t\t;;\n \tguitool.*.*)\n@@ -2686,7 +2686,7 @@ __git_complete_config_variable_name ()\n \t\tlocal pfx=\"${cur_%.*}.\"\n \t\tcur_=\"${cur_#*.}\"\n \t\t__git_compute_all_commands\n-\t\t__gitcomp_nl \"$__git_all_commands\" \"$pfx\" \"$cur_\" \"$sfx\"\n+\t\t__gitcomp_nl \"$__git_all_commands\" \"$pfx\" \"$cur_\" \"${sfx- }\"\n \t\treturn\n \t\t;;\n \tremote.*.*)\n@@ -2702,7 +2702,7 @@ __git_complete_config_variable_name ()\n \t\tlocal pfx=\"${cur_%.*}.\"\n \t\tcur_=\"${cur_#*.}\"\n \t\t__gitcomp_nl \"$(__git_remotes)\" \"$pfx\" \"$cur_\" \".\"\n-\t\t__gitcomp_nl_append \"pushDefault\" \"$pfx\" \"$cur_\" \"$sfx\"\n+\t\t__gitcomp_nl_append \"pushDefault\" \"$pfx\" \"$cur_\" \"${sfx- }\"\n \t\treturn\n \t\t;;\n \turl.*.*)\n-- \n2.32.0\n\n"},{"id":"427851","messageId":"20210618182518.697912-7-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 06/45] completion: zsh: add higher-priority location","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:39Z","receivedAt":"2021-06-18T18:25:38Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"bash-completion looks in /usr/local/share first, we should too.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.zsh | 1 +\n 1 file changed, 1 insertion(+)\n\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex 4a4df3b37c..da13c184d1 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -35,6 +35,7 @@ if [ -z \"$script\" ]; then\n \tlocations=(\n \t\t\"$(dirname ${funcsourcetrace[1]%:*})\"/git-completion.bash\n \t\t\"$HOME/.local/share/bash-completion/completions/git\"\n+\t\t'/usr/local/share/bash-completion/completions/git'\n \t\t\"$bash_completion/git\"\n \t\t'/etc/bash_completion.d/git' # old debian\n \t\t)\n-- \n2.32.0\n\n"},{"id":"427852","messageId":"20210618182518.697912-8-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 07/45] completion: zsh: trivial improvement","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:40Z","receivedAt":"2021-06-18T18:25:40Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"$words has basically all the words we need, except the first one: git.\n\nLets simply add that instead of passing the original, which contains\noptions we don't want to pass downstream (like -c and -C).\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.zsh | 5 +----\n 1 file changed, 1 insertion(+), 4 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex da13c184d1..9f0e03e86b 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -220,9 +220,6 @@ __git_zsh_main ()\n {\n \tlocal curcontext=\"$curcontext\" state state_descr line\n \ttypeset -A opt_args\n-\tlocal -a orig_words\n-\n-\torig_words=( ${words[@]} )\n \n \t_arguments -C \\\n \t\t'(-p --paginate --no-pager)'{-p,--paginate}'[pipe all output into ''less'']' \\\n@@ -262,7 +259,7 @@ __git_zsh_main ()\n \n \t\t(( $+opt_args[--help] )) && command='help'\n \n-\t\twords=( ${orig_words[@]} )\n+\t\twords=( git ${words[@]} )\n \n \t\t__git_zsh_bash_func $command\n \t\t;;\n-- \n2.32.0\n\n"},{"id":"427853","messageId":"20210618182518.697912-9-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 08/45] completion: bash: do not modify COMP_WORDBREAKS","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:41Z","receivedAt":"2021-06-18T18:25:41Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"There was no need for this once __git_reassemble_comp_words_by_ref() was\nintroduced. Now irrespective of the value of COMP_WORDBREAKS, words are\nalways joined together.\n\nBy default COMP_WORDBREAKS does contain a colon, and if it doesn't\nsomebody probably has a reason for it.\n\nCompletions are not supposed to modify COMP_WORDBREAKS and none of the\ncompletions in the bash-completion project do.\n\nWe manually set it in Zsh so the Bash script is not confused.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash | 5 -----\n contrib/completion/git-completion.zsh  | 1 +\n 2 files changed, 1 insertion(+), 5 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex 943995689f..bede8a7e2a 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -54,11 +54,6 @@\n #     When set to \"1\" suggest all options, including options which are\n #     typically hidden (e.g. '--allow-empty' for 'git commit').\n \n-case \"$COMP_WORDBREAKS\" in\n-*:*) : great ;;\n-*)   COMP_WORDBREAKS=\"$COMP_WORDBREAKS:\"\n-esac\n-\n # Discovers the path to the git repository taking any '--git-dir=<path>' and\n # '-C <path>' options into account and stores it in the $__git_repo_path\n # variable.\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex 9f0e03e86b..5ddd2d6771 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -46,6 +46,7 @@ fi\n \n local old_complete=\"$functions[complete]\"\n functions[complete]=:\n+COMP_WORDBREAKS=':'\n GIT_SOURCING_ZSH_COMPLETION=y . \"$script\"\n functions[complete]=\"$old_complete\"\n \n-- \n2.32.0\n\n"},{"id":"427854","messageId":"20210618182518.697912-10-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 09/45] test: completion: fix currently typed words","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:42Z","receivedAt":"2021-06-18T18:25:42Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"They don't match what we are supposed to be completing.\n\nNo functional change.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n t/t9902-completion.sh | 4 ++--\n 1 file changed, 2 insertions(+), 2 deletions(-)\n\ndiff --git a/t/t9902-completion.sh b/t/t9902-completion.sh\nindex 6b56e54fc3..bffe1b0928 100755\n--- a/t/t9902-completion.sh\n+++ b/t/t9902-completion.sh\n@@ -489,7 +489,7 @@ test_expect_success '__gitcomp - option parameter' '\n '\n \n test_expect_success '__gitcomp - prefix' '\n-\ttest_gitcomp \"branch.me\" \"remote merge mergeoptions rebase\" \\\n+\ttest_gitcomp \"branch.maint.me\" \"remote merge mergeoptions rebase\" \\\n \t\t\"branch.maint.\" \"me\" <<-\\EOF\n \tbranch.maint.merge Z\n \tbranch.maint.mergeoptions Z\n@@ -497,7 +497,7 @@ test_expect_success '__gitcomp - prefix' '\n '\n \n test_expect_success '__gitcomp - suffix' '\n-\ttest_gitcomp \"branch.me\" \"master maint next seen\" \"branch.\" \\\n+\ttest_gitcomp \"branch.ma\" \"master maint next seen\" \"branch.\" \\\n \t\t\"ma\" \".\" <<-\\EOF\n \tbranch.master.Z\n \tbranch.maint.Z\n-- \n2.32.0\n\n"},{"id":"427855","messageId":"20210618182518.697912-11-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 10/45] test: completion: switch __gitcomp_nl prefix test","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:43Z","receivedAt":"2021-06-18T18:25:45Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"By default COMP_WORDBREAKS includes =, so it's not realistic to test for\na prefix that almost never will be there.\n\nNo functional changes.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n t/t9902-completion.sh | 6 +++---\n 1 file changed, 3 insertions(+), 3 deletions(-)\n\ndiff --git a/t/t9902-completion.sh b/t/t9902-completion.sh\nindex bffe1b0928..d21dca4abd 100755\n--- a/t/t9902-completion.sh\n+++ b/t/t9902-completion.sh\n@@ -568,9 +568,9 @@ test_expect_success '__gitcomp_nl - trailing space' '\n '\n \n test_expect_success '__gitcomp_nl - prefix' '\n-\ttest_gitcomp_nl \"--fixup=m\" \"$refs\" \"--fixup=\" \"m\" <<-EOF\n-\t--fixup=main Z\n-\t--fixup=maint Z\n+\ttest_gitcomp_nl \"branch.m\" \"$refs\" \"branch.\" \"m\" <<-EOF\n+\tbranch.main Z\n+\tbranch.maint Z\n \tEOF\n '\n \n-- \n2.32.0\n\n"},{"id":"427856","messageId":"20210618182518.697912-12-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 11/45] test: completion: add run_func() helper","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:44Z","receivedAt":"2021-06-18T18:25:46Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"Pretty straightforward: runs functions.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n t/t9902-completion.sh | 58 ++++++++++++++++++-------------------------\n 1 file changed, 24 insertions(+), 34 deletions(-)\n\ndiff --git a/t/t9902-completion.sh b/t/t9902-completion.sh\nindex d21dca4abd..bb3eebffb7 100755\n--- a/t/t9902-completion.sh\n+++ b/t/t9902-completion.sh\n@@ -78,6 +78,12 @@ run_completion ()\n \t__git_wrap__git_main && print_comp\n }\n \n+run_func ()\n+{\n+\tlocal -a COMPREPLY &&\n+\t\"$@\" && print_comp\n+}\n+\n # Test high-level completion\n # Arguments are:\n # 1: typed text so far (cur)\n@@ -455,8 +461,7 @@ test_expect_success '__gitcomp_direct - puts everything into COMPREPLY as-is' '\n \tEOF\n \t(\n \t\tcur=should_be_ignored &&\n-\t\t__gitcomp_direct \"$(cat expected)\" &&\n-\t\tprint_comp\n+\t\trun_func __gitcomp_direct \"$(cat expected)\"\n \t) &&\n \ttest_cmp expected out\n '\n@@ -550,7 +555,7 @@ test_expect_success '__gitcomp - equal skip' '\n '\n \n test_expect_success '__gitcomp - doesnt fail because of invalid variable name' '\n-\t__gitcomp \"$invalid_variable_name\"\n+\trun_func __gitcomp \"$invalid_variable_name\"\n '\n \n read -r -d \"\" refs <<-\\EOF\n@@ -589,7 +594,7 @@ test_expect_success '__gitcomp_nl - no suffix' '\n '\n \n test_expect_success '__gitcomp_nl - doesnt fail because of invalid variable name' '\n-\t__gitcomp_nl \"$invalid_variable_name\"\n+\trun_func __gitcomp_nl \"$invalid_variable_name\"\n '\n \n test_expect_success '__git_remotes - list remotes from $GIT_DIR/remotes and from config file' '\n@@ -1090,8 +1095,7 @@ test_expect_success '__git_complete_refs - simple' '\n \tEOF\n \t(\n \t\tcur= &&\n-\t\t__git_complete_refs &&\n-\t\tprint_comp\n+\t\trun_func __git_complete_refs\n \t) &&\n \ttest_cmp expected out\n '\n@@ -1103,8 +1107,7 @@ test_expect_success '__git_complete_refs - matching' '\n \tEOF\n \t(\n \t\tcur=mat &&\n-\t\t__git_complete_refs &&\n-\t\tprint_comp\n+\t\trun_func __git_complete_refs\n \t) &&\n \ttest_cmp expected out\n '\n@@ -1117,8 +1120,7 @@ test_expect_success '__git_complete_refs - remote' '\n \tEOF\n \t(\n \t\tcur= &&\n-\t\t__git_complete_refs --remote=other &&\n-\t\tprint_comp\n+\t\trun_func __git_complete_refs --remote=other\n \t) &&\n \ttest_cmp expected out\n '\n@@ -1136,8 +1138,7 @@ test_expect_success '__git_complete_refs - track' '\n \tEOF\n \t(\n \t\tcur= &&\n-\t\t__git_complete_refs --track &&\n-\t\tprint_comp\n+\t\trun_func __git_complete_refs --track\n \t) &&\n \ttest_cmp expected out\n '\n@@ -1149,8 +1150,7 @@ test_expect_success '__git_complete_refs - current word' '\n \tEOF\n \t(\n \t\tcur=\"--option=mat\" &&\n-\t\t__git_complete_refs --cur=\"${cur#*=}\" &&\n-\t\tprint_comp\n+\t\trun_func __git_complete_refs --cur=\"${cur#*=}\"\n \t) &&\n \ttest_cmp expected out\n '\n@@ -1162,8 +1162,7 @@ test_expect_success '__git_complete_refs - prefix' '\n \tEOF\n \t(\n \t\tcur=v1.0..mat &&\n-\t\t__git_complete_refs --pfx=v1.0.. --cur=mat &&\n-\t\tprint_comp\n+\t\trun_func __git_complete_refs --pfx=v1.0.. --cur=mat\n \t) &&\n \ttest_cmp expected out\n '\n@@ -1179,8 +1178,7 @@ test_expect_success '__git_complete_refs - suffix' '\n \tEOF\n \t(\n \t\tcur= &&\n-\t\t__git_complete_refs --sfx=. &&\n-\t\tprint_comp\n+\t\trun_func __git_complete_refs --sfx=.\n \t) &&\n \ttest_cmp expected out\n '\n@@ -1193,8 +1191,7 @@ test_expect_success '__git_complete_fetch_refspecs - simple' '\n \tEOF\n \t(\n \t\tcur= &&\n-\t\t__git_complete_fetch_refspecs other &&\n-\t\tprint_comp\n+\t\trun_func __git_complete_fetch_refspecs other\n \t) &&\n \ttest_cmp expected out\n '\n@@ -1205,8 +1202,7 @@ test_expect_success '__git_complete_fetch_refspecs - matching' '\n \tEOF\n \t(\n \t\tcur=br &&\n-\t\t__git_complete_fetch_refspecs other \"\" br &&\n-\t\tprint_comp\n+\t\trun_func __git_complete_fetch_refspecs other \"\" br\n \t) &&\n \ttest_cmp expected out\n '\n@@ -1219,8 +1215,7 @@ test_expect_success '__git_complete_fetch_refspecs - prefix' '\n \tEOF\n \t(\n \t\tcur=\"+\" &&\n-\t\t__git_complete_fetch_refspecs other \"+\" \"\"  &&\n-\t\tprint_comp\n+\t\trun_func __git_complete_fetch_refspecs other \"+\" \"\"\n \t) &&\n \ttest_cmp expected out\n '\n@@ -1233,8 +1228,7 @@ test_expect_success '__git_complete_fetch_refspecs - fully qualified' '\n \tEOF\n \t(\n \t\tcur=refs/ &&\n-\t\t__git_complete_fetch_refspecs other \"\" refs/ &&\n-\t\tprint_comp\n+\t\trun_func __git_complete_fetch_refspecs other \"\" refs/\n \t) &&\n \ttest_cmp expected out\n '\n@@ -1247,8 +1241,7 @@ test_expect_success '__git_complete_fetch_refspecs - fully qualified & prefix' '\n \tEOF\n \t(\n \t\tcur=+refs/ &&\n-\t\t__git_complete_fetch_refspecs other + refs/ &&\n-\t\tprint_comp\n+\t\trun_func __git_complete_fetch_refspecs other + refs/\n \t) &&\n \ttest_cmp expected out\n '\n@@ -1779,8 +1772,7 @@ test_path_completion ()\n \t\t# unusual characters in path names.  By requesting only\n \t\t# untracked files we do not have to bother adding any\n \t\t# paths to the index in those tests.\n-\t\t__git_complete_index_file --others &&\n-\t\tprint_comp\n+\t\trun_func __git_complete_index_file --others\n \t) &&\n \ttest_cmp expected out\n }\n@@ -2302,8 +2294,7 @@ do\n \t\t\twords=(git push '$flag' other ma) &&\n \t\t\tcword=${#words[@]} cur=${words[cword-1]} &&\n \t\t\t__git_cmd_idx=1 &&\n-\t\t\t__git_complete_remote_or_refspec &&\n-\t\t\tprint_comp\n+\t\t\trun_func __git_complete_remote_or_refspec\n \t\t) &&\n \t\ttest_cmp expected out\n \t'\n@@ -2316,8 +2307,7 @@ do\n \t\t\twords=(git push other '$flag' ma) &&\n \t\t\tcword=${#words[@]} cur=${words[cword-1]} &&\n \t\t\t__git_cmd_idx=1 &&\n-\t\t\t__git_complete_remote_or_refspec &&\n-\t\t\tprint_comp\n+\t\t\trun_func __git_complete_remote_or_refspec\n \t\t) &&\n \t\ttest_cmp expected out\n \t'\n-- \n2.32.0\n\n"},{"id":"427857","messageId":"20210618182518.697912-13-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 12/45] completion: bash: remove non-append functionality","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:45Z","receivedAt":"2021-06-18T18:25:47Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"There's no point in setting COMPREPLY only to override it later, and in\nfact; we don't do that.\n\nTherefore there's no functional difference between __gitcomp_direct()\nand __gitcomp_direct_append(), since __gitcomp_direct() *always*\noperates on empty COMPREPLY.\n\nThe same goes for __gitcomp_nl().\n\nThis patch makes the functionality of append and non-append functions\nthe same.\n\nThere should be no functional changes.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash | 3 +--\n 1 file changed, 1 insertion(+), 2 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex bede8a7e2a..8f72e0f66b 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -307,7 +307,7 @@ __gitcomp_direct ()\n {\n \tlocal IFS=$'\\n'\n \n-\tCOMPREPLY=($1)\n+\tCOMPREPLY+=($1)\n }\n \n # Similar to __gitcomp_direct, but appends to COMPREPLY instead.\n@@ -459,7 +459,6 @@ __gitcomp_nl_append ()\n #    appended.\n __gitcomp_nl ()\n {\n-\tCOMPREPLY=()\n \t__gitcomp_nl_append \"$@\"\n }\n \n-- \n2.32.0\n\n"},{"id":"427858","messageId":"20210618182518.697912-14-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 13/45] completion: bash: get rid of _append() functions","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:46Z","receivedAt":"2021-06-18T18:25:49Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"There's no need to have duplicated functionality.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash | 35 ++++++--------------------\n contrib/completion/git-completion.zsh  | 10 --------\n 2 files changed, 7 insertions(+), 38 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex 8f72e0f66b..c3ea5261fb 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -296,8 +296,7 @@ _get_comp_words_by_ref ()\n }\n fi\n \n-# Fills the COMPREPLY array with prefiltered words without any additional\n-# processing.\n+# Appends prefiltered words to COMPREPLY without any additional processing.\n # Callers must take care of providing only words that match the current word\n # to be completed and adding any prefix and/or suffix (trailing space!), if\n # necessary.\n@@ -310,19 +309,6 @@ __gitcomp_direct ()\n \tCOMPREPLY+=($1)\n }\n \n-# Similar to __gitcomp_direct, but appends to COMPREPLY instead.\n-# Callers must take care of providing only words that match the current word\n-# to be completed and adding any prefix and/or suffix (trailing space!), if\n-# necessary.\n-# 1: List of newline-separated matching completion words, complete with\n-#    prefix and suffix.\n-__gitcomp_direct_append ()\n-{\n-\tlocal IFS=$'\\n'\n-\n-\tCOMPREPLY+=($1)\n-}\n-\n __gitcompappend ()\n {\n \tlocal x i=${#COMPREPLY[@]}\n@@ -440,16 +426,8 @@ __gitcomp_builtin ()\n \t__gitcomp \"$options\"\n }\n \n-# Variation of __gitcomp_nl () that appends to the existing list of\n-# completion candidates, COMPREPLY.\n-__gitcomp_nl_append ()\n-{\n-\tlocal IFS=$'\\n'\n-\t__gitcompappend \"$1\" \"${2-}\" \"${3-$cur}\" \"${4- }\"\n-}\n-\n # Generates completion reply from newline-separated possible completion words\n-# by appending a space to all of them.\n+# by appending a space to all of them. The result is appended to COMPREPLY.\n # It accepts 1 to 4 arguments:\n # 1: List of possible completion words, separated by a single newline.\n # 2: A prefix to be added to each possible completion word (optional).\n@@ -459,7 +437,8 @@ __gitcomp_nl_append ()\n #    appended.\n __gitcomp_nl ()\n {\n-\t__gitcomp_nl_append \"$@\"\n+\tlocal IFS=$'\\n'\n+\t__gitcompappend \"$1\" \"${2-}\" \"${3-$cur}\" \"${4- }\"\n }\n \n # Fills the COMPREPLY array with prefiltered paths without any additional\n@@ -846,7 +825,7 @@ __git_complete_refs ()\n \n \t# Append DWIM remote branch names if requested\n \tif [ \"$dwim\" = \"yes\" ]; then\n-\t\t__gitcomp_direct_append \"$(__git_dwim_remote_heads \"$pfx\" \"$cur_\" \"$sfx\")\"\n+\t\t__gitcomp_direct \"$(__git_dwim_remote_heads \"$pfx\" \"$cur_\" \"$sfx\")\"\n \tfi\n }\n \n@@ -2646,7 +2625,7 @@ __git_complete_config_variable_name ()\n \t\tlocal pfx=\"${cur_%.*}.\"\n \t\tcur_=\"${cur_#*.}\"\n \t\t__gitcomp_direct \"$(__git_heads \"$pfx\" \"$cur_\" \".\")\"\n-\t\t__gitcomp_nl_append $'autoSetupMerge\\nautoSetupRebase\\n' \"$pfx\" \"$cur_\" \"${sfx- }\"\n+\t\t__gitcomp_nl $'autoSetupMerge\\nautoSetupRebase\\n' \"$pfx\" \"$cur_\" \"${sfx- }\"\n \t\treturn\n \t\t;;\n \tguitool.*.*)\n@@ -2696,7 +2675,7 @@ __git_complete_config_variable_name ()\n \t\tlocal pfx=\"${cur_%.*}.\"\n \t\tcur_=\"${cur_#*.}\"\n \t\t__gitcomp_nl \"$(__git_remotes)\" \"$pfx\" \"$cur_\" \".\"\n-\t\t__gitcomp_nl_append \"pushDefault\" \"$pfx\" \"$cur_\" \"${sfx- }\"\n+\t\t__gitcomp_nl \"pushDefault\" \"$pfx\" \"$cur_\" \"${sfx- }\"\n \t\treturn\n \t\t;;\n \turl.*.*)\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex 5ddd2d6771..8cbf4f83f5 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -122,16 +122,6 @@ __gitcomp_file ()\n \tcompadd -f -p \"${2-}\" -- ${(f)1} && _ret=0\n }\n \n-__gitcomp_direct_append ()\n-{\n-\t__gitcomp_direct \"$@\"\n-}\n-\n-__gitcomp_nl_append ()\n-{\n-\t__gitcomp_nl \"$@\"\n-}\n-\n __gitcomp_file_direct ()\n {\n \t__gitcomp_file \"$1\" \"\"\n-- \n2.32.0\n\n"},{"id":"427859","messageId":"20210618182518.697912-15-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 14/45] completion: bash: get rid of any non-append code","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:47Z","receivedAt":"2021-06-18T18:25:55Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash | 12 +++---------\n 1 file changed, 3 insertions(+), 9 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex c3ea5261fb..366f255dfc 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -309,7 +309,7 @@ __gitcomp_direct ()\n \tCOMPREPLY+=($1)\n }\n \n-__gitcompappend ()\n+__gitcompadd ()\n {\n \tlocal x i=${#COMPREPLY[@]}\n \tfor x in $1; do\n@@ -319,12 +319,6 @@ __gitcompappend ()\n \tdone\n }\n \n-__gitcompadd ()\n-{\n-\tCOMPREPLY=()\n-\t__gitcompappend \"$@\"\n-}\n-\n # Generates completion reply, appending a space to possible completion words,\n # if necessary.\n # It accepts 1 to 4 arguments:\n@@ -438,7 +432,7 @@ __gitcomp_builtin ()\n __gitcomp_nl ()\n {\n \tlocal IFS=$'\\n'\n-\t__gitcompappend \"$1\" \"${2-}\" \"${3-$cur}\" \"${4- }\"\n+\t__gitcompadd \"$1\" \"${2-}\" \"${3-$cur}\" \"${4- }\"\n }\n \n # Fills the COMPREPLY array with prefiltered paths without any additional\n@@ -451,7 +445,7 @@ __gitcomp_file_direct ()\n {\n \tlocal IFS=$'\\n'\n \n-\tCOMPREPLY=($1)\n+\tCOMPREPLY+=($1)\n \n \t# use a hack to enable file mode in bash < 4\n \tcompopt -o filenames +o nospace 2>/dev/null ||\n-- \n2.32.0\n\n"},{"id":"427860","messageId":"20210618182518.697912-16-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 15/45] completion: zsh: fix options with arguments","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:48Z","receivedAt":"2021-06-18T18:25:59Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"They support both '--git-dir=value' and '--git-dir value'. Fix the\narguments to support both.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.zsh | 8 ++++----\n 1 file changed, 4 insertions(+), 4 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex 8cbf4f83f5..33bbf3d993 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -215,15 +215,15 @@ __git_zsh_main ()\n \t_arguments -C \\\n \t\t'(-p --paginate --no-pager)'{-p,--paginate}'[pipe all output into ''less'']' \\\n \t\t'(-p --paginate)--no-pager[do not pipe git output into a pager]' \\\n-\t\t'--git-dir=-[set the path to the repository]: :_directories' \\\n+\t\t'--git-dir=[set the path to the repository]: :_directories' \\\n \t\t'--bare[treat the repository as a bare repository]' \\\n \t\t'(- :)--version[prints the git suite version]' \\\n-\t\t'--exec-path=-[path to where your core git programs are installed]:: :_directories' \\\n+\t\t'--exec-path=[path to where your core git programs are installed]:: :_directories' \\\n \t\t'--html-path[print the path where git''s HTML documentation is installed]' \\\n \t\t'--info-path[print the path where the Info files are installed]' \\\n \t\t'--man-path[print the manpath (see `man(1)`) for the man pages]' \\\n-\t\t'--work-tree=-[set the path to the working tree]: :_directories' \\\n-\t\t'--namespace=-[set the git namespace]' \\\n+\t\t'--work-tree=[set the path to the working tree]: :_directories' \\\n+\t\t'--namespace=[set the git namespace]:' \\\n \t\t'--no-replace-objects[do not use replacement refs to replace git objects]' \\\n \t\t'(- :)--help[prints the synopsis and a list of the most commonly used commands]: :->arg' \\\n \t\t'(-): :->command' \\\n-- \n2.32.0\n\n"},{"id":"427861","messageId":"20210618182518.697912-17-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 16/45] completion: zsh: expand --git-dir file argument","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:49Z","receivedAt":"2021-06-18T18:26:00Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.zsh | 2 +-\n 1 file changed, 1 insertion(+), 1 deletion(-)\n\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex 33bbf3d993..9768f76af3 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -245,7 +245,7 @@ __git_zsh_main ()\n \t\tif (( $+opt_args[--bare] )); then\n \t\t\t__git_dir='.'\n \t\telse\n-\t\t\t__git_dir=${opt_args[--git-dir]}\n+\t\t\t__git_dir=${~opt_args[--git-dir]}\n \t\tfi\n \n \t\t(( $+opt_args[--help] )) && command='help'\n-- \n2.32.0\n\n"},{"id":"427862","messageId":"20210618182518.697912-18-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 17/45] completion: zsh: add support for general -C opts","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:50Z","receivedAt":"2021-06-18T18:26:01Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.zsh | 6 ++++++\n 1 file changed, 6 insertions(+)\n\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex 9768f76af3..f60801741a 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -211,6 +211,7 @@ __git_zsh_main ()\n {\n \tlocal curcontext=\"$curcontext\" state state_descr line\n \ttypeset -A opt_args\n+\tlocal -a __git_C_args\n \n \t_arguments -C \\\n \t\t'(-p --paginate --no-pager)'{-p,--paginate}'[pipe all output into ''less'']' \\\n@@ -226,6 +227,7 @@ __git_zsh_main ()\n \t\t'--namespace=[set the git namespace]:' \\\n \t\t'--no-replace-objects[do not use replacement refs to replace git objects]' \\\n \t\t'(- :)--help[prints the synopsis and a list of the most commonly used commands]: :->arg' \\\n+\t\t'*-C[run as if git was started in the given path]: :_directories' \\\n \t\t'(-): :->command' \\\n \t\t'(-)*:: :->arg' && return\n \n@@ -248,6 +250,10 @@ __git_zsh_main ()\n \t\t\t__git_dir=${~opt_args[--git-dir]}\n \t\tfi\n \n+\t\tfor x in ${(s.:.)opt_args[-C]}; do\n+\t\t\t__git_C_args+=('-C' ${~x})\n+\t\tdone\n+\n \t\t(( $+opt_args[--help] )) && command='help'\n \n \t\twords=( git ${words[@]} )\n-- \n2.32.0\n\n"},{"id":"427863","messageId":"20210618182518.697912-19-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 18/45] completion: zsh: fix for undefined completions","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:51Z","receivedAt":"2021-06-18T18:26:03Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"The parseopt helper can generate the completions even if the function is\nunspecified.\n\n  git version --<tab>\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.zsh | 3 +++\n 1 file changed, 3 insertions(+)\n\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex f60801741a..5cfbcfe7a2 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -141,6 +141,9 @@ __git_complete_command ()\n \tif (( $+functions[$completion_func] )); then\n \t\temulate ksh -c $completion_func\n \t\treturn 0\n+\telif emulate ksh -c \"__git_support_parseopt_helper $command\"; then\n+\t\temulate ksh -c \"__git_complete_common $command\"\n+\t\treturn 0\n \telse\n \t\treturn 1\n \tfi\n-- \n2.32.0\n\n"},{"id":"427864","messageId":"20210618182518.697912-20-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 19/45] completion: zsh: add support for general -c opts","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:52Z","receivedAt":"2021-06-18T18:26:06Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"So we can specify configurations.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.zsh | 5 +++++\n 1 file changed, 5 insertions(+)\n\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex 5cfbcfe7a2..f3e8cb7535 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -231,6 +231,7 @@ __git_zsh_main ()\n \t\t'--no-replace-objects[do not use replacement refs to replace git objects]' \\\n \t\t'(- :)--help[prints the synopsis and a list of the most commonly used commands]: :->arg' \\\n \t\t'*-C[run as if git was started in the given path]: :_directories' \\\n+\t\t'*-c[pass a configuration parameter to the command]: :->config' \\\n \t\t'(-): :->command' \\\n \t\t'(-)*:: :->arg' && return\n \n@@ -244,6 +245,10 @@ __git_zsh_main ()\n \t\t\tlet _ret || break\n \t\tdone\n \t\t;;\n+\t(config)\n+\t\tcompset -P '*[=:]'\n+\t\temulate ksh -c __git_complete_config_variable_name_and_value\n+\t\t;;\n \t(arg)\n \t\tlocal command=\"${words[1]}\" __git_dir\n \n-- \n2.32.0\n\n"},{"id":"427865","messageId":"20210618182518.697912-21-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 20/45] completion: zsh: fix extra space on foo=","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:53Z","receivedAt":"2021-06-18T18:26:08Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"Upstream commit e1e00089da fixed the issue for Bash, but not for Zsh.\n\nWhen we are typing configurations an = at the end signifies we still\nwant to type the value.\n\nCan be tested with:\n\n  git -c log.d<tab>\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.zsh | 2 +-\n 1 file changed, 1 insertion(+), 1 deletion(-)\n\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex f3e8cb7535..56a1bb16b0 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -87,7 +87,7 @@ __gitcomp ()\n \t\t\tfi\n \t\t\tc=\"$c${4-}\"\n \t\t\tcase $c in\n-\t\t\t--*=|*.) ;;\n+\t\t\t*=|*.) ;;\n \t\t\t*) c=\"$c \" ;;\n \t\t\tesac\n \t\t\tarray+=(\"$c\")\n-- \n2.32.0\n\n"},{"id":"427866","messageId":"20210618182518.697912-23-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 22/45] completion: zsh: always set compset","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:55Z","receivedAt":"2021-06-18T18:26:11Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"So we don't have to set it every time.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.zsh | 7 ++-----\n 1 file changed, 2 insertions(+), 5 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex 426eec10a2..b9c2c75c79 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -73,7 +73,6 @@ __gitcomp ()\n \t\t\tesac\n \t\t\tarray+=(\"$c\")\n \t\tdone\n-\t\tcompset -P '*[=:]'\n \t\tcompadd -Q -S '' -p \"${2-}\" -a -- array && _ret=0\n \t\t;;\n \t*)\n@@ -92,7 +91,6 @@ __gitcomp ()\n \t\t\tesac\n \t\t\tarray+=(\"$c\")\n \t\tdone\n-\t\tcompset -P '*[=:]'\n \t\tcompadd -Q -S '' -p \"${2-}\" -a -- array && _ret=0\n \t\t;;\n \tesac\n@@ -102,7 +100,6 @@ __gitcomp_direct ()\n {\n \temulate -L zsh\n \n-\tcompset -P '*[=:]'\n \tcompadd -Q -S '' -- ${(f)1} && _ret=0\n }\n \n@@ -110,7 +107,6 @@ __gitcomp_nl ()\n {\n \temulate -L zsh\n \n-\tcompset -P '*[=:]'\n \tcompadd -Q -S \"${4- }\" -p \"${2-}\" -- ${(f)1} && _ret=0\n }\n \n@@ -118,7 +114,6 @@ __gitcomp_file ()\n {\n \temulate -L zsh\n \n-\tcompset -P '*[=:]'\n \tcompadd -f -p \"${2-}\" -- ${(f)1} && _ret=0\n }\n \n@@ -136,6 +131,8 @@ __git_complete_command ()\n {\n \temulate -L zsh\n \n+\tcompset -P '*[=:]'\n+\n \tlocal command=\"$1\"\n \tlocal completion_func=\"_git_${command//-/_}\"\n \tif (( $+functions[$completion_func] )); then\n-- \n2.32.0\n\n"},{"id":"427867","messageId":"20210618182518.697912-22-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 21/45] completion: zsh: add excluded options","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:54Z","receivedAt":"2021-06-18T18:26:13Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"Add more excluded options, for example: --bare excludes --git-dir.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.zsh | 17 +++++++++--------\n 1 file changed, 9 insertions(+), 8 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex 56a1bb16b0..426eec10a2 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -217,15 +217,16 @@ __git_zsh_main ()\n \tlocal -a __git_C_args\n \n \t_arguments -C \\\n-\t\t'(-p --paginate --no-pager)'{-p,--paginate}'[pipe all output into ''less'']' \\\n-\t\t'(-p --paginate)--no-pager[do not pipe git output into a pager]' \\\n-\t\t'--git-dir=[set the path to the repository]: :_directories' \\\n-\t\t'--bare[treat the repository as a bare repository]' \\\n+\t\t'(-p --paginate -P --no-pager)'{-p,--paginate}'[pipe all output into ''less'']' \\\n+\t\t'(-p --paginate -P --no-pager)'{-P,--no-pager}'[do not pipe git output into a pager]' \\\n+\t\t'(--bare)--git-dir=[set the path to the repository]: :_directories' \\\n+\t\t'(--git-dir)--bare[treat the repository as a bare repository]' \\\n \t\t'(- :)--version[prints the git suite version]' \\\n-\t\t'--exec-path=[path to where your core git programs are installed]:: :_directories' \\\n-\t\t'--html-path[print the path where git''s HTML documentation is installed]' \\\n-\t\t'--info-path[print the path where the Info files are installed]' \\\n-\t\t'--man-path[print the manpath (see `man(1)`) for the man pages]' \\\n+\t\t'--exec-path=[path to where your core git programs are installed]: :_directories' \\\n+\t\t'(- :)--exec-path[print the path where your core git programs are installed]' \\\n+\t\t'(- :)--html-path[print the path where git''s HTML documentation is installed]' \\\n+\t\t'(- :)--info-path[print the path where the Info files are installed]' \\\n+\t\t'(- :)--man-path[print the manpath (see `man(1)`) for the man pages]' \\\n \t\t'--work-tree=[set the path to the working tree]: :_directories' \\\n \t\t'--namespace=[set the git namespace]:' \\\n \t\t'--no-replace-objects[do not use replacement refs to replace git objects]' \\\n-- \n2.32.0\n\n"},{"id":"427868","messageId":"20210618182518.697912-24-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 23/45] completion: factor out check in __gitcomp","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:56Z","receivedAt":"2021-06-18T18:26:14Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"This way we can reorganize the rest of the function.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash | 6 ++++--\n contrib/completion/git-completion.zsh  | 4 ++--\n 2 files changed, 6 insertions(+), 4 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex 366f255dfc..ad67abff36 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -330,9 +330,11 @@ __gitcomp ()\n {\n \tlocal cur_=\"${3-$cur}\"\n \n+\tif [[ \"$cur_\" == *= ]]; then\n+\t\treturn\n+\tfi\n+\n \tcase \"$cur_\" in\n-\t*=)\n-\t\t;;\n \t--no-*)\n \t\tlocal c i=0 IFS=$' \\t\\n'\n \t\tfor c in $1; do\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex b9c2c75c79..4dd0a4d821 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -56,9 +56,9 @@ __gitcomp ()\n \n \tlocal cur_=\"${3-$cur}\"\n \n+\t[[ \"$cur_\" == *= ]] && return\n+\n \tcase \"$cur_\" in\n-\t*=)\n-\t\t;;\n \t--no-*)\n \t\tlocal c IFS=$' \\t\\n'\n \t\tlocal -a array\n-- \n2.32.0\n\n"},{"id":"427869","messageId":"20210618182518.697912-25-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 24/45] completion: simplify equal suffix check","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:57Z","receivedAt":"2021-06-18T18:26:16Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"We know the prefix is already '--no-', there's no need to check for the\nfirst '--'.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash | 2 +-\n contrib/completion/git-completion.zsh  | 2 +-\n 2 files changed, 2 insertions(+), 2 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex ad67abff36..d0df695b52 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -344,7 +344,7 @@ __gitcomp ()\n \t\t\tc=\"$c${4-}\"\n \t\t\tif [[ $c == \"$cur_\"* ]]; then\n \t\t\t\tcase $c in\n-\t\t\t\t--*=|*.) ;;\n+\t\t\t\t*=|*.) ;;\n \t\t\t\t*) c=\"$c \" ;;\n \t\t\t\tesac\n \t\t\t\tCOMPREPLY[i++]=\"${2-}$c\"\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex 4dd0a4d821..1fff8437d5 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -68,7 +68,7 @@ __gitcomp ()\n \t\t\tfi\n \t\t\tc=\"$c${4-}\"\n \t\t\tcase $c in\n-\t\t\t--*=|*.) ;;\n+\t\t\t*=|*.) ;;\n \t\t\t*) c=\"$c \" ;;\n \t\t\tesac\n \t\t\tarray+=(\"$c\")\n-- \n2.32.0\n\n"},{"id":"427870","messageId":"20210618182518.697912-26-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 25/45] completion: refactor __gitcomp","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:58Z","receivedAt":"2021-06-18T18:26:19Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"We have to chunks of code doing exactly the same. There's no need for\nthat.\n\nNo functional changes.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash | 52 +++++++++-----------------\n contrib/completion/git-completion.zsh  | 52 ++++++++------------------\n 2 files changed, 34 insertions(+), 70 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex d0df695b52..b4b778da0b 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -334,44 +334,28 @@ __gitcomp ()\n \t\treturn\n \tfi\n \n-\tcase \"$cur_\" in\n-\t--no-*)\n-\t\tlocal c i=0 IFS=$' \\t\\n'\n-\t\tfor c in $1; do\n-\t\t\tif [[ $c == \"--\" ]]; then\n+\tlocal c i=0 IFS=$' \\t\\n'\n+\tfor c in $1; do\n+\t\tif [[ $c == \"--\" ]]; then\n+\t\t\tif [[ \"$cur_\" == --no-* ]]; then\n \t\t\t\tcontinue\n \t\t\tfi\n-\t\t\tc=\"$c${4-}\"\n-\t\t\tif [[ $c == \"$cur_\"* ]]; then\n-\t\t\t\tcase $c in\n-\t\t\t\t*=|*.) ;;\n-\t\t\t\t*) c=\"$c \" ;;\n-\t\t\t\tesac\n-\t\t\t\tCOMPREPLY[i++]=\"${2-}$c\"\n-\t\t\tfi\n-\t\tdone\n-\t\t;;\n-\t*)\n-\t\tlocal c i=0 IFS=$' \\t\\n'\n-\t\tfor c in $1; do\n-\t\t\tif [[ $c == \"--\" ]]; then\n-\t\t\t\tc=\"--no-...${4-}\"\n-\t\t\t\tif [[ $c == \"$cur_\"* ]]; then\n-\t\t\t\t\tCOMPREPLY[i++]=\"${2-}$c \"\n-\t\t\t\tfi\n-\t\t\t\tbreak\n-\t\t\tfi\n-\t\t\tc=\"$c${4-}\"\n+\n+\t\t\tc=\"--no-...${4-}\"\n \t\t\tif [[ $c == \"$cur_\"* ]]; then\n-\t\t\t\tcase $c in\n-\t\t\t\t*=|*.) ;;\n-\t\t\t\t*) c=\"$c \" ;;\n-\t\t\t\tesac\n-\t\t\t\tCOMPREPLY[i++]=\"${2-}$c\"\n+\t\t\t\tCOMPREPLY[i++]=\"${2-}$c \"\n \t\t\tfi\n-\t\tdone\n-\t\t;;\n-\tesac\n+\t\t\tbreak\n+\t\tfi\n+\t\tc=\"$c${4-}\"\n+\t\tif [[ $c == \"$cur_\"* ]]; then\n+\t\t\tcase $c in\n+\t\t\t*=|*.) ;;\n+\t\t\t*) c=\"$c \" ;;\n+\t\t\tesac\n+\t\t\tCOMPREPLY[i++]=\"${2-}$c\"\n+\t\tfi\n+\tdone\n }\n \n # Clear the variables caching builtins' options when (re-)sourcing\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex 1fff8437d5..c7e4de15c6 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -58,42 +58,22 @@ __gitcomp ()\n \n \t[[ \"$cur_\" == *= ]] && return\n \n-\tcase \"$cur_\" in\n-\t--no-*)\n-\t\tlocal c IFS=$' \\t\\n'\n-\t\tlocal -a array\n-\t\tfor c in ${=1}; do\n-\t\t\tif [[ $c == \"--\" ]]; then\n-\t\t\t\tcontinue\n-\t\t\tfi\n-\t\t\tc=\"$c${4-}\"\n-\t\t\tcase $c in\n-\t\t\t*=|*.) ;;\n-\t\t\t*) c=\"$c \" ;;\n-\t\t\tesac\n-\t\t\tarray+=(\"$c\")\n-\t\tdone\n-\t\tcompadd -Q -S '' -p \"${2-}\" -a -- array && _ret=0\n-\t\t;;\n-\t*)\n-\t\tlocal c IFS=$' \\t\\n'\n-\t\tlocal -a array\n-\t\tfor c in ${=1}; do\n-\t\t\tif [[ $c == \"--\" ]]; then\n-\t\t\t\tc=\"--no-...${4-}\"\n-\t\t\t\tarray+=(\"$c \")\n-\t\t\t\tbreak\n-\t\t\tfi\n-\t\t\tc=\"$c${4-}\"\n-\t\t\tcase $c in\n-\t\t\t*=|*.) ;;\n-\t\t\t*) c=\"$c \" ;;\n-\t\t\tesac\n-\t\t\tarray+=(\"$c\")\n-\t\tdone\n-\t\tcompadd -Q -S '' -p \"${2-}\" -a -- array && _ret=0\n-\t\t;;\n-\tesac\n+\tlocal c IFS=$' \\t\\n'\n+\tlocal -a array\n+\tfor c in ${=1}; do\n+\t\tif [[ $c == \"--\" ]]; then\n+\t\t\t[[ \"$cur_\" == --no-* ]] && continue\n+\t\t\tarray+=(\"--no-...${4-} \")\n+\t\t\tbreak\n+\t\tfi\n+\t\tc=\"$c${4-}\"\n+\t\tcase $c in\n+\t\t*=|*.) ;;\n+\t\t*) c=\"$c \" ;;\n+\t\tesac\n+\t\tarray+=(\"$c\")\n+\tdone\n+\tcompadd -Q -S '' -p \"${2-}\" -a -- array && _ret=0\n }\n \n __gitcomp_direct ()\n-- \n2.32.0\n\n"},{"id":"427871","messageId":"20210618182518.697912-27-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 26/45] completion: simplify __gitcomp","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:24:59Z","receivedAt":"2021-06-18T18:26:20Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"It's not possible for $cur_ to have anything more than --no- at this\npoint, so there's no need to add a suffix, nor check anything else.\n\nAll we are doing is checking that $cur_ matches --no, and adding a\ncompletion if so.\n\nThis way the code reflects what we are doing.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash | 5 ++---\n contrib/completion/git-completion.zsh  | 2 +-\n 2 files changed, 3 insertions(+), 4 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex b4b778da0b..ebf8df94e8 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -341,9 +341,8 @@ __gitcomp ()\n \t\t\t\tcontinue\n \t\t\tfi\n \n-\t\t\tc=\"--no-...${4-}\"\n-\t\t\tif [[ $c == \"$cur_\"* ]]; then\n-\t\t\t\tCOMPREPLY[i++]=\"${2-}$c \"\n+\t\t\tif [[ --no == \"$cur_\"* ]]; then\n+\t\t\t\tCOMPREPLY[i++]=\"--no-... \"\n \t\t\tfi\n \t\t\tbreak\n \t\tfi\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex c7e4de15c6..6008a73816 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -63,7 +63,7 @@ __gitcomp ()\n \tfor c in ${=1}; do\n \t\tif [[ $c == \"--\" ]]; then\n \t\t\t[[ \"$cur_\" == --no-* ]] && continue\n-\t\t\tarray+=(\"--no-...${4-} \")\n+\t\t\tarray+=(\"--no-... \")\n \t\t\tbreak\n \t\tfi\n \t\tc=\"$c${4-}\"\n-- \n2.32.0\n\n"},{"id":"427872","messageId":"20210618182518.697912-28-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 27/45] completion: bash: change suffix check in __gitcomp","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:25:00Z","receivedAt":"2021-06-18T18:26:25Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"We don't match the prefix, we shouldn't match the suffix either.\n\nThere are no functional changes since all the callers that add a suffix\nadd an =, and if $cur_ ended with that suffix, we would return\nimmediately.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash | 2 +-\n 1 file changed, 1 insertion(+), 1 deletion(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex ebf8df94e8..e7308b212f 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -346,8 +346,8 @@ __gitcomp ()\n \t\t\tfi\n \t\t\tbreak\n \t\tfi\n-\t\tc=\"$c${4-}\"\n \t\tif [[ $c == \"$cur_\"* ]]; then\n+\t\t\tc=\"$c${4-}\"\n \t\t\tcase $c in\n \t\t\t*=|*.) ;;\n \t\t\t*) c=\"$c \" ;;\n-- \n2.32.0\n\n"},{"id":"427873","messageId":"20210618182518.697912-29-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 28/45] completion: improve __gitcomp suffix code","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:25:01Z","receivedAt":"2021-06-18T18:26:26Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"There's no point in adding a suffix after a suffix.\n\nIf a suffix is provided, we add it, if not, then the default heuristic\nis used.\n\nThere's no functional change since most callers don't specify a suffix,\nand the ones that do use an =, which by default doesn't add an\nadditional suffix.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash | 17 ++++++++++-------\n contrib/completion/git-completion.zsh  | 18 +++++++++++-------\n 2 files changed, 21 insertions(+), 14 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex e7308b212f..c246d664c3 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -334,7 +334,7 @@ __gitcomp ()\n \t\treturn\n \tfi\n \n-\tlocal c i=0 IFS=$' \\t\\n'\n+\tlocal c i=0 IFS=$' \\t\\n' sfx\n \tfor c in $1; do\n \t\tif [[ $c == \"--\" ]]; then\n \t\t\tif [[ \"$cur_\" == --no-* ]]; then\n@@ -347,12 +347,15 @@ __gitcomp ()\n \t\t\tbreak\n \t\tfi\n \t\tif [[ $c == \"$cur_\"* ]]; then\n-\t\t\tc=\"$c${4-}\"\n-\t\t\tcase $c in\n-\t\t\t*=|*.) ;;\n-\t\t\t*) c=\"$c \" ;;\n-\t\t\tesac\n-\t\t\tCOMPREPLY[i++]=\"${2-}$c\"\n+\t\t\tif [[ -z \"${4+set}\" ]]; then\n+\t\t\t\tcase $c in\n+\t\t\t\t*=|*.) sfx=\"\" ;;\n+\t\t\t\t*) sfx=\" \" ;;\n+\t\t\t\tesac\n+\t\t\telse\n+\t\t\t\tsfx=\"$4\"\n+\t\t\tfi\n+\t\t\tCOMPREPLY[i++]=\"${2-}$c$sfx\"\n \t\tfi\n \tdone\n }\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex 6008a73816..b81479c814 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -58,7 +58,7 @@ __gitcomp ()\n \n \t[[ \"$cur_\" == *= ]] && return\n \n-\tlocal c IFS=$' \\t\\n'\n+\tlocal c IFS=$' \\t\\n' sfx\n \tlocal -a array\n \tfor c in ${=1}; do\n \t\tif [[ $c == \"--\" ]]; then\n@@ -66,12 +66,16 @@ __gitcomp ()\n \t\t\tarray+=(\"--no-... \")\n \t\t\tbreak\n \t\tfi\n-\t\tc=\"$c${4-}\"\n-\t\tcase $c in\n-\t\t*=|*.) ;;\n-\t\t*) c=\"$c \" ;;\n-\t\tesac\n-\t\tarray+=(\"$c\")\n+\n+\t\tif [[ -z \"${4+set}\" ]]; then\n+\t\t\tcase $c in\n+\t\t\t*=|*.) sfx=\"\" ;;\n+\t\t\t*) sfx=\" \" ;;\n+\t\t\tesac\n+\t\telse\n+\t\t\tsfx=\"$4\"\n+\t\tfi\n+\t\tarray+=(\"$c$sfx\")\n \tdone\n \tcompadd -Q -S '' -p \"${2-}\" -a -- array && _ret=0\n }\n-- \n2.32.0\n\n"},{"id":"427874","messageId":"20210618182518.697912-30-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 29/45] completion: bash: simplify config_variable_name","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:25:02Z","receivedAt":"2021-06-18T18:26:28Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"Now that we can actually pass a suffix to __gitcomp function, and it\ndoes the right thing, all the functions can receive the same suffix.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash | 8 ++++----\n 1 file changed, 4 insertions(+), 4 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex c246d664c3..cb25916f65 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -2585,7 +2585,7 @@ __git_complete_config_variable_value ()\n #                 subsections) instead of the default space.\n __git_complete_config_variable_name ()\n {\n-\tlocal cur_=\"$cur\" sfx\n+\tlocal cur_=\"$cur\" sfx=\" \"\n \n \twhile test $# != 0; do\n \t\tcase \"$1\" in\n@@ -2607,7 +2607,7 @@ __git_complete_config_variable_name ()\n \t\tlocal pfx=\"${cur_%.*}.\"\n \t\tcur_=\"${cur_#*.}\"\n \t\t__gitcomp_direct \"$(__git_heads \"$pfx\" \"$cur_\" \".\")\"\n-\t\t__gitcomp_nl $'autoSetupMerge\\nautoSetupRebase\\n' \"$pfx\" \"$cur_\" \"${sfx- }\"\n+\t\t__gitcomp_nl $'autoSetupMerge\\nautoSetupRebase\\n' \"$pfx\" \"$cur_\" \"$sfx\"\n \t\treturn\n \t\t;;\n \tguitool.*.*)\n@@ -2641,7 +2641,7 @@ __git_complete_config_variable_name ()\n \t\tlocal pfx=\"${cur_%.*}.\"\n \t\tcur_=\"${cur_#*.}\"\n \t\t__git_compute_all_commands\n-\t\t__gitcomp_nl \"$__git_all_commands\" \"$pfx\" \"$cur_\" \"${sfx- }\"\n+\t\t__gitcomp_nl \"$__git_all_commands\" \"$pfx\" \"$cur_\" \"$sfx\"\n \t\treturn\n \t\t;;\n \tremote.*.*)\n@@ -2657,7 +2657,7 @@ __git_complete_config_variable_name ()\n \t\tlocal pfx=\"${cur_%.*}.\"\n \t\tcur_=\"${cur_#*.}\"\n \t\t__gitcomp_nl \"$(__git_remotes)\" \"$pfx\" \"$cur_\" \".\"\n-\t\t__gitcomp_nl \"pushDefault\" \"$pfx\" \"$cur_\" \"${sfx- }\"\n+\t\t__gitcomp_nl \"pushDefault\" \"$pfx\" \"$cur_\" \"$sfx\"\n \t\treturn\n \t\t;;\n \turl.*.*)\n-- \n2.32.0\n\n"},{"id":"427875","messageId":"20210618182518.697912-31-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 30/45] test: completion: add missing test","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:25:03Z","receivedAt":"2021-06-18T18:26:34Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"Once the correct suffix in __git_complete_config_variable_name() is set,\nwe can add the test again.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n t/t9902-completion.sh | 7 +++++++\n 1 file changed, 7 insertions(+)\n\ndiff --git a/t/t9902-completion.sh b/t/t9902-completion.sh\nindex bb3eebffb7..9803878480 100755\n--- a/t/t9902-completion.sh\n+++ b/t/t9902-completion.sh\n@@ -2335,6 +2335,13 @@ test_expect_success 'git config - value' '\n \tEOF\n '\n \n+test_expect_success 'git config - direct completions' '\n+\ttest_completion \"git config branch.autoSetup\" <<-\\EOF\n+\tbranch.autoSetupMerge Z\n+\tbranch.autoSetupRebase Z\n+\tEOF\n+'\n+\n test_expect_success 'git -c - section' '\n \ttest_completion \"git -c br\" <<-\\EOF\n \tbranch.Z\n-- \n2.32.0\n\n"},{"id":"427876","messageId":"20210618182518.697912-32-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 31/45] completion: bash: improve __gitcomp description","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:25:04Z","receivedAt":"2021-06-18T18:26:40Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"It does a lot more than what is stated now.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash | 3 +--\n 1 file changed, 1 insertion(+), 2 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex cb25916f65..0218ae7eb6 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -319,8 +319,7 @@ __gitcompadd ()\n \tdone\n }\n \n-# Generates completion reply, appending a space to possible completion words,\n-# if necessary.\n+# Creates completion replies, reorganizing options and adding suffixes as needed.\n # It accepts 1 to 4 arguments:\n # 1: List of possible completion words.\n # 2: A prefix to be added to each possible completion word (optional).\n-- \n2.32.0\n\n"},{"id":"427877","messageId":"20210618182518.697912-33-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 32/45] completion: add __gitcomp_opts","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:25:05Z","receivedAt":"2021-06-18T18:26:42Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"Create a new simplified version of __gitcomp for most callers, and\n__gitcomp_opts for the ones that need reorganizing all the options.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash | 100 ++++++++++++++-----------\n contrib/completion/git-completion.zsh  |   8 ++\n t/t9902-completion.sh                  |  58 +++++++-------\n 3 files changed, 93 insertions(+), 73 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex 0218ae7eb6..8836eab884 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -319,13 +319,25 @@ __gitcompadd ()\n \tdone\n }\n \n-# Creates completion replies, reorganizing options and adding suffixes as needed.\n+# Creates completion replies.\n # It accepts 1 to 4 arguments:\n # 1: List of possible completion words.\n # 2: A prefix to be added to each possible completion word (optional).\n # 3: Generate possible completion matches for this word (optional).\n # 4: A suffix to be appended to each possible completion word (optional).\n __gitcomp ()\n+{\n+\tlocal IFS=$' \\t\\n'\n+\t__gitcompadd \"$1\" \"${2-}\" \"${3-$cur}\" \"${4- }\"\n+}\n+\n+# Creates completion replies, reorganizing options and adding suffixes as needed.\n+# It accepts 1 to 4 arguments:\n+# 1: List of possible completion words.\n+# 2: A prefix to be added to each possible completion word (optional).\n+# 3: Generate possible completion matches for this word (optional).\n+# 4: A suffix to be appended to each possible completion word (optional).\n+__gitcomp_opts ()\n {\n \tlocal cur_=\"${3-$cur}\"\n \n@@ -369,7 +381,7 @@ fi\n \n # This function is equivalent to\n #\n-#    __gitcomp \"$(git xxx --git-completion-helper) ...\"\n+#    __gitcomp_opts \"$(git xxx --git-completion-helper) ...\"\n #\n # except that the output is cached. Accept 1-3 arguments:\n # 1: the git command to execute, this is also the cache key\n@@ -404,7 +416,7 @@ __gitcomp_builtin ()\n \t\teval \"$var=\\\"$options\\\"\"\n \tfi\n \n-\t__gitcomp \"$options\"\n+\t__gitcomp_opts \"$options\"\n }\n \n # Generates completion reply from newline-separated possible completion words\n@@ -1041,7 +1053,7 @@ __git_complete_strategy ()\n \t\treturn 0\n \t\t;;\n \t-X)\n-\t\t__gitcomp \"$__git_merge_strategy_options\"\n+\t\t__gitcomp_opts \"$__git_merge_strategy_options\"\n \t\treturn 0\n \t\t;;\n \tesac\n@@ -1051,7 +1063,7 @@ __git_complete_strategy ()\n \t\treturn 0\n \t\t;;\n \t--strategy-option=*)\n-\t\t__gitcomp \"$__git_merge_strategy_options\" \"\" \"${cur##--strategy-option=}\"\n+\t\t__gitcomp_opts \"$__git_merge_strategy_options\" \"\" \"${cur##--strategy-option=}\"\n \t\treturn 0\n \t\t;;\n \tesac\n@@ -1293,7 +1305,7 @@ _git_am ()\n {\n \t__git_find_repo_path\n \tif [ -d \"$__git_repo_path\"/rebase-apply ]; then\n-\t\t__gitcomp \"$__git_am_inprogress_options\"\n+\t\t__gitcomp_opts \"$__git_am_inprogress_options\"\n \t\treturn\n \tfi\n \tcase \"$cur\" in\n@@ -1553,7 +1565,7 @@ _git_cherry_pick ()\n {\n \t__git_find_repo_path\n \tif [ -f \"$__git_repo_path\"/CHERRY_PICK_HEAD ]; then\n-\t\t__gitcomp \"$__git_cherry_pick_inprogress_options\"\n+\t\t__gitcomp_opts \"$__git_cherry_pick_inprogress_options\"\n \t\treturn\n \tfi\n \n@@ -1711,7 +1723,7 @@ _git_diff ()\n \t\treturn\n \t\t;;\n \t--*)\n-\t\t__gitcomp \"$__git_diff_difftool_options\"\n+\t\t__gitcomp_opts \"$__git_diff_difftool_options\"\n \t\treturn\n \t\t;;\n \tesac\n@@ -2005,7 +2017,7 @@ _git_log ()\n \t\treturn\n \t\t;;\n \t--*)\n-\t\t__gitcomp \"\n+\t\t__gitcomp_opts \"\n \t\t\t$__git_log_common_options\n \t\t\t$__git_log_shortlog_options\n \t\t\t$__git_log_gitk_options\n@@ -2068,7 +2080,7 @@ _git_mergetool ()\n \t\treturn\n \t\t;;\n \t--*)\n-\t\t__gitcomp \"--tool= --prompt --no-prompt --gui --no-gui\"\n+\t\t__gitcomp_opts \"--tool= --prompt --no-prompt --gui --no-gui\"\n \t\treturn\n \t\t;;\n \tesac\n@@ -2216,7 +2228,7 @@ _git_range_diff ()\n {\n \tcase \"$cur\" in\n \t--*)\n-\t\t__gitcomp \"\n+\t\t__gitcomp_opts \"\n \t\t\t--creation-factor= --no-dual-color\n \t\t\t$__git_diff_common_options\n \t\t\"\n@@ -2233,11 +2245,11 @@ _git_rebase ()\n {\n \t__git_find_repo_path\n \tif [ -f \"$__git_repo_path\"/rebase-merge/interactive ]; then\n-\t\t__gitcomp \"$__git_rebase_interactive_inprogress_options\"\n+\t\t__gitcomp_opts \"$__git_rebase_interactive_inprogress_options\"\n \t\treturn\n \telif [ -d \"$__git_repo_path\"/rebase-apply ] || \\\n \t     [ -d \"$__git_repo_path\"/rebase-merge ]; then\n-\t\t__gitcomp \"$__git_rebase_inprogress_options\"\n+\t\t__gitcomp_opts \"$__git_rebase_inprogress_options\"\n \t\treturn\n \tfi\n \t__git_complete_strategy && return\n@@ -2679,7 +2691,7 @@ __git_complete_config_variable_name ()\n \t\t\t\t\tfor (s in sections)\n \t\t\t\t\t\tprint s \".\"\n \t\t\t\t}\n-\t\t\t\t')\" \"\" \"$cur_\"\n+\t\t\t\t')\" \"\" \"$cur_\" \"\"\n \t\t;;\n \tesac\n }\n@@ -2857,7 +2869,7 @@ _git_revert ()\n {\n \t__git_find_repo_path\n \tif [ -f \"$__git_repo_path\"/REVERT_HEAD ]; then\n-\t\t__gitcomp \"$__git_revert_inprogress_options\"\n+\t\t__gitcomp_opts \"$__git_revert_inprogress_options\"\n \t\treturn\n \tfi\n \t__git_complete_strategy && return\n@@ -2889,7 +2901,7 @@ _git_shortlog ()\n \n \tcase \"$cur\" in\n \t--*)\n-\t\t__gitcomp \"\n+\t\t__gitcomp_opts \"\n \t\t\t$__git_log_common_options\n \t\t\t$__git_log_shortlog_options\n \t\t\t--numbered --summary --email\n@@ -2927,7 +2939,7 @@ _git_show ()\n \t\treturn\n \t\t;;\n \t--*)\n-\t\t__gitcomp \"--pretty= --format= --abbrev-commit --no-abbrev-commit\n+\t\t__gitcomp_opts \"--pretty= --format= --abbrev-commit --no-abbrev-commit\n \t\t\t--oneline --show-signature\n \t\t\t--expand-tabs --expand-tabs= --no-expand-tabs\n \t\t\t$__git_diff_common_options\n@@ -2960,10 +2972,10 @@ _git_sparse_checkout ()\n \n \tcase \"$subcommand,$cur\" in\n \tinit,--*)\n-\t\t__gitcomp \"--cone\"\n+\t\t__gitcomp_opts \"--cone\"\n \t\t;;\n \tset,--*)\n-\t\t__gitcomp \"--stdin\"\n+\t\t__gitcomp_opts \"--stdin\"\n \t\t;;\n \t*)\n \t\t;;\n@@ -3025,7 +3037,7 @@ _git_submodule ()\n \tif [ -z \"$subcommand\" ]; then\n \t\tcase \"$cur\" in\n \t\t--*)\n-\t\t\t__gitcomp \"--quiet\"\n+\t\t\t__gitcomp_opts \"--quiet\"\n \t\t\t;;\n \t\t*)\n \t\t\t__gitcomp \"$subcommands\"\n@@ -3036,29 +3048,29 @@ _git_submodule ()\n \n \tcase \"$subcommand,$cur\" in\n \tadd,--*)\n-\t\t__gitcomp \"--branch --force --name --reference --depth\"\n+\t\t__gitcomp_opts \"--branch --force --name --reference --depth\"\n \t\t;;\n \tstatus,--*)\n-\t\t__gitcomp \"--cached --recursive\"\n+\t\t__gitcomp_opts \"--cached --recursive\"\n \t\t;;\n \tdeinit,--*)\n-\t\t__gitcomp \"--force --all\"\n+\t\t__gitcomp_opts \"--force --all\"\n \t\t;;\n \tupdate,--*)\n-\t\t__gitcomp \"\n+\t\t__gitcomp_opts \"\n \t\t\t--init --remote --no-fetch\n \t\t\t--recommend-shallow --no-recommend-shallow\n \t\t\t--force --rebase --merge --reference --depth --recursive --jobs\n \t\t\"\n \t\t;;\n \tset-branch,--*)\n-\t\t__gitcomp \"--default --branch\"\n+\t\t__gitcomp_opts \"--default --branch\"\n \t\t;;\n \tsummary,--*)\n-\t\t__gitcomp \"--cached --files --summary-limit\"\n+\t\t__gitcomp_opts \"--cached --files --summary-limit\"\n \t\t;;\n \tforeach,--*|sync,--*)\n-\t\t__gitcomp \"--recursive\"\n+\t\t__gitcomp_opts \"--recursive\"\n \t\t;;\n \t*)\n \t\t;;\n@@ -3099,64 +3111,64 @@ _git_svn ()\n \n \t\tcase \"$subcommand,$cur\" in\n \t\tfetch,--*)\n-\t\t\t__gitcomp \"--revision= --fetch-all $fc_opts\"\n+\t\t\t__gitcomp_opts \"--revision= --fetch-all $fc_opts\"\n \t\t\t;;\n \t\tclone,--*)\n-\t\t\t__gitcomp \"--revision= $fc_opts $init_opts\"\n+\t\t\t__gitcomp_opts \"--revision= $fc_opts $init_opts\"\n \t\t\t;;\n \t\tinit,--*)\n-\t\t\t__gitcomp \"$init_opts\"\n+\t\t\t__gitcomp_opts \"$init_opts\"\n \t\t\t;;\n \t\tdcommit,--*)\n-\t\t\t__gitcomp \"\n+\t\t\t__gitcomp_opts \"\n \t\t\t\t--merge --strategy= --verbose --dry-run\n \t\t\t\t--fetch-all --no-rebase --commit-url\n \t\t\t\t--revision --interactive $cmt_opts $fc_opts\n \t\t\t\t\"\n \t\t\t;;\n \t\tset-tree,--*)\n-\t\t\t__gitcomp \"--stdin $cmt_opts $fc_opts\"\n+\t\t\t__gitcomp_opts \"--stdin $cmt_opts $fc_opts\"\n \t\t\t;;\n \t\tcreate-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\\\n \t\tshow-externals,--*|mkdirs,--*)\n-\t\t\t__gitcomp \"--revision=\"\n+\t\t\t__gitcomp_opts \"--revision=\"\n \t\t\t;;\n \t\tlog,--*)\n-\t\t\t__gitcomp \"\n+\t\t\t__gitcomp_opts \"\n \t\t\t\t--limit= --revision= --verbose --incremental\n \t\t\t\t--oneline --show-commit --non-recursive\n \t\t\t\t--authors-file= --color\n \t\t\t\t\"\n \t\t\t;;\n \t\trebase,--*)\n-\t\t\t__gitcomp \"\n+\t\t\t__gitcomp_opts \"\n \t\t\t\t--merge --verbose --strategy= --local\n \t\t\t\t--fetch-all --dry-run $fc_opts\n \t\t\t\t\"\n \t\t\t;;\n \t\tcommit-diff,--*)\n-\t\t\t__gitcomp \"--message= --file= --revision= $cmt_opts\"\n+\t\t\t__gitcomp_opts \"--message= --file= --revision= $cmt_opts\"\n \t\t\t;;\n \t\tinfo,--*)\n-\t\t\t__gitcomp \"--url\"\n+\t\t\t__gitcomp_opts \"--url\"\n \t\t\t;;\n \t\tbranch,--*)\n-\t\t\t__gitcomp \"--dry-run --message --tag\"\n+\t\t\t__gitcomp_opts \"--dry-run --message --tag\"\n \t\t\t;;\n \t\ttag,--*)\n-\t\t\t__gitcomp \"--dry-run --message\"\n+\t\t\t__gitcomp_opts \"--dry-run --message\"\n \t\t\t;;\n \t\tblame,--*)\n-\t\t\t__gitcomp \"--git-format\"\n+\t\t\t__gitcomp_opts \"--git-format\"\n \t\t\t;;\n \t\tmigrate,--*)\n-\t\t\t__gitcomp \"\n+\t\t\t__gitcomp_opts \"\n \t\t\t\t--config-dir= --ignore-paths= --minimize\n \t\t\t\t--no-auth-cache --username=\n \t\t\t\t\"\n \t\t\t;;\n \t\treset,--*)\n-\t\t\t__gitcomp \"--revision= --parent\"\n+\t\t\t__gitcomp_opts \"--revision= --parent\"\n \t\t\t;;\n \t\t*)\n \t\t\t;;\n@@ -3396,7 +3408,7 @@ __git_main ()\n \t\tesac\n \t\tcase \"$cur\" in\n \t\t--*)\n-\t\t\t__gitcomp \"\n+\t\t\t__gitcomp_opts \"\n \t\t\t--paginate\n \t\t\t--no-pager\n \t\t\t--git-dir=\n@@ -3447,7 +3459,7 @@ __gitk_main ()\n \tfi\n \tcase \"$cur\" in\n \t--*)\n-\t\t__gitcomp \"\n+\t\t__gitcomp_opts \"\n \t\t\t$__git_log_common_options\n \t\t\t$__git_log_gitk_options\n \t\t\t$merge\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex b81479c814..e515f464ab 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -54,6 +54,14 @@ __gitcomp ()\n {\n \temulate -L zsh\n \n+\tlocal IFS=$' \\t\\n'\n+\tcompadd -Q -S \"${4- }\" -p \"${2-}\" -- ${=1} && _ret=0\n+}\n+\n+__gitcomp_opts ()\n+{\n+\temulate -L zsh\n+\n \tlocal cur_=\"${3-$cur}\"\n \n \t[[ \"$cur_\" == *= ]] && return\ndiff --git a/t/t9902-completion.sh b/t/t9902-completion.sh\nindex 9803878480..3dbb5eb121 100755\n--- a/t/t9902-completion.sh\n+++ b/t/t9902-completion.sh\n@@ -101,17 +101,17 @@ test_completion ()\n \ttest_cmp expected out_sorted\n }\n \n-# Test __gitcomp.\n+# Test __gitcomp_opts.\n # The first argument is the typed text so far (cur); the rest are\n-# passed to __gitcomp.  Expected output comes is read from the\n+# passed to __gitcomp_opts.  Expected output comes is read from the\n # standard input, like test_completion().\n-test_gitcomp ()\n+test_gitcomp_opts ()\n {\n \tlocal -a COMPREPLY &&\n \tsed -e 's/Z$//' >expected &&\n \tlocal cur=\"$1\" &&\n \tshift &&\n-\t__gitcomp \"$@\" &&\n+\t__gitcomp_opts \"$@\" &&\n \tprint_comp &&\n \ttest_cmp expected out\n }\n@@ -466,8 +466,8 @@ test_expect_success '__gitcomp_direct - puts everything into COMPREPLY as-is' '\n \ttest_cmp expected out\n '\n \n-test_expect_success '__gitcomp - trailing space - options' '\n-\ttest_gitcomp \"--re\" \"--dry-run --reuse-message= --reedit-message=\n+test_expect_success '__gitcomp_opts - trailing space - options' '\n+\ttest_gitcomp_opts \"--re\" \"--dry-run --reuse-message= --reedit-message=\n \t\t--reset-author\" <<-EOF\n \t--reuse-message=Z\n \t--reedit-message=Z\n@@ -475,8 +475,8 @@ test_expect_success '__gitcomp - trailing space - options' '\n \tEOF\n '\n \n-test_expect_success '__gitcomp - trailing space - config keys' '\n-\ttest_gitcomp \"br\" \"branch. branch.autosetupmerge\n+test_expect_success '__gitcomp_opts - trailing space - config keys' '\n+\ttest_gitcomp_opts \"br\" \"branch. branch.autosetupmerge\n \t\tbranch.autosetuprebase browser.\" <<-\\EOF\n \tbranch.Z\n \tbranch.autosetupmerge Z\n@@ -485,32 +485,32 @@ test_expect_success '__gitcomp - trailing space - config keys' '\n \tEOF\n '\n \n-test_expect_success '__gitcomp - option parameter' '\n-\ttest_gitcomp \"--strategy=re\" \"octopus ours recursive resolve subtree\" \\\n+test_expect_success '__gitcomp_opts - option parameter' '\n+\ttest_gitcomp_opts \"--strategy=re\" \"octopus ours recursive resolve subtree\" \\\n \t\t\"\" \"re\" <<-\\EOF\n \trecursive Z\n \tresolve Z\n \tEOF\n '\n \n-test_expect_success '__gitcomp - prefix' '\n-\ttest_gitcomp \"branch.maint.me\" \"remote merge mergeoptions rebase\" \\\n+test_expect_success '__gitcomp_opts - prefix' '\n+\ttest_gitcomp_opts \"branch.maint.me\" \"remote merge mergeoptions rebase\" \\\n \t\t\"branch.maint.\" \"me\" <<-\\EOF\n \tbranch.maint.merge Z\n \tbranch.maint.mergeoptions Z\n \tEOF\n '\n \n-test_expect_success '__gitcomp - suffix' '\n-\ttest_gitcomp \"branch.ma\" \"master maint next seen\" \"branch.\" \\\n+test_expect_success '__gitcomp_opts - suffix' '\n+\ttest_gitcomp_opts \"branch.ma\" \"master maint next seen\" \"branch.\" \\\n \t\t\"ma\" \".\" <<-\\EOF\n \tbranch.master.Z\n \tbranch.maint.Z\n \tEOF\n '\n \n-test_expect_success '__gitcomp - ignore optional negative options' '\n-\ttest_gitcomp \"--\" \"--abc --def --no-one -- --no-two\" <<-\\EOF\n+test_expect_success '__gitcomp_opts - ignore optional negative options' '\n+\ttest_gitcomp_opts \"--\" \"--abc --def --no-one -- --no-two\" <<-\\EOF\n \t--abc Z\n \t--def Z\n \t--no-one Z\n@@ -518,44 +518,44 @@ test_expect_success '__gitcomp - ignore optional negative options' '\n \tEOF\n '\n \n-test_expect_success '__gitcomp - ignore/narrow optional negative options' '\n-\ttest_gitcomp \"--a\" \"--abc --abcdef --no-one -- --no-two\" <<-\\EOF\n+test_expect_success '__gitcomp_opts - ignore/narrow optional negative options' '\n+\ttest_gitcomp_opts \"--a\" \"--abc --abcdef --no-one -- --no-two\" <<-\\EOF\n \t--abc Z\n \t--abcdef Z\n \tEOF\n '\n \n-test_expect_success '__gitcomp - ignore/narrow optional negative options' '\n-\ttest_gitcomp \"--n\" \"--abc --def --no-one -- --no-two\" <<-\\EOF\n+test_expect_success '__gitcomp_opts - ignore/narrow optional negative options' '\n+\ttest_gitcomp_opts \"--n\" \"--abc --def --no-one -- --no-two\" <<-\\EOF\n \t--no-one Z\n \t--no-... Z\n \tEOF\n '\n \n-test_expect_success '__gitcomp - expand all negative options' '\n-\ttest_gitcomp \"--no-\" \"--abc --def --no-one -- --no-two\" <<-\\EOF\n+test_expect_success '__gitcomp_opts - expand all negative options' '\n+\ttest_gitcomp_opts \"--no-\" \"--abc --def --no-one -- --no-two\" <<-\\EOF\n \t--no-one Z\n \t--no-two Z\n \tEOF\n '\n \n-test_expect_success '__gitcomp - expand/narrow all negative options' '\n-\ttest_gitcomp \"--no-o\" \"--abc --def --no-one -- --no-two\" <<-\\EOF\n+test_expect_success '__gitcomp_opts - expand/narrow all negative options' '\n+\ttest_gitcomp_opts \"--no-o\" \"--abc --def --no-one -- --no-two\" <<-\\EOF\n \t--no-one Z\n \tEOF\n '\n \n-test_expect_success '__gitcomp - equal skip' '\n-\ttest_gitcomp \"--option=\" \"--option=\" <<-\\EOF &&\n+test_expect_success '__gitcomp_opts - equal skip' '\n+\ttest_gitcomp_opts \"--option=\" \"--option=\" <<-\\EOF &&\n \n \tEOF\n-\ttest_gitcomp \"option=\" \"option=\" <<-\\EOF\n+\ttest_gitcomp_opts \"option=\" \"option=\" <<-\\EOF\n \n \tEOF\n '\n \n-test_expect_success '__gitcomp - doesnt fail because of invalid variable name' '\n-\trun_func __gitcomp \"$invalid_variable_name\"\n+test_expect_success '__gitcomp_opts - doesnt fail because of invalid variable name' '\n+\trun_func __gitcomp_opts \"$invalid_variable_name\"\n '\n \n read -r -d \"\" refs <<-\\EOF\n-- \n2.32.0\n\n"},{"id":"427878","messageId":"20210618182518.697912-34-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 33/45] completion: bash: cleanup __gitcomp* invocations","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:25:06Z","receivedAt":"2021-06-18T18:26:44Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"Some __gitcomp calls should be __gitcomp_nl, and vice versa.\n\nNo functional changes.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash | 22 +++++++++-------------\n 1 file changed, 9 insertions(+), 13 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex 8836eab884..7a27347d56 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -1369,7 +1369,7 @@ _git_archive ()\n {\n \tcase \"$cur\" in\n \t--format=*)\n-\t\t__gitcomp \"$(git archive --list)\" \"\" \"${cur##--format=}\"\n+\t\t__gitcomp_nl \"$(git archive --list)\" \"\" \"${cur##--format=}\"\n \t\treturn\n \t\t;;\n \t--remote=*)\n@@ -1782,9 +1782,7 @@ _git_format_patch ()\n {\n \tcase \"$cur\" in\n \t--thread=*)\n-\t\t__gitcomp \"\n-\t\t\tdeep shallow\n-\t\t\t\" \"\" \"${cur##--thread=}\"\n+\t\t__gitcomp \"deep shallow\" \"\" \"${cur##--thread=}\"\n \t\treturn\n \t\t;;\n \t--base=*|--interdiff=*|--range-diff=*)\n@@ -2290,7 +2288,7 @@ _git_send_email ()\n {\n \tcase \"$prev\" in\n \t--to|--cc|--bcc|--from)\n-\t\t__gitcomp \"$(__git send-email --dump-aliases)\"\n+\t\t__gitcomp_nl \"$(__git send-email --dump-aliases)\"\n \t\treturn\n \t\t;;\n \tesac\n@@ -2314,9 +2312,7 @@ _git_send_email ()\n \t\treturn\n \t\t;;\n \t--thread=*)\n-\t\t__gitcomp \"\n-\t\t\tdeep shallow\n-\t\t\t\" \"\" \"${cur##--thread=}\"\n+\t\t__gitcomp \"deep shallow\" \"\" \"${cur##--thread=}\"\n \t\treturn\n \t\t;;\n \t--to=*|--cc=*|--bcc=*|--from=*)\n@@ -2618,7 +2614,7 @@ __git_complete_config_variable_name ()\n \t\tlocal pfx=\"${cur_%.*}.\"\n \t\tcur_=\"${cur_#*.}\"\n \t\t__gitcomp_direct \"$(__git_heads \"$pfx\" \"$cur_\" \".\")\"\n-\t\t__gitcomp_nl $'autoSetupMerge\\nautoSetupRebase\\n' \"$pfx\" \"$cur_\" \"$sfx\"\n+\t\t__gitcomp \"autoSetupMerge autoSetupRebase\" \"$pfx\" \"$cur_\" \"$sfx\"\n \t\treturn\n \t\t;;\n \tguitool.*.*)\n@@ -2668,7 +2664,7 @@ __git_complete_config_variable_name ()\n \t\tlocal pfx=\"${cur_%.*}.\"\n \t\tcur_=\"${cur_#*.}\"\n \t\t__gitcomp_nl \"$(__git_remotes)\" \"$pfx\" \"$cur_\" \".\"\n-\t\t__gitcomp_nl \"pushDefault\" \"$pfx\" \"$cur_\" \"$sfx\"\n+\t\t__gitcomp \"pushDefault\" \"$pfx\" \"$cur_\" \"$sfx\"\n \t\treturn\n \t\t;;\n \turl.*.*)\n@@ -2683,7 +2679,7 @@ __git_complete_config_variable_name ()\n \t\t;;\n \t*)\n \t\t__git_compute_config_vars\n-\t\t__gitcomp \"$(echo \"$__git_config_vars\" |\n+\t\t__gitcomp_nl \"$(echo \"$__git_config_vars\" |\n \t\t\t\tawk -F . '{\n \t\t\t\t\tsections[$1] = 1\n \t\t\t\t}\n@@ -2785,7 +2781,7 @@ _git_remote ()\n \t\t__gitcomp_builtin remote_update\n \t\t;;\n \tupdate,*)\n-\t\t__gitcomp \"$(__git_remotes) $(__git_get_config_variables \"remotes\")\"\n+\t\t__gitcomp_nl \"$(__git_remotes) $(__git_get_config_variables \"remotes\")\"\n \t\t;;\n \tset-url,--*)\n \t\t__gitcomp_builtin remote_set-url\n@@ -3430,7 +3426,7 @@ __git_main ()\n \t\t\tthen\n \t\t\t\t__gitcomp \"$GIT_TESTING_PORCELAIN_COMMAND_LIST\"\n \t\t\telse\n-\t\t\t\t__gitcomp \"$(__git --list-cmds=list-mainporcelain,others,nohelpers,alias,list-complete,config)\"\n+\t\t\t\t__gitcomp_nl \"$(__git --list-cmds=list-mainporcelain,others,nohelpers,alias,list-complete,config)\"\n \t\t\tfi\n \t\t\t;;\n \t\tesac\n-- \n2.32.0\n\n"},{"id":"427879","messageId":"20210618182518.697912-35-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 34/45] completion: bash: shuffle __gitcomp functions","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:25:07Z","receivedAt":"2021-06-18T18:26:46Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"They are the ones that actually do the completion, put them at the top.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash | 270 +++++++++++++------------\n 1 file changed, 139 insertions(+), 131 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex 7a27347d56..47c96b918e 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -54,6 +54,145 @@\n #     When set to \"1\" suggest all options, including options which are\n #     typically hidden (e.g. '--allow-empty' for 'git commit').\n \n+# The following functions are meant to modify COMPREPLY, which should not be\n+# modified directly.  The purpose is to localize the modifications so it's\n+# easier to emulate it in Zsh. Every time a new __gitcomp* function is added,\n+# the corresponding function should be added to Zsh.\n+\n+__gitcompadd ()\n+{\n+\tlocal x i=${#COMPREPLY[@]}\n+\tfor x in $1; do\n+\t\tif [[ \"$x\" == \"$3\"* ]]; then\n+\t\t\tCOMPREPLY[i++]=\"$2$x$4\"\n+\t\tfi\n+\tdone\n+}\n+\n+# Creates completion replies.\n+# It accepts 1 to 4 arguments:\n+# 1: List of possible completion words.\n+# 2: A prefix to be added to each possible completion word (optional).\n+# 3: Generate possible completion matches for this word (optional).\n+# 4: A suffix to be appended to each possible completion word (optional).\n+__gitcomp ()\n+{\n+\tlocal IFS=$' \\t\\n'\n+\t__gitcompadd \"$1\" \"${2-}\" \"${3-$cur}\" \"${4- }\"\n+}\n+\n+# Generates completion reply from newline-separated possible completion words\n+# by appending a space to all of them. The result is appended to COMPREPLY.\n+# It accepts 1 to 4 arguments:\n+# 1: List of possible completion words, separated by a single newline.\n+# 2: A prefix to be added to each possible completion word (optional).\n+# 3: Generate possible completion matches for this word (optional).\n+# 4: A suffix to be appended to each possible completion word instead of\n+#    the default space (optional).  If specified but empty, nothing is\n+#    appended.\n+__gitcomp_nl ()\n+{\n+\tlocal IFS=$'\\n'\n+\t__gitcompadd \"$1\" \"${2-}\" \"${3-$cur}\" \"${4- }\"\n+}\n+\n+# Appends prefiltered words to COMPREPLY without any additional processing.\n+# Callers must take care of providing only words that match the current word\n+# to be completed and adding any prefix and/or suffix (trailing space!), if\n+# necessary.\n+# 1: List of newline-separated matching completion words, complete with\n+#    prefix and suffix.\n+__gitcomp_direct ()\n+{\n+\tlocal IFS=$'\\n'\n+\n+\tCOMPREPLY+=($1)\n+}\n+\n+# Generates completion reply with compgen from newline-separated possible\n+# completion filenames.\n+# It accepts 1 to 3 arguments:\n+# 1: List of possible completion filenames, separated by a single newline.\n+# 2: A directory prefix to be added to each possible completion filename\n+#    (optional).\n+# 3: Generate possible completion matches for this word (optional).\n+__gitcomp_file ()\n+{\n+\tlocal IFS=$'\\n'\n+\n+\t# XXX does not work when the directory prefix contains a tilde,\n+\t# since tilde expansion is not applied.\n+\t# This means that COMPREPLY will be empty and Bash default\n+\t# completion will be used.\n+\t__gitcompadd \"$1\" \"${2-}\" \"${3-$cur}\" \"\"\n+\n+\t# use a hack to enable file mode in bash < 4\n+\tcompopt -o filenames +o nospace 2>/dev/null ||\n+\tcompgen -f /non-existing-dir/ >/dev/null ||\n+\ttrue\n+}\n+\n+# Fills the COMPREPLY array with prefiltered paths without any additional\n+# processing.\n+# Callers must take care of providing only paths that match the current path\n+# to be completed and adding any prefix path components, if necessary.\n+# 1: List of newline-separated matching paths, complete with all prefix\n+#    path components.\n+__gitcomp_file_direct ()\n+{\n+\tlocal IFS=$'\\n'\n+\n+\tCOMPREPLY+=($1)\n+\n+\t# use a hack to enable file mode in bash < 4\n+\tcompopt -o filenames +o nospace 2>/dev/null ||\n+\tcompgen -f /non-existing-dir/ >/dev/null ||\n+\ttrue\n+}\n+\n+# Creates completion replies, reorganizing options and adding suffixes as needed.\n+# It accepts 1 to 4 arguments:\n+# 1: List of possible completion words.\n+# 2: A prefix to be added to each possible completion word (optional).\n+# 3: Generate possible completion matches for this word (optional).\n+# 4: A suffix to be appended to each possible completion word (optional).\n+__gitcomp_opts ()\n+{\n+\tlocal cur_=\"${3-$cur}\"\n+\n+\tif [[ \"$cur_\" == *= ]]; then\n+\t\treturn\n+\tfi\n+\n+\tlocal c i=0 IFS=$' \\t\\n' sfx\n+\tfor c in $1; do\n+\t\tif [[ $c == \"--\" ]]; then\n+\t\t\tif [[ \"$cur_\" == --no-* ]]; then\n+\t\t\t\tcontinue\n+\t\t\tfi\n+\n+\t\t\tif [[ --no == \"$cur_\"* ]]; then\n+\t\t\t\tCOMPREPLY[i++]=\"--no-... \"\n+\t\t\tfi\n+\t\t\tbreak\n+\t\tfi\n+\t\tif [[ $c == \"$cur_\"* ]]; then\n+\t\t\tif [[ -z \"${4+set}\" ]]; then\n+\t\t\t\tcase $c in\n+\t\t\t\t*=|*.) sfx=\"\" ;;\n+\t\t\t\t*) sfx=\" \" ;;\n+\t\t\t\tesac\n+\t\t\telse\n+\t\t\t\tsfx=\"$4\"\n+\t\t\tfi\n+\t\t\tCOMPREPLY[i++]=\"${2-}$c$sfx\"\n+\t\tfi\n+\tdone\n+}\n+\n+# __gitcomp functions end here\n+# ==============================================================================\n+\n # Discovers the path to the git repository taking any '--git-dir=<path>' and\n # '-C <path>' options into account and stores it in the $__git_repo_path\n # variable.\n@@ -296,81 +435,6 @@ _get_comp_words_by_ref ()\n }\n fi\n \n-# Appends prefiltered words to COMPREPLY without any additional processing.\n-# Callers must take care of providing only words that match the current word\n-# to be completed and adding any prefix and/or suffix (trailing space!), if\n-# necessary.\n-# 1: List of newline-separated matching completion words, complete with\n-#    prefix and suffix.\n-__gitcomp_direct ()\n-{\n-\tlocal IFS=$'\\n'\n-\n-\tCOMPREPLY+=($1)\n-}\n-\n-__gitcompadd ()\n-{\n-\tlocal x i=${#COMPREPLY[@]}\n-\tfor x in $1; do\n-\t\tif [[ \"$x\" == \"$3\"* ]]; then\n-\t\t\tCOMPREPLY[i++]=\"$2$x$4\"\n-\t\tfi\n-\tdone\n-}\n-\n-# Creates completion replies.\n-# It accepts 1 to 4 arguments:\n-# 1: List of possible completion words.\n-# 2: A prefix to be added to each possible completion word (optional).\n-# 3: Generate possible completion matches for this word (optional).\n-# 4: A suffix to be appended to each possible completion word (optional).\n-__gitcomp ()\n-{\n-\tlocal IFS=$' \\t\\n'\n-\t__gitcompadd \"$1\" \"${2-}\" \"${3-$cur}\" \"${4- }\"\n-}\n-\n-# Creates completion replies, reorganizing options and adding suffixes as needed.\n-# It accepts 1 to 4 arguments:\n-# 1: List of possible completion words.\n-# 2: A prefix to be added to each possible completion word (optional).\n-# 3: Generate possible completion matches for this word (optional).\n-# 4: A suffix to be appended to each possible completion word (optional).\n-__gitcomp_opts ()\n-{\n-\tlocal cur_=\"${3-$cur}\"\n-\n-\tif [[ \"$cur_\" == *= ]]; then\n-\t\treturn\n-\tfi\n-\n-\tlocal c i=0 IFS=$' \\t\\n' sfx\n-\tfor c in $1; do\n-\t\tif [[ $c == \"--\" ]]; then\n-\t\t\tif [[ \"$cur_\" == --no-* ]]; then\n-\t\t\t\tcontinue\n-\t\t\tfi\n-\n-\t\t\tif [[ --no == \"$cur_\"* ]]; then\n-\t\t\t\tCOMPREPLY[i++]=\"--no-... \"\n-\t\t\tfi\n-\t\t\tbreak\n-\t\tfi\n-\t\tif [[ $c == \"$cur_\"* ]]; then\n-\t\t\tif [[ -z \"${4+set}\" ]]; then\n-\t\t\t\tcase $c in\n-\t\t\t\t*=|*.) sfx=\"\" ;;\n-\t\t\t\t*) sfx=\" \" ;;\n-\t\t\t\tesac\n-\t\t\telse\n-\t\t\t\tsfx=\"$4\"\n-\t\t\tfi\n-\t\t\tCOMPREPLY[i++]=\"${2-}$c$sfx\"\n-\t\tfi\n-\tdone\n-}\n-\n # Clear the variables caching builtins' options when (re-)sourcing\n # the completion script.\n if [[ -n ${ZSH_VERSION-} ]]; then\n@@ -419,62 +483,6 @@ __gitcomp_builtin ()\n \t__gitcomp_opts \"$options\"\n }\n \n-# Generates completion reply from newline-separated possible completion words\n-# by appending a space to all of them. The result is appended to COMPREPLY.\n-# It accepts 1 to 4 arguments:\n-# 1: List of possible completion words, separated by a single newline.\n-# 2: A prefix to be added to each possible completion word (optional).\n-# 3: Generate possible completion matches for this word (optional).\n-# 4: A suffix to be appended to each possible completion word instead of\n-#    the default space (optional).  If specified but empty, nothing is\n-#    appended.\n-__gitcomp_nl ()\n-{\n-\tlocal IFS=$'\\n'\n-\t__gitcompadd \"$1\" \"${2-}\" \"${3-$cur}\" \"${4- }\"\n-}\n-\n-# Fills the COMPREPLY array with prefiltered paths without any additional\n-# processing.\n-# Callers must take care of providing only paths that match the current path\n-# to be completed and adding any prefix path components, if necessary.\n-# 1: List of newline-separated matching paths, complete with all prefix\n-#    path components.\n-__gitcomp_file_direct ()\n-{\n-\tlocal IFS=$'\\n'\n-\n-\tCOMPREPLY+=($1)\n-\n-\t# use a hack to enable file mode in bash < 4\n-\tcompopt -o filenames +o nospace 2>/dev/null ||\n-\tcompgen -f /non-existing-dir/ >/dev/null ||\n-\ttrue\n-}\n-\n-# Generates completion reply with compgen from newline-separated possible\n-# completion filenames.\n-# It accepts 1 to 3 arguments:\n-# 1: List of possible completion filenames, separated by a single newline.\n-# 2: A directory prefix to be added to each possible completion filename\n-#    (optional).\n-# 3: Generate possible completion matches for this word (optional).\n-__gitcomp_file ()\n-{\n-\tlocal IFS=$'\\n'\n-\n-\t# XXX does not work when the directory prefix contains a tilde,\n-\t# since tilde expansion is not applied.\n-\t# This means that COMPREPLY will be empty and Bash default\n-\t# completion will be used.\n-\t__gitcompadd \"$1\" \"${2-}\" \"${3-$cur}\" \"\"\n-\n-\t# use a hack to enable file mode in bash < 4\n-\tcompopt -o filenames +o nospace 2>/dev/null ||\n-\tcompgen -f /non-existing-dir/ >/dev/null ||\n-\ttrue\n-}\n-\n # Execute 'git ls-files', unless the --committable option is specified, in\n # which case it runs 'git diff-index' to find out the files that can be\n # committed.  It return paths relative to the directory specified in the first\n-- \n2.32.0\n\n"},{"id":"427880","messageId":"20210618182518.697912-36-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 35/45] completion: zsh: simplify __gitcomp_direct","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:25:08Z","receivedAt":"2021-06-18T18:26:47Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"Not much different from __gitcomp_nl.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.zsh | 4 +---\n 1 file changed, 1 insertion(+), 3 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex e515f464ab..bfb5c38a3c 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -90,9 +90,7 @@ __gitcomp_opts ()\n \n __gitcomp_direct ()\n {\n-\temulate -L zsh\n-\n-\tcompadd -Q -S '' -- ${(f)1} && _ret=0\n+\t__gitcomp_nl \"$1\" \"\" \"\" \"\"\n }\n \n __gitcomp_nl ()\n-- \n2.32.0\n\n"},{"id":"427881","messageId":"20210618182518.697912-37-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 36/45] completion: zsh: shuffle __gitcomp* functions","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:25:09Z","receivedAt":"2021-06-18T18:26:49Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.zsh | 10 +++++-----\n 1 file changed, 5 insertions(+), 5 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex bfb5c38a3c..c4510a3180 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -88,11 +88,6 @@ __gitcomp_opts ()\n \tcompadd -Q -S '' -p \"${2-}\" -a -- array && _ret=0\n }\n \n-__gitcomp_direct ()\n-{\n-\t__gitcomp_nl \"$1\" \"\" \"\" \"\"\n-}\n-\n __gitcomp_nl ()\n {\n \temulate -L zsh\n@@ -107,6 +102,11 @@ __gitcomp_file ()\n \tcompadd -f -p \"${2-}\" -- ${(f)1} && _ret=0\n }\n \n+__gitcomp_direct ()\n+{\n+\t__gitcomp_nl \"$1\" \"\" \"\" \"\"\n+}\n+\n __gitcomp_file_direct ()\n {\n \t__gitcomp_file \"$1\" \"\"\n-- \n2.32.0\n\n"},{"id":"427882","messageId":"20210618182518.697912-38-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 37/45] completion: zsh: fix direct quoting","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:25:10Z","receivedAt":"2021-06-18T18:26:56Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"Apparently using \"compadd -Q\" is almost always wrong, we want zsh to add\nquoting when necessary. However, if we remove the -Q option, that would\nmake zsh add an extra \"\\ \" at the end of some completions.\n\nWe can manually remove the spaces from the completions that have them,\nand then add the suffix with the -S option, thus there's no more need\nfor the -Q option.\n\nThis makes completions like \"stash@{0}\" complete correctly:\n\n  git stash show <tab>\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.zsh | 9 ++++++---\n 1 file changed, 6 insertions(+), 3 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex c4510a3180..3818291950 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -55,7 +55,7 @@ __gitcomp ()\n \temulate -L zsh\n \n \tlocal IFS=$' \\t\\n'\n-\tcompadd -Q -S \"${4- }\" -p \"${2-}\" -- ${=1} && _ret=0\n+\tcompadd -S \"${4- }\" -p \"${2-}\" -- ${=1} && _ret=0\n }\n \n __gitcomp_opts ()\n@@ -85,14 +85,17 @@ __gitcomp_opts ()\n \t\tfi\n \t\tarray+=(\"$c$sfx\")\n \tdone\n-\tcompadd -Q -S '' -p \"${2-}\" -a -- array && _ret=0\n+\tcompadd -S '' -p \"${2-}\" -a -- array && _ret=0\n }\n \n __gitcomp_nl ()\n {\n \temulate -L zsh\n \n-\tcompadd -Q -S \"${4- }\" -p \"${2-}\" -- ${(f)1} && _ret=0\n+\t# words that don't end up in space\n+\tcompadd -p \"${2-}\" -S \"${4- }\" -q -- ${${(f)1}:#*\\ } && _ret=0\n+\t# words that end in space\n+\tcompadd -p \"${2-}\" -S \" ${4- }\" -q -- ${${(M)${(f)1}:#*\\ }% } && _ret=0\n }\n \n __gitcomp_file ()\n-- \n2.32.0\n\n"},{"id":"427883","messageId":"20210618182518.697912-39-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 38/45] completion: zsh: add elements individually in __gitcomp_opts","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:25:11Z","receivedAt":"2021-06-18T18:26:57Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"It's useful to specify specific suffixes for specific words.\n\nThis will be useful later on.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.zsh | 6 ++----\n 1 file changed, 2 insertions(+), 4 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex 3818291950..a4b5e7dcc4 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -67,11 +67,10 @@ __gitcomp_opts ()\n \t[[ \"$cur_\" == *= ]] && return\n \n \tlocal c IFS=$' \\t\\n' sfx\n-\tlocal -a array\n \tfor c in ${=1}; do\n \t\tif [[ $c == \"--\" ]]; then\n \t\t\t[[ \"$cur_\" == --no-* ]] && continue\n-\t\t\tarray+=(\"--no-... \")\n+\t\t\tcompadd -S \" \" -- \"--no-...\" && _ret=0\n \t\t\tbreak\n \t\tfi\n \n@@ -83,9 +82,8 @@ __gitcomp_opts ()\n \t\telse\n \t\t\tsfx=\"$4\"\n \t\tfi\n-\t\tarray+=(\"$c$sfx\")\n+\t\tcompadd -S \"$sfx\" -p \"${2-}\" -- \"$c\" && _ret=0\n \tdone\n-\tcompadd -S '' -p \"${2-}\" -a -- array && _ret=0\n }\n \n __gitcomp_nl ()\n-- \n2.32.0\n\n"},{"id":"427884","messageId":"20210618182518.697912-40-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 39/45] completion: zsh: add __gitcompadd helper","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:25:12Z","receivedAt":"2021-06-18T18:26:58Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"So we don't have to do the same over and over.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.zsh | 12 ++++++++----\n 1 file changed, 8 insertions(+), 4 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex a4b5e7dcc4..0f2f0e5eb0 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -50,12 +50,16 @@ COMP_WORDBREAKS=':'\n GIT_SOURCING_ZSH_COMPLETION=y . \"$script\"\n functions[complete]=\"$old_complete\"\n \n+__gitcompadd ()\n+{\n+\tcompadd -p \"${2-}\" -S \"${3- }\" -- ${=1} && _ret=0\n+}\n+\n __gitcomp ()\n {\n \temulate -L zsh\n \n-\tlocal IFS=$' \\t\\n'\n-\tcompadd -S \"${4- }\" -p \"${2-}\" -- ${=1} && _ret=0\n+\tIFS=$' \\t\\n' __gitcompadd \"$1\" \"${2-}\" \"${4- }\"\n }\n \n __gitcomp_opts ()\n@@ -70,7 +74,7 @@ __gitcomp_opts ()\n \tfor c in ${=1}; do\n \t\tif [[ $c == \"--\" ]]; then\n \t\t\t[[ \"$cur_\" == --no-* ]] && continue\n-\t\t\tcompadd -S \" \" -- \"--no-...\" && _ret=0\n+\t\t\t__gitcompadd \"--no-...\"\n \t\t\tbreak\n \t\tfi\n \n@@ -82,7 +86,7 @@ __gitcomp_opts ()\n \t\telse\n \t\t\tsfx=\"$4\"\n \t\tfi\n-\t\tcompadd -S \"$sfx\" -p \"${2-}\" -- \"$c\" && _ret=0\n+\t\t__gitcompadd \"$c\" \"${2-}\" \"$sfx\"\n \tdone\n }\n \n-- \n2.32.0\n\n"},{"id":"427885","messageId":"20210618182518.697912-41-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 40/45] completion: zsh: add correct removable suffix","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:25:13Z","receivedAt":"2021-06-18T18:27:13Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"Zsh has a nice feature that allows a suffix to be automatically removed\nif followed by a space.\n\nFor example:\n\n  git log --prety=\n\nIf a space is typed, the suffix '=' is removed.\n\nBut we have to set the correct prefix first.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.zsh | 5 +++--\n 1 file changed, 3 insertions(+), 2 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh\nindex 0f2f0e5eb0..d425ff1d81 100644\n--- a/contrib/completion/git-completion.zsh\n+++ b/contrib/completion/git-completion.zsh\n@@ -52,7 +52,7 @@ functions[complete]=\"$old_complete\"\n \n __gitcompadd ()\n {\n-\tcompadd -p \"${2-}\" -S \"${3- }\" -- ${=1} && _ret=0\n+\tcompadd -p \"${2-}\" -S \"${3- }\" -q -- ${=1} && _ret=0\n }\n \n __gitcomp ()\n@@ -80,7 +80,8 @@ __gitcomp_opts ()\n \n \t\tif [[ -z \"${4+set}\" ]]; then\n \t\t\tcase $c in\n-\t\t\t*=|*.) sfx=\"\" ;;\n+\t\t\t*=) c=\"${c%=}\"; sfx=\"=\" ;;\n+\t\t\t*.) sfx=\"\" ;;\n \t\t\t*) sfx=\" \" ;;\n \t\t\tesac\n \t\telse\n-- \n2.32.0\n\n"},{"id":"427886","messageId":"20210618182518.697912-43-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 42/45] completion: bash: refactor _get_comp_words_by_ref()","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:25:15Z","receivedAt":"2021-06-18T18:27:14Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"We don't need a separate function to do what we already know we want to\ndo.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash | 93 +++++++++++---------------\n 1 file changed, 39 insertions(+), 54 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex 2c0b869aba..9976009951 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -334,21 +334,11 @@ __git_dequote ()\n #\n #   RELEASE: 2.x\n \n-# This function can be used to access a tokenized list of words\n-# on the command line:\n-#\n-#\t__git_reassemble_comp_words_by_ref '=:'\n-#\tif test \"${words_[cword_-1]}\" = -w\n-#\tthen\n-#\t\t...\n-#\tfi\n-#\n-# The argument should be a collection of characters from the list of\n-# word completion separators (COMP_WORDBREAKS) to treat as ordinary\n-# characters.\n+# This function reorganizes the words on the command line to be processed by\n+# the rest of the script.\n #\n # This is roughly equivalent to going back in time and setting\n-# COMP_WORDBREAKS to exclude those characters.  The intent is to\n+# COMP_WORDBREAKS to exclude '=' and ':'.  The intent is to\n # make option types like --date=<type> and <rev>:<path> easy to\n # recognize by treating each shell word as a single token.\n #\n@@ -356,60 +346,55 @@ __git_dequote ()\n # shared with other completion scripts.  By the time the completion\n # function gets called, COMP_WORDS has already been populated so local\n # changes to COMP_WORDBREAKS have no effect.\n-#\n-# Output: words_, cword_, cur_.\n \n-__git_reassemble_comp_words_by_ref()\n+if ! type _get_comp_words_by_ref >/dev/null 2>&1; then\n+_get_comp_words_by_ref ()\n {\n+\tlocal words_ cword_\n \tlocal exclude i j first\n+\n \t# Which word separators to exclude?\n-\texclude=\"${1//[^$COMP_WORDBREAKS]}\"\n+\texclude=\"${COMP_WORDBREAKS//[^=:]}\"\n \tcword_=$COMP_CWORD\n \tif [ -z \"$exclude\" ]; then\n \t\twords_=(\"${COMP_WORDS[@]}\")\n-\t\treturn\n-\tfi\n-\t# List of word completion separators has shrunk;\n-\t# re-assemble words to complete.\n-\tfor ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do\n-\t\t# Append each nonempty word consisting of just\n-\t\t# word separator characters to the current word.\n-\t\tfirst=t\n-\t\twhile\n-\t\t\t[ $i -gt 0 ] &&\n-\t\t\t[ -n \"${COMP_WORDS[$i]}\" ] &&\n-\t\t\t# word consists of excluded word separators\n-\t\t\t[ \"${COMP_WORDS[$i]//[^$exclude]}\" = \"${COMP_WORDS[$i]}\" ]\n-\t\tdo\n-\t\t\t# Attach to the previous token,\n-\t\t\t# unless the previous token is the command name.\n-\t\t\tif [ $j -ge 2 ] && [ -n \"$first\" ]; then\n-\t\t\t\t((j--))\n-\t\t\tfi\n-\t\t\tfirst=\n+\telse\n+\t\t# List of word completion separators has shrunk;\n+\t\t# re-assemble words to complete.\n+\t\tfor ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do\n+\t\t\t# Append each nonempty word consisting of just\n+\t\t\t# word separator characters to the current word.\n+\t\t\tfirst=t\n+\t\t\twhile\n+\t\t\t\t[ $i -gt 0 ] &&\n+\t\t\t\t[ -n \"${COMP_WORDS[$i]}\" ] &&\n+\t\t\t\t# word consists of excluded word separators\n+\t\t\t\t[ \"${COMP_WORDS[$i]//[^$exclude]}\" = \"${COMP_WORDS[$i]}\" ]\n+\t\t\tdo\n+\t\t\t\t# Attach to the previous token,\n+\t\t\t\t# unless the previous token is the command name.\n+\t\t\t\tif [ $j -ge 2 ] && [ -n \"$first\" ]; then\n+\t\t\t\t\t((j--))\n+\t\t\t\tfi\n+\t\t\t\tfirst=\n+\t\t\t\twords_[$j]=${words_[j]}${COMP_WORDS[i]}\n+\t\t\t\tif [ $i = $COMP_CWORD ]; then\n+\t\t\t\t\tcword_=$j\n+\t\t\t\tfi\n+\t\t\t\tif (($i < ${#COMP_WORDS[@]} - 1)); then\n+\t\t\t\t\t((i++))\n+\t\t\t\telse\n+\t\t\t\t\t# Done.\n+\t\t\t\t\tbreak 2\n+\t\t\t\tfi\n+\t\t\tdone\n \t\t\twords_[$j]=${words_[j]}${COMP_WORDS[i]}\n \t\t\tif [ $i = $COMP_CWORD ]; then\n \t\t\t\tcword_=$j\n \t\t\tfi\n-\t\t\tif (($i < ${#COMP_WORDS[@]} - 1)); then\n-\t\t\t\t((i++))\n-\t\t\telse\n-\t\t\t\t# Done.\n-\t\t\t\treturn\n-\t\t\tfi\n \t\tdone\n-\t\twords_[$j]=${words_[j]}${COMP_WORDS[i]}\n-\t\tif [ $i = $COMP_CWORD ]; then\n-\t\t\tcword_=$j\n-\t\tfi\n-\tdone\n-}\n+\tfi\n \n-if ! type _get_comp_words_by_ref >/dev/null 2>&1; then\n-_get_comp_words_by_ref ()\n-{\n-\tlocal words_ cword_\n-\t__git_reassemble_comp_words_by_ref \"=:\"\n \tcword=$cword_\n \tcur=${words_[cword]}\n \tprev=${words_[cword-1]}\n-- \n2.32.0\n\n"},{"id":"427887","messageId":"20210618182518.697912-42-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 41/45] completion: bash: simplify _get_comp_words_by_ref()","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:25:14Z","receivedAt":"2021-06-18T18:27:15Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"We don't need the whole functionality of _get_comp_words_by_ref(), we\nknow exactly what we need from that function, so only do that.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash | 30 ++++++--------------------\n t/t9902-completion.sh                  | 21 ++++--------------\n 2 files changed, 10 insertions(+), 41 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex 47c96b918e..2c0b869aba 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -408,30 +408,12 @@ __git_reassemble_comp_words_by_ref()\n if ! type _get_comp_words_by_ref >/dev/null 2>&1; then\n _get_comp_words_by_ref ()\n {\n-\tlocal exclude cur_ words_ cword_\n-\tif [ \"$1\" = \"-n\" ]; then\n-\t\texclude=$2\n-\t\tshift 2\n-\tfi\n-\t__git_reassemble_comp_words_by_ref \"$exclude\"\n-\tcur_=${words_[cword_]}\n-\twhile [ $# -gt 0 ]; do\n-\t\tcase \"$1\" in\n-\t\tcur)\n-\t\t\tcur=$cur_\n-\t\t\t;;\n-\t\tprev)\n-\t\t\tprev=${words_[$cword_-1]}\n-\t\t\t;;\n-\t\twords)\n-\t\t\twords=(\"${words_[@]}\")\n-\t\t\t;;\n-\t\tcword)\n-\t\t\tcword=$cword_\n-\t\t\t;;\n-\t\tesac\n-\t\tshift\n-\tdone\n+\tlocal words_ cword_\n+\t__git_reassemble_comp_words_by_ref \"=:\"\n+\tcword=$cword_\n+\tcur=${words_[cword]}\n+\tprev=${words_[cword-1]}\n+\twords=(\"${words_[@]}\")\n }\n fi\n \ndiff --git a/t/t9902-completion.sh b/t/t9902-completion.sh\nindex 3dbb5eb121..8745f6afe9 100755\n--- a/t/t9902-completion.sh\n+++ b/t/t9902-completion.sh\n@@ -43,23 +43,10 @@ GIT_TESTING_PORCELAIN_COMMAND_LIST='add checkout rebase'\n # So let's override it with a minimal version for testing purposes.\n _get_comp_words_by_ref ()\n {\n-\twhile [ $# -gt 0 ]; do\n-\t\tcase \"$1\" in\n-\t\tcur)\n-\t\t\tcur=${_words[_cword]}\n-\t\t\t;;\n-\t\tprev)\n-\t\t\tprev=${_words[_cword-1]}\n-\t\t\t;;\n-\t\twords)\n-\t\t\twords=(\"${_words[@]}\")\n-\t\t\t;;\n-\t\tcword)\n-\t\t\tcword=$_cword\n-\t\t\t;;\n-\t\tesac\n-\t\tshift\n-\tdone\n+\tcword=$_cword\n+\tcur=${_words[cword]}\n+\tprev=${_words[cword-1]}\n+\twords=(\"${_words[@]}\")\n }\n \n print_comp ()\n-- \n2.32.0\n\n"},{"id":"427888","messageId":"20210618182518.697912-44-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 43/45] completion: bash: cleanup _get_comp_words_by_ref()","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:25:16Z","receivedAt":"2021-06-18T18:27:16Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"Remove temporary variables.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash | 19 ++++++++-----------\n 1 file changed, 8 insertions(+), 11 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex 9976009951..0433713242 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -350,14 +350,13 @@ __git_dequote ()\n if ! type _get_comp_words_by_ref >/dev/null 2>&1; then\n _get_comp_words_by_ref ()\n {\n-\tlocal words_ cword_\n \tlocal exclude i j first\n \n \t# Which word separators to exclude?\n \texclude=\"${COMP_WORDBREAKS//[^=:]}\"\n-\tcword_=$COMP_CWORD\n+\tcword=$COMP_CWORD\n \tif [ -z \"$exclude\" ]; then\n-\t\twords_=(\"${COMP_WORDS[@]}\")\n+\t\twords=(\"${COMP_WORDS[@]}\")\n \telse\n \t\t# List of word completion separators has shrunk;\n \t\t# re-assemble words to complete.\n@@ -377,9 +376,9 @@ _get_comp_words_by_ref ()\n \t\t\t\t\t((j--))\n \t\t\t\tfi\n \t\t\t\tfirst=\n-\t\t\t\twords_[$j]=${words_[j]}${COMP_WORDS[i]}\n+\t\t\t\twords[$j]=${words[j]}${COMP_WORDS[i]}\n \t\t\t\tif [ $i = $COMP_CWORD ]; then\n-\t\t\t\t\tcword_=$j\n+\t\t\t\t\tcword=$j\n \t\t\t\tfi\n \t\t\t\tif (($i < ${#COMP_WORDS[@]} - 1)); then\n \t\t\t\t\t((i++))\n@@ -388,17 +387,15 @@ _get_comp_words_by_ref ()\n \t\t\t\t\tbreak 2\n \t\t\t\tfi\n \t\t\tdone\n-\t\t\twords_[$j]=${words_[j]}${COMP_WORDS[i]}\n+\t\t\twords[$j]=${words[j]}${COMP_WORDS[i]}\n \t\t\tif [ $i = $COMP_CWORD ]; then\n-\t\t\t\tcword_=$j\n+\t\t\t\tcword=$j\n \t\t\tfi\n \t\tdone\n \tfi\n \n-\tcword=$cword_\n-\tcur=${words_[cword]}\n-\tprev=${words_[cword-1]}\n-\twords=(\"${words_[@]}\")\n+\tcur=${words[cword]}\n+\tprev=${words[cword-1]}\n }\n fi\n \n-- \n2.32.0\n\n"},{"id":"427889","messageId":"20210618182518.697912-45-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 44/45] completion: bash: trivial cleanup","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:25:17Z","receivedAt":"2021-06-18T18:27:16Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"The most typical case first (COMP_WORDBREAKS contains our wanted words).\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash | 6 +++---\n 1 file changed, 3 insertions(+), 3 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex 0433713242..cef064795d 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -355,9 +355,7 @@ _get_comp_words_by_ref ()\n \t# Which word separators to exclude?\n \texclude=\"${COMP_WORDBREAKS//[^=:]}\"\n \tcword=$COMP_CWORD\n-\tif [ -z \"$exclude\" ]; then\n-\t\twords=(\"${COMP_WORDS[@]}\")\n-\telse\n+\tif [ -n \"$exclude\" ]; then\n \t\t# List of word completion separators has shrunk;\n \t\t# re-assemble words to complete.\n \t\tfor ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do\n@@ -392,6 +390,8 @@ _get_comp_words_by_ref ()\n \t\t\t\tcword=$j\n \t\t\tfi\n \t\tdone\n+\telse\n+\t\twords=(\"${COMP_WORDS[@]}\")\n \tfi\n \n \tcur=${words[cword]}\n-- \n2.32.0\n\n"},{"id":"427890","messageId":"20210618182518.697912-46-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-1-felipe.contreras@gmail.com","subject":"[PATCH v2 45/45] completion: bash: rename _get_comp_words_by_ref()","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:25:18Z","receivedAt":"2021-06-18T18:27:19Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"It's only used in one place, rename it, and use it even if\nbash-completion's more inefficient version of _get_comp_words_by_ref()\nis available.\n\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n contrib/completion/git-completion.bash | 184 ++++++++++++-------------\n t/t9902-completion.sh                  |   2 +-\n 2 files changed, 92 insertions(+), 94 deletions(-)\n\ndiff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash\nindex cef064795d..aaff13dbb1 100644\n--- a/contrib/completion/git-completion.bash\n+++ b/contrib/completion/git-completion.bash\n@@ -307,98 +307,6 @@ __git_dequote ()\n \tdone\n }\n \n-# The following function is based on code from:\n-#\n-#   bash_completion - programmable completion functions for bash 3.2+\n-#\n-#   Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>\n-#             © 2009-2010, Bash Completion Maintainers\n-#                     <bash-completion-devel@lists.alioth.debian.org>\n-#\n-#   This program is free software; you can redistribute it and/or modify\n-#   it under the terms of the GNU General Public License as published by\n-#   the Free Software Foundation; either version 2, or (at your option)\n-#   any later version.\n-#\n-#   This program is distributed in the hope that it will be useful,\n-#   but WITHOUT ANY WARRANTY; without even the implied warranty of\n-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n-#   GNU General Public License for more details.\n-#\n-#   You should have received a copy of the GNU General Public License\n-#   along with this program; if not, see <http://www.gnu.org/licenses/>.\n-#\n-#   The latest version of this software can be obtained here:\n-#\n-#   http://bash-completion.alioth.debian.org/\n-#\n-#   RELEASE: 2.x\n-\n-# This function reorganizes the words on the command line to be processed by\n-# the rest of the script.\n-#\n-# This is roughly equivalent to going back in time and setting\n-# COMP_WORDBREAKS to exclude '=' and ':'.  The intent is to\n-# make option types like --date=<type> and <rev>:<path> easy to\n-# recognize by treating each shell word as a single token.\n-#\n-# It is best not to set COMP_WORDBREAKS directly because the value is\n-# shared with other completion scripts.  By the time the completion\n-# function gets called, COMP_WORDS has already been populated so local\n-# changes to COMP_WORDBREAKS have no effect.\n-\n-if ! type _get_comp_words_by_ref >/dev/null 2>&1; then\n-_get_comp_words_by_ref ()\n-{\n-\tlocal exclude i j first\n-\n-\t# Which word separators to exclude?\n-\texclude=\"${COMP_WORDBREAKS//[^=:]}\"\n-\tcword=$COMP_CWORD\n-\tif [ -n \"$exclude\" ]; then\n-\t\t# List of word completion separators has shrunk;\n-\t\t# re-assemble words to complete.\n-\t\tfor ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do\n-\t\t\t# Append each nonempty word consisting of just\n-\t\t\t# word separator characters to the current word.\n-\t\t\tfirst=t\n-\t\t\twhile\n-\t\t\t\t[ $i -gt 0 ] &&\n-\t\t\t\t[ -n \"${COMP_WORDS[$i]}\" ] &&\n-\t\t\t\t# word consists of excluded word separators\n-\t\t\t\t[ \"${COMP_WORDS[$i]//[^$exclude]}\" = \"${COMP_WORDS[$i]}\" ]\n-\t\t\tdo\n-\t\t\t\t# Attach to the previous token,\n-\t\t\t\t# unless the previous token is the command name.\n-\t\t\t\tif [ $j -ge 2 ] && [ -n \"$first\" ]; then\n-\t\t\t\t\t((j--))\n-\t\t\t\tfi\n-\t\t\t\tfirst=\n-\t\t\t\twords[$j]=${words[j]}${COMP_WORDS[i]}\n-\t\t\t\tif [ $i = $COMP_CWORD ]; then\n-\t\t\t\t\tcword=$j\n-\t\t\t\tfi\n-\t\t\t\tif (($i < ${#COMP_WORDS[@]} - 1)); then\n-\t\t\t\t\t((i++))\n-\t\t\t\telse\n-\t\t\t\t\t# Done.\n-\t\t\t\t\tbreak 2\n-\t\t\t\tfi\n-\t\t\tdone\n-\t\t\twords[$j]=${words[j]}${COMP_WORDS[i]}\n-\t\t\tif [ $i = $COMP_CWORD ]; then\n-\t\t\t\tcword=$j\n-\t\t\tfi\n-\t\tdone\n-\telse\n-\t\twords=(\"${COMP_WORDS[@]}\")\n-\tfi\n-\n-\tcur=${words[cword]}\n-\tprev=${words[cword-1]}\n-}\n-fi\n-\n # Clear the variables caching builtins' options when (re-)sourcing\n # the completion script.\n if [[ -n ${ZSH_VERSION-} ]]; then\n@@ -3443,10 +3351,100 @@ if [[ -n ${ZSH_VERSION-} && -z ${GIT_SOURCING_ZSH_COMPLETION-} ]]; then\n \treturn\n fi\n \n+# The following function is based on code from:\n+#\n+#   bash_completion - programmable completion functions for bash 3.2+\n+#\n+#   Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>\n+#             © 2009-2010, Bash Completion Maintainers\n+#                     <bash-completion-devel@lists.alioth.debian.org>\n+#\n+#   This program is free software; you can redistribute it and/or modify\n+#   it under the terms of the GNU General Public License as published by\n+#   the Free Software Foundation; either version 2, or (at your option)\n+#   any later version.\n+#\n+#   This program is distributed in the hope that it will be useful,\n+#   but WITHOUT ANY WARRANTY; without even the implied warranty of\n+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+#   GNU General Public License for more details.\n+#\n+#   You should have received a copy of the GNU General Public License\n+#   along with this program; if not, see <http://www.gnu.org/licenses/>.\n+#\n+#   The latest version of this software can be obtained here:\n+#\n+#   http://bash-completion.alioth.debian.org/\n+#\n+#   RELEASE: 2.x\n+\n+# This function reorganizes the words on the command line to be processed by\n+# the rest of the script.\n+#\n+# This is roughly equivalent to going back in time and setting\n+# COMP_WORDBREAKS to exclude '=' and ':'.  The intent is to\n+# make option types like --date=<type> and <rev>:<path> easy to\n+# recognize by treating each shell word as a single token.\n+#\n+# It is best not to set COMP_WORDBREAKS directly because the value is\n+# shared with other completion scripts.  By the time the completion\n+# function gets called, COMP_WORDS has already been populated so local\n+# changes to COMP_WORDBREAKS have no effect.\n+\n+__git_get_comp_words_by_ref ()\n+{\n+\tlocal exclude i j first\n+\n+\t# Which word separators to exclude?\n+\texclude=\"${COMP_WORDBREAKS//[^=:]}\"\n+\tcword=$COMP_CWORD\n+\tif [ -n \"$exclude\" ]; then\n+\t\t# List of word completion separators has shrunk;\n+\t\t# re-assemble words to complete.\n+\t\tfor ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do\n+\t\t\t# Append each nonempty word consisting of just\n+\t\t\t# word separator characters to the current word.\n+\t\t\tfirst=t\n+\t\t\twhile\n+\t\t\t\t[ $i -gt 0 ] &&\n+\t\t\t\t[ -n \"${COMP_WORDS[$i]}\" ] &&\n+\t\t\t\t# word consists of excluded word separators\n+\t\t\t\t[ \"${COMP_WORDS[$i]//[^$exclude]}\" = \"${COMP_WORDS[$i]}\" ]\n+\t\t\tdo\n+\t\t\t\t# Attach to the previous token,\n+\t\t\t\t# unless the previous token is the command name.\n+\t\t\t\tif [ $j -ge 2 ] && [ -n \"$first\" ]; then\n+\t\t\t\t\t((j--))\n+\t\t\t\tfi\n+\t\t\t\tfirst=\n+\t\t\t\twords[$j]=${words[j]}${COMP_WORDS[i]}\n+\t\t\t\tif [ $i = $COMP_CWORD ]; then\n+\t\t\t\t\tcword=$j\n+\t\t\t\tfi\n+\t\t\t\tif (($i < ${#COMP_WORDS[@]} - 1)); then\n+\t\t\t\t\t((i++))\n+\t\t\t\telse\n+\t\t\t\t\t# Done.\n+\t\t\t\t\tbreak 2\n+\t\t\t\tfi\n+\t\t\tdone\n+\t\t\twords[$j]=${words[j]}${COMP_WORDS[i]}\n+\t\t\tif [ $i = $COMP_CWORD ]; then\n+\t\t\t\tcword=$j\n+\t\t\tfi\n+\t\tdone\n+\telse\n+\t\twords=(\"${COMP_WORDS[@]}\")\n+\tfi\n+\n+\tcur=${words[cword]}\n+\tprev=${words[cword-1]}\n+}\n+\n __git_func_wrap ()\n {\n \tlocal cur words cword prev __git_cmd_idx=1\n-\t_get_comp_words_by_ref -n =: cur words cword prev\n+\t__git_get_comp_words_by_ref\n \t$1\n }\n \ndiff --git a/t/t9902-completion.sh b/t/t9902-completion.sh\nindex 8745f6afe9..90f1236a00 100755\n--- a/t/t9902-completion.sh\n+++ b/t/t9902-completion.sh\n@@ -41,7 +41,7 @@ GIT_TESTING_PORCELAIN_COMMAND_LIST='add checkout rebase'\n # We don't need this function to actually join words or do anything special.\n # Also, it's cleaner to avoid touching bash's internal completion variables.\n # So let's override it with a minimal version for testing purposes.\n-_get_comp_words_by_ref ()\n+__git_get_comp_words_by_ref ()\n {\n \tcword=$_cword\n \tcur=${_words[cword]}\n-- \n2.32.0\n\n"},{"id":"427893","messageId":"20210618185832.700477-1-felipe.contreras@gmail.com","threadId":"55961","inReplyTo":"20210618182518.697912-2-felipe.contreras@gmail.com","subject":"[PATCH] completion: fix __git_cmd_idx regression","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T18:58:32Z","receivedAt":"2021-06-18T18:58:41Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"The commit 59d85a2a05 (git-completion.bash: use $__git_cmd_idx in more\nplaces, 2021-04-22) caused a regression when using __git_complete and a\ncommand relies on __git_cmd_idx.\n\nWe need the function wrapper to define __git_cmd_idx.\n\nReported-by: Harrison McCullough <mccullough.harrison@gmail.com>\nHelped-by: Fabian Wermelinger <fabianw@mavt.ethz.ch>\nSigned-off-by: Felipe Contreras <felipe.contreras@gmail.com>\n---\n git-completion.bash | 2 +-\n git-completion.zsh  | 2 +-\n 2 files changed, 2 insertions(+), 2 deletions(-)\n\ndiff --git a/git-completion.bash b/git-completion.bash\nindex b50c5d0..c053a62 100644\n--- a/git-completion.bash\n+++ b/git-completion.bash\n@@ -3511,7 +3511,7 @@ fi\n \n __git_func_wrap ()\n {\n-\tlocal cur words cword prev\n+\tlocal cur words cword prev __git_cmd_idx=0\n \t_get_comp_words_by_ref -n =: cur words cword prev\n \t$1\n }\ndiff --git a/git-completion.zsh b/git-completion.zsh\nindex cac6f61..a1f2d27 100644\n--- a/git-completion.zsh\n+++ b/git-completion.zsh\n@@ -271,7 +271,7 @@ __git_zsh_main ()\n _git ()\n {\n \tlocal _ret=1\n-\tlocal cur cword prev\n+\tlocal cur cword prev __git_cmd_idx=0\n \n \tcur=${words[CURRENT]}\n \tprev=${words[CURRENT-1]}\n-- \n2.32.0\n\n"},{"id":"427894","messageId":"60ccee2a48c07_ab0ea20894@natae.notmuch","threadId":"55961","inReplyTo":"20210618182518.697912-2-felipe.contreras@gmail.com","subject":"RE: [PATCH v2 01/45] completion: fix __git_cmd_idx regression","fromName":"Felipe Contreras","fromEmail":"felipe.contreras@gmail.com","sentAt":"2021-06-18T19:04:10Z","receivedAt":"2021-06-18T19:04:20Z","isPatch":true,"sender":{"key":"felipe.contreras@gmail.com","avatar":"https://avatars.githubusercontent.com/u/8358?v=4"},"body":"Felipe Contreras wrote:\n> --- a/contrib/completion/git-completion.bash\n> +++ b/contrib/completion/git-completion.bash\n> @@ -3511,7 +3511,7 @@ fi\n>  \n>  __git_func_wrap ()\n>  {\n> -\tlocal cur words cword prev\n> +\tlocal cur words cword prev __git_cmd_idx=1\n\nI just realized this isn't 100% correct thanks to Fabian Wermelinger.\nIf we use __git_complete then the index should be 0. The above fixes the\nannoying errors, but some commands don't complete correctly (e.g.\ngit_fetch).\n\nI've sent an updated fix [1].\n\n[1] https://lore.kernel.org/git/20210618185832.700477-1-felipe.contreras@gmail.com/\n\n-- \nFelipe Contreras\n"}]}