]> git.ipfire.org Git - thirdparty/git.git/commitdiff
completion: return the index of found word from __git_find_on_cmdline()
authorSZEDER Gábor <szeder.dev@gmail.com>
Thu, 19 Dec 2019 15:09:18 +0000 (16:09 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 15 Jan 2020 22:06:13 +0000 (14:06 -0800)
When using the __git_find_on_cmdline() helper function so far we've
only been interested in which one of a set of words appear on the
command line.  To complete options for some of 'git worktree's
subcommands in the following patches we'll need not only that, but the
index of that word on the command line as well.

Extend __git_find_on_cmdline() to optionally show the index of the
found word on the command line (IOW in the $words array) when the
'--show-idx' option is given.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
contrib/completion/git-completion.bash
t/t9902-completion.sh

index 84ce84d65cb2f254ce4977314acbab7bb0ebb7a0..340d8defce2e3176188afa3c8360c8dc7234c33e 100644 (file)
@@ -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
index a1762f9d58d18205d5840dec07f877a0e5fc0dbc..d988e516d700b712690bf7117e2fd5140c8192e0 100755 (executable)
@@ -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