diff options
-rw-r--r-- | contrib/completion/git-completion.bash | 20 | ||||
-rwxr-xr-x | t/t9902-completion.sh | 29 |
2 files changed, 46 insertions, 3 deletions
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index 84ce84d..340d8de 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -1069,18 +1069,32 @@ __git_aliased_command () done } -# __git_find_on_cmdline requires 1 argument # Check whether one of the given words is present on the command line, # and print the first word found. +# +# Usage: __git_find_on_cmdline [<option>]... "<wordlist>" +# --show-idx: Optionally show the index of the found word in the $words array. __git_find_on_cmdline () { - local word c=1 + local word c=1 show_idx + + while test $# -gt 1; do + case "$1" in + --show-idx) show_idx=y ;; + *) return 1 ;; + esac + shift + done local wordlist="$1" while [ $c -lt $cword ]; do for word in $wordlist; do if [ "$word" = "${words[c]}" ]; then - echo "$word" + if [ -n "$show_idx" ]; then + echo "$c $word" + else + echo "$word" + fi return fi done diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh index a1762f9..d988e51 100755 --- a/t/t9902-completion.sh +++ b/t/t9902-completion.sh @@ -1392,6 +1392,35 @@ test_expect_success '__git_find_on_cmdline - no match' ' test_must_be_empty actual ' +test_expect_success '__git_find_on_cmdline - single match with index' ' + echo "3 list" >expect && + ( + words=(git command --opt list) && + cword=${#words[@]} && + __git_find_on_cmdline --show-idx "add list remove" >actual + ) && + test_cmp expect actual +' + +test_expect_success '__git_find_on_cmdline - multiple matches with index' ' + echo "4 remove" >expect && + ( + words=(git command -o --opt remove list add) && + cword=${#words[@]} && + __git_find_on_cmdline --show-idx "add list remove" >actual + ) && + test_cmp expect actual +' + +test_expect_success '__git_find_on_cmdline - no match with index' ' + ( + words=(git command --opt branch) && + cword=${#words[@]} && + __git_find_on_cmdline --show-idx "add list remove" >actual + ) && + test_must_be_empty actual +' + test_expect_success '__git_get_config_variables' ' cat >expect <<-EOF && name-1 |