blob: a05655c3efe03a4708daad65a253c63523cd8934 (
plain) (
tree)
|
|
# Some simple completion for Git
_git() {
# Subcommands for this function to stack words onto COMPREPLY; if the first
# argument is not given, the rest of the function is reached
case $1 in
# No argument; continue normal completion
'') ;;
# Symbolic references, remote or local
refs)
local ref
while IFS= read -r ref ; do
ref=${ref#refs/*/}
case $ref in
'') continue ;;
"$2"*)
COMPREPLY[${#COMPREPLY[@]}]=$ref
;;
esac
done < <(git for-each-ref --format '%(refname)' 2>/dev/null)
return
;;
# Remote names
remotes)
local remote
while IFS= read -r remote ; do
case $remote in
'') continue ;;
"$2"*)
COMPREPLY[${#COMPREPLY[@]}]=$remote
;;
esac
done < <(git remote 2>/dev/null)
return
;;
# Git aliases
aliases)
local alias
while IFS= read -r alias ; do
alias=${alias#alias.}
alias=${alias%% *}
case $alias in
'') continue ;;
"$2"*)
COMPREPLY[${#COMPREPLY[@]}]=$alias
;;
esac
done < <(git config --get-regexp '^alias\.' 2>/dev/null)
return
;;
# Git subcommands
subcommands)
local execpath
execpath=$(git --exec-path) || return
local path
for path in "$execpath"/git-"$2"* ; do
! [[ -d $path ]] || continue
[[ -e $path ]] || continue
[[ -x $path ]] || continue
COMPREPLY[${#COMPREPLY[@]}]=${path#"$execpath"/git-}
done
return
;;
esac
# Try to find the index of the Git subcommand
local -i sci i
for ((i = 1; !sci && i <= COMP_CWORD; i++)) ; do
case ${COMP_WORDS[i]} in
# Skip --option=value
--*=*) ;;
# These ones have arguments, so bump the index up one more
-C|-c|--exec-path|--git-dir|--work-tree|--namespace) ((i++)) ;;
# Skip --option
--?*) ;;
# We have hopefully found our subcommand
*) ((sci = i)) ;;
esac
done
# Complete initial subcommand or alias
if ((sci == COMP_CWORD)) ; then
"${FUNCNAME[0]}" subcommands
"${FUNCNAME[0]}" aliases
return
fi
# Test subcommand to choose completions
case ${COMP_WORDS[sci]} in
# Help on real subcommands (not aliases)
help)
"${FUNCNAME[0]}" subcommands
return
;;
# Complete with remote subcommands and then remote names
remote)
if ((COMP_CWORD == 2)) ; then
local word
while IFS= read -r word ; do
[[ -n $word ]] || continue
COMPREPLY[${#COMPREPLY[@]}]=$word
done < <(compgen -W '
add
get-url
prune
remove
rename
set-branches
set-head
set-url
show
update
' -- "$2")
else
"${FUNCNAME[0]}" remotes
fi
return
;;
# Complete with stash subcommands
stash)
((COMP_CWORD == 2)) || return
local word
while IFS= read -r word ; do
[[ -n $word ]] || continue
COMPREPLY[${#COMPREPLY[@]}]=$word
done < <(compgen -W '
apply
branch
clear
create
drop
list
pop
save
show
store
' -- "$2")
return
;;
# Complete with submodule subcommands
submodule)
((COMP_CWORD == 2)) || return
local word
while IFS= read -r word ; do
[[ -n $word ]] || continue
COMPREPLY[${#COMPREPLY[@]}]=$word
done < <(compgen -W '
add
deinit
foreach
init
status
summary
sync
update
' -- "$2")
return
;;
# Complete with remotes and then refs
fetch|pull|push)
if ((COMP_CWORD == 2)) ; then
"${FUNCNAME[0]}" remotes
else
"${FUNCNAME[0]}" refs
fi
;;
# Commands for which I'm likely to want a ref
branch|checkout|merge|rebase|tag)
"${FUNCNAME[0]}" refs
;;
# I normally only want a refspec for "reset" if I'm using the --hard or
# --soft option; otherwise, files are fine
reset)
case $3 in
--hard|--soft)
"${FUNCNAME[0]}" refs
;;
esac
;;
esac
}
complete -F _git -o bashdefault -o default git
|