Support bash completion of refs/remote.
authorShawn O. Pearce <spearce@spearce.org>
Mon, 27 Nov 2006 08:42:32 +0000 (03:42 -0500)
committerJunio C Hamano <junkio@cox.net>
Mon, 27 Nov 2006 20:17:52 +0000 (12:17 -0800)
Now that people are really likely to start using separate remotes
(due to the default in git-clone changing) we should support ref
completion for these refs in as many commands as possible.

While we are working on this routine we should use for-each-ref
to obtain a list of local refs, as this should run faster than
peek-remote as it does not need to dereference tag objects in
order to produce the list of refs back to us. It should also
be more friendly to users of StGIT as we won't generate a list
of the StGIT metadata refs.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
contrib/completion/git-completion.bash
index 3852f467d8729612db0277499734ee5dfdb1e0ba..a9c456f61b66201d6e2dcf105619ea71f701f6ea 100755 (executable)
@@ -47,16 +47,26 @@ __git_refs ()
 {
        local cmd i is_hash=y dir="${1:-$(__gitdir)}"
        if [ -d "$dir" ]; then
-               cmd=git-peek-remote
-       else
-               cmd=git-ls-remote
+               if [ -e "$dir/HEAD" ]; then echo HEAD; fi
+               for i in $(git --git-dir="$dir" \
+                       for-each-ref --format='%(refname)' \
+                       refs/tags refs/heads refs/remotes); do
+                       case "$i" in
+                               refs/tags/*)    echo "${i#refs/tags/}" ;;
+                               refs/heads/*)   echo "${i#refs/heads/}" ;;
+                               refs/remotes/*) echo "${i#refs/remotes/}" ;;
+                               *)              echo "$i" ;;
+                       esac
+               done
+               return
        fi
-       for i in $($cmd "$dir" 2>/dev/null); do
+       for i in $(git-ls-remote "$dir" 2>/dev/null); do
                case "$is_hash,$i" in
                y,*) is_hash=n ;;
                n,*^{}) is_hash=y ;;
                n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
                n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
+               n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
                n,*) is_hash=y; echo "$i" ;;
                esac
        done