Browse Source

Support bash completion of refs/remote.

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>
maint
Shawn O. Pearce 18 years ago committed by Junio C Hamano
parent
commit
35e65ecca7
  1. 18
      contrib/completion/git-completion.bash

18
contrib/completion/git-completion.bash

@ -47,16 +47,26 @@ __git_refs ()
{ {
local cmd i is_hash=y dir="${1:-$(__gitdir)}" local cmd i is_hash=y dir="${1:-$(__gitdir)}"
if [ -d "$dir" ]; then if [ -d "$dir" ]; then
cmd=git-peek-remote if [ -e "$dir/HEAD" ]; then echo HEAD; fi
else for i in $(git --git-dir="$dir" \
cmd=git-ls-remote 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 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 case "$is_hash,$i" in
y,*) is_hash=n ;; y,*) is_hash=n ;;
n,*^{}) is_hash=y ;; n,*^{}) is_hash=y ;;
n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;; n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;; 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" ;; n,*) is_hash=y; echo "$i" ;;
esac esac
done done

Loading…
Cancel
Save