completion: improve ls-remote output filtering in __git_refs()
authorSZEDER Gábor <szeder@ira.uka.de>
Sat, 8 Oct 2011 14:54:38 +0000 (16:54 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 21 Oct 2011 21:38:23 +0000 (14:38 -0700)
The remote-handling part of __git_refs() has a nice for loop and state
machine case statement to iterate over all words from the output of
'git ls-remote' to identify object names and ref names.  Since each
line in the output of 'git ls-remote' consists of an object name and a
ref name, we can do more effective filtering by using a while-read
loop and letting bash's word splitting take care of object names.
This way the code is easier to understand and the loop will need only
half the number of iterations than before.

Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
contrib/completion/git-completion.bash

index 3f7a776a9d92f70d5275fb55a528a46fed2c11fc..5632c8862775a5aacd5ac270890c6e96b31d1358 100755 (executable)
@@ -580,7 +580,7 @@ __git_tags ()
 # by checkout for tracking branches
 __git_refs ()
 {
-       local i is_hash=y dir="$(__gitdir "${1-}")" track="${2-}"
+       local i hash dir="$(__gitdir "${1-}")" track="${2-}"
        local format refs
        if [ -d "$dir" ]; then
                case "$cur" in
@@ -616,12 +616,12 @@ __git_refs ()
                fi
                return
        fi
-       for i in $(git ls-remote "$dir" HEAD ORIG_HEAD 'refs/tags/*' 'refs/heads/*' 'refs/remotes/*' 2>/dev/null); do
-               case "$is_hash,$i" in
-               y,*) is_hash=n ;;
-               n,*^{}) is_hash=y ;;
-               n,refs/*) is_hash=y; echo "${i#refs/*/}" ;;
-               n,*) is_hash=y; echo "$i" ;;
+       git ls-remote "$dir" HEAD ORIG_HEAD 'refs/tags/*' 'refs/heads/*' 'refs/remotes/*' 2>/dev/null | \
+       while read hash i; do
+               case "$i" in
+               *^{}) ;;
+               refs/*) echo "${i#refs/*/}" ;;
+               *) echo "$i" ;;
                esac
        done
 }