From: Denton Liu <liu.denton@gmail.com>
To: Git Mailing List <git@vger.kernel.org>
Cc: Junio C Hamano <gitster@pobox.com>
Subject: [PATCH v2 1/3] git-completion.bash: pass $__git_subcommand_idx from __git_main()
Date: Wed, 24 Mar 2021 01:36:27 -0700 [thread overview]
Message-ID: <e4aa3e8cd7f64512ce0d72906f4d15f1f0dc0a60.1616574955.git.liu.denton@gmail.com> (raw)
In-Reply-To: <cover.1616574955.git.liu.denton@gmail.com>
Many completion functions perform hardcoded comparisons with $cword.
This fails in the case where the main git command is given arguments
(e.g. `git -C . bundle<TAB>` would fail to complete its subcommands).
Even _git_worktree(), which uses __git_find_on_cmdline(), could still
fail. With something like `git -C add worktree move<TAB>`, the
subcommand would be incorrectly identified as "add" instead of "move".
Assign $__git_subcommand_idx in __git_main(), where the git subcommand
is actually found and the corresponding completion function is called.
Use this variable to replace hardcoded comparisons with $cword.
Signed-off-by: Denton Liu <liu.denton@gmail.com>
---
contrib/completion/git-completion.bash | 23 +++++++++++------------
1 file changed, 11 insertions(+), 12 deletions(-)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 7dc6cd8eb8..a2f1b5e916 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -1474,12 +1474,12 @@ _git_branch ()
_git_bundle ()
{
- local cmd="${words[2]}"
+ local cmd="${words[__git_subcommand_idx+1]}"
case "$cword" in
- 2)
+ $((__git_subcommand_idx+1)))
__gitcomp "create list-heads verify unbundle"
;;
- 3)
+ $((__git_subcommand_idx+2)))
# looking for a file
;;
*)
@@ -1894,7 +1894,7 @@ _git_grep ()
esac
case "$cword,$prev" in
- 2,*|*,-*)
+ $((__git_subcommand_idx+1)),*|*,-*)
__git_complete_symbol && return
;;
esac
@@ -3058,7 +3058,7 @@ _git_stash ()
branch,--*)
;;
branch,*)
- if [ $cword -eq 3 ]; then
+ if [ $cword -eq $((__git_subcommand_idx+2)) ]; then
__git_complete_refs
else
__gitcomp_nl "$(__git stash list \
@@ -3277,11 +3277,9 @@ __git_complete_worktree_paths ()
_git_worktree ()
{
local subcommands="add list lock move prune remove unlock"
- local subcommand subcommand_idx
+ local subcommand
- subcommand="$(__git_find_on_cmdline --show-idx "$subcommands")"
- subcommand_idx="${subcommand% *}"
- subcommand="${subcommand#* }"
+ subcommand="$(__git_find_on_cmdline "$subcommands")"
case "$subcommand,$cur" in
,*)
@@ -3306,7 +3304,7 @@ _git_worktree ()
# be either the 'add' subcommand, the unstuck
# argument of an option (e.g. branch for -b|-B), or
# the path for the new worktree.
- if [ $cword -eq $((subcommand_idx+1)) ]; then
+ if [ $cword -eq $((__git_subcommand_idx+2)) ]; then
# Right after the 'add' subcommand: have to
# complete the path, so fall back to Bash
# filename completion.
@@ -3330,7 +3328,7 @@ _git_worktree ()
__git_complete_worktree_paths
;;
move,*)
- if [ $cword -eq $((subcommand_idx+1)) ]; then
+ if [ $cword -eq $((__git_subcommand_idx+2)) ]; then
# The first parameter must be an existing working
# tree to be moved.
__git_complete_worktree_paths
@@ -3398,6 +3396,7 @@ __git_main ()
{
local i c=1 command __git_dir __git_repo_path
local __git_C_args C_args_count=0
+ local __git_subcommand_idx
while [ $c -lt $cword ]; do
i="${words[c]}"
@@ -3412,7 +3411,7 @@ __git_main ()
__git_C_args[C_args_count++]="${words[c]}"
;;
-*) ;;
- *) command="$i"; break ;;
+ *) command="$i"; __git_subcommand_idx="$c"; break ;;
esac
((c++))
done
--
2.31.0.rc2.261.g7f71774620
next prev parent reply other threads:[~2021-03-24 8:37 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-16 0:54 [PATCH 0/3] git-completion.bash: improvements to _git_stash() Denton Liu
2021-03-16 0:54 ` [PATCH 1/3] git-completion.bash: extract from else in _git_stash() Denton Liu
2021-03-16 0:54 ` [PATCH 2/3] git-completion.bash: fix `git <args>... stash branch` bug Denton Liu
2021-03-16 0:54 ` [PATCH 3/3] git-completion.bash: use __gitcomp_builtin() in _git_stash() Denton Liu
2021-03-18 9:46 ` [RESEND PATCH 0/3] git-completion.bash: improvements to _git_stash() Denton Liu
2021-03-18 9:46 ` [RESEND PATCH 1/3] git-completion.bash: extract from else in _git_stash() Denton Liu
2021-03-18 9:46 ` [RESEND PATCH 2/3] git-completion.bash: fix `git <args>... stash branch` bug Denton Liu
2021-03-18 20:30 ` Junio C Hamano
2021-03-19 8:05 ` Denton Liu
2021-03-19 15:53 ` Junio C Hamano
2021-03-18 9:46 ` [RESEND PATCH 3/3] git-completion.bash: use __gitcomp_builtin() in _git_stash() Denton Liu
2021-03-18 21:58 ` [RESEND PATCH 0/3] git-completion.bash: improvements to _git_stash() Junio C Hamano
2021-03-19 8:09 ` Denton Liu
2021-03-19 15:57 ` Junio C Hamano
2021-03-24 8:36 ` [PATCH v2 " Denton Liu
2021-03-24 8:36 ` Denton Liu [this message]
2021-03-27 18:35 ` [PATCH v2 1/3] git-completion.bash: pass $__git_subcommand_idx from __git_main() SZEDER Gábor
2021-03-28 10:31 ` SZEDER Gábor
2021-03-24 8:36 ` [PATCH v2 2/3] git-completion.bash: extract from else in _git_stash() Denton Liu
2021-03-28 10:30 ` SZEDER Gábor
2021-03-24 8:36 ` [PATCH v2 3/3] git-completion.bash: use __gitcomp_builtin() " Denton Liu
2021-03-28 11:04 ` SZEDER Gábor
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=e4aa3e8cd7f64512ce0d72906f4d15f1f0dc0a60.1616574955.git.liu.denton@gmail.com \
--to=liu.denton@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).