bash_completion
171 lines
| 3.7 KiB
| application/x-sh
|
BashLexer
/ contrib / bash_completion
TK Soh
|
r1311 | shopt -s extglob | ||
mpm@selenic.com
|
r916 | _hg_commands() | ||
{ | ||||
local commands="$(hg -v help | sed -e '1,/^list of commands:/d' \ | ||||
Thomas Arendsen Hein
|
r1308 | -e '/^global options:/,$d' \ | ||
mpm@selenic.com
|
r916 | -e '/^ [^ ]/!d; s/[,:]//g;')" | ||
Thomas Arendsen Hein
|
r1308 | |||
# hide debug commands from users, but complete them if | ||||
mpm@selenic.com
|
r916 | # specifically asked for | ||
if [[ "$cur" == de* ]]; then | ||||
commands="$commands debugcheckstate debugstate debugindex" | ||||
mpm@selenic.com
|
r1115 | commands="$commands debugindexdot debugwalk debugdata" | ||
Thomas Arendsen Hein
|
r1263 | commands="$commands debugancestor debugconfig debugrename" | ||
mpm@selenic.com
|
r916 | fi | ||
COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -W "$commands" -- "$cur") ) | ||||
} | ||||
_hg_paths() | ||||
{ | ||||
local paths="$(hg paths | sed -e 's/ = .*$//')" | ||||
COMPREPLY=(${COMPREPLY[@]:-} $( compgen -W "$paths" -- "$cur" )) | ||||
} | ||||
mpm@selenic.com
|
r935 | _hg_status() | ||
{ | ||||
local files="$( hg status -$1 | cut -b 3- )" | ||||
COMPREPLY=(${COMPREPLY[@]:-} $( compgen -W "$files" -- "$cur" )) | ||||
} | ||||
mpm@selenic.com
|
r916 | _hg_tags() | ||
{ | ||||
local tags="$(hg tags | sed -e 's/[0-9]*:[a-f0-9]\{40\}$//; s/ *$//')" | ||||
COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -W "$tags" -- "$cur") ) | ||||
} | ||||
# this is "kind of" ugly... | ||||
_hg_count_non_option() | ||||
{ | ||||
local i count=0 | ||||
local filters="$1" | ||||
for (( i=1; $i<=$COMP_CWORD; i++ )); do | ||||
if [[ "${COMP_WORDS[i]}" != -* ]]; then | ||||
Alexis S. L. Carvalho
|
r1152 | if [[ ${COMP_WORDS[i-1]} == @($filters|$global_args) ]]; then | ||
continue | ||||
fi | ||||
mpm@selenic.com
|
r916 | count=$(($count + 1)) | ||
fi | ||||
done | ||||
echo $(($count - 1)) | ||||
} | ||||
_hg() | ||||
{ | ||||
local cur prev cmd opts i | ||||
Alexis S. L. Carvalho
|
r1151 | # global options that receive an argument | ||
local global_args='--cwd|-R|--repository' | ||||
mpm@selenic.com
|
r916 | |||
COMPREPLY=() | ||||
cur="$2" | ||||
prev="$3" | ||||
Thomas Arendsen Hein
|
r1308 | # searching for the command | ||
Alexis S. L. Carvalho
|
r1151 | # (first non-option argument that doesn't follow a global option that | ||
# receives an argument) | ||||
mpm@selenic.com
|
r916 | for (( i=1; $i<=$COMP_CWORD; i++ )); do | ||
Alexis S. L. Carvalho
|
r1151 | if [[ ${COMP_WORDS[i]} != -* ]]; then | ||
if [[ ${COMP_WORDS[i-1]} != @($global_args) ]]; then | ||||
cmd="${COMP_WORDS[i]}" | ||||
break | ||||
fi | ||||
mpm@selenic.com
|
r916 | fi | ||
done | ||||
if [[ "$cur" == -* ]]; then | ||||
Alexis S. L. Carvalho
|
r1149 | # this assumes that there are no commands with spaces in the name | ||
opts=$(hg -v help $cmd | sed -e '/^ *-/!d; s/ [^- ].*//') | ||||
mpm@selenic.com
|
r916 | |||
COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -W "$opts" -- "$cur") ) | ||||
return | ||||
fi | ||||
Alexis S. L. Carvalho
|
r1151 | # global options | ||
case "$prev" in | ||||
-R|--repository) | ||||
COMPREPLY=(${COMPREPLY[@]:-} $( compgen -d -- "$cur" )) | ||||
return | ||||
;; | ||||
--cwd) | ||||
COMPREPLY=(${COMPREPLY[@]:-} $( compgen -d -- "$cur" )) | ||||
return | ||||
;; | ||||
esac | ||||
mpm@selenic.com
|
r916 | |||
if [ -z "$cmd" ] || [ $COMP_CWORD -eq $i ]; then | ||||
_hg_commands | ||||
return | ||||
fi | ||||
Alexis S. L. Carvalho
|
r1150 | # canonicalize command name | ||
cmd=$(hg -q help "$cmd" | sed -e 's/^hg //; s/ .*//; 1q') | ||||
mpm@selenic.com
|
r916 | if [ "$cmd" != status ] && [ "$prev" = -r ] || [ "$prev" = --rev ]; then | ||
_hg_tags | ||||
return | ||||
fi | ||||
case "$cmd" in | ||||
help) | ||||
_hg_commands | ||||
;; | ||||
Alexis S. L. Carvalho
|
r1150 | export|manifest|update) | ||
mpm@selenic.com
|
r916 | _hg_tags | ||
;; | ||||
Alexis S. L. Carvalho
|
r1150 | pull|push|outgoing|incoming) | ||
mpm@selenic.com
|
r916 | _hg_paths | ||
COMPREPLY=(${COMPREPLY[@]:-} $( compgen -d -- "$cur" )) | ||||
;; | ||||
paths) | ||||
_hg_paths | ||||
;; | ||||
mpm@selenic.com
|
r935 | add) | ||
_hg_status "u" | ||||
;; | ||||
Alexis S. L. Carvalho
|
r1150 | commit) | ||
mpm@selenic.com
|
r935 | _hg_status "mra" | ||
;; | ||||
remove) | ||||
_hg_status "r" | ||||
;; | ||||
forget) | ||||
_hg_status "a" | ||||
;; | ||||
diff) | ||||
_hg_status "mra" | ||||
;; | ||||
revert) | ||||
_hg_status "mra" | ||||
;; | ||||
mpm@selenic.com
|
r916 | clone) | ||
local count=$(_hg_count_non_option) | ||||
if [ $count = 1 ]; then | ||||
_hg_paths | ||||
fi | ||||
COMPREPLY=(${COMPREPLY[@]:-} $( compgen -d -- "$cur" )) | ||||
;; | ||||
mpm@selenic.com
|
r1115 | debugindex|debugindexdot) | ||
COMPREPLY=(${COMPREPLY[@]:-} $( compgen -f -X "!*.i" -- "$cur" )) | ||||
;; | ||||
debugdata) | ||||
COMPREPLY=(${COMPREPLY[@]:-} $( compgen -f -X "!*.d" -- "$cur" )) | ||||
;; | ||||
mpm@selenic.com
|
r916 | cat) | ||
Alexis S. L. Carvalho
|
r1152 | local count=$(_hg_count_non_option '-o|--output') | ||
mpm@selenic.com
|
r916 | if [ $count = 2 ]; then | ||
_hg_tags | ||||
else | ||||
COMPREPLY=(${COMPREPLY[@]:-} $( compgen -f -- "$cur" )) | ||||
fi | ||||
;; | ||||
Thomas Arendsen Hein
|
r1308 | *) | ||
mpm@selenic.com
|
r916 | COMPREPLY=(${COMPREPLY[@]:-} $( compgen -f -- "$cur" )) | ||
;; | ||||
esac | ||||
} | ||||
Alexis S. L. Carvalho
|
r1153 | complete -o bashdefault -o default -F _hg hg 2> /dev/null \ | ||
|| complete -o default -F _hg hg | ||||