2 # bash completion support for TopGit.
4 # Copyright (C) 2008 Jonas Fonseca <fonseca@diku.dk>
5 # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
6 # Based git's git-completion.sh: http://repo.or.cz/w/git/fastimport.git
7 # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
8 # Distributed under the GNU General Public License, version 2.0.
10 # To use these routines:
12 # 1) Copy this file to somewhere (e.g. ~/.tg-completion.sh).
13 # 2) Source it from your ~/.bashrc.
15 # Note: Make sure the tg script is in your PATH before you source this
16 # script, so it can properly setup cached values.
18 case "$COMP_WORDBREAKS" in
20 *) COMP_WORDBREAKS
="$COMP_WORDBREAKS:"
28 if [ -n "$__tg_dir" ]; then
30 elif [ -d .git
]; then
33 git rev-parse
--git-dir 2>/dev
/null
35 elif [ -d "$1/.git" ]; then
44 local c IFS
=' '$
'\t'$
'\n'
47 --*=*) printf %s$
'\n' "$c$2" ;;
48 *.
) printf %s$
'\n' "$c$2" ;;
49 *) printf %s$
'\n' "$c$2 " ;;
56 local cur
="${COMP_WORDS[COMP_CWORD]}"
66 COMPREPLY
=($
(compgen
-P "$2" \
67 -W "$(__tgcomp_1 "$1" "$4")" \
75 local cmd i is_hash
=y dir
="$(__tgdir "$1")"
76 if [ -d "$dir" ]; then
77 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
81 for i
in $
(git ls-remote
"$1" 2>/dev
/null
); do
85 n
,refs
/heads
/*) is_hash
=y
; echo "${i#refs/heads/}" ;;
86 n
,*) is_hash
=y
; echo "$i" ;;
93 local cmd i is_hash
=y dir
="$(__tgdir "$1")"
94 if [ -d "$dir" ]; then
95 if [ -e "$dir/HEAD" ]; then echo HEAD
; fi
96 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
97 refs
/tags refs
/heads refs
/remotes
100 for i
in $
(git ls-remote
"$dir" 2>/dev
/null
); do
101 case "$is_hash,$i" in
104 n
,refs
/tags
/*) is_hash
=y
; echo "${i#refs/tags/}" ;;
105 n
,refs
/heads
/*) is_hash
=y
; echo "${i#refs/heads/}" ;;
106 n
,refs
/remotes
/*) is_hash
=y
; echo "${i#refs/remotes/}" ;;
107 n
,*) is_hash
=y
; echo "$i" ;;
115 for i
in $
(__tg_refs
"$1"); do
122 local cmd i is_hash
=y
123 for i
in $
(git ls-remote
"$1" 2>/dev
/null
); do
124 case "$is_hash,$i" in
127 echo "$i:refs/remotes/$1/${i#refs/heads/}"
131 n
,refs
/tags
/*) is_hash
=y
;;
139 local i ngoff IFS
=$
'\n' d
="$(__tgdir)"
140 shopt -q nullglob || ngoff
=1
142 for i
in "$d/remotes"/*; do
143 echo ${i#$d/remotes/}
145 [ "$ngoff" ] && shopt -u nullglob
146 for i
in $
(git
--git-dir="$d" config
--list); do
156 __tg_find_subcommand
()
158 local word subcommand c
=1
160 while [ $c -lt $COMP_CWORD ]; do
161 word
="${COMP_WORDS[c]}"
162 for subcommand
in $1; do
163 if [ "$subcommand" = "$word" ]; then
172 __tg_complete_revlist
()
174 local pfx cur
="${COMP_WORDS[COMP_CWORD]}"
179 __tgcomp
"$(__tg_refs)" "$pfx" "$cur"
184 __tgcomp
"$(__tg_refs)" "$pfx" "$cur"
187 __tgcomp
"$(__tg_refs)"
199 if [ -n "$__tg_all_commandlist" ]; then
200 echo "$__tg_all_commandlist"
204 for i
in $
(tg
help |
sed -n 's/^Usage:.*(\([^)]*\)).*/\1/p' |
tr '|' ' ')
207 *--*) : helper pattern
;;
213 __tg_all_commandlist
=
214 __tg_all_commandlist
="$(__tg_commands 2>/dev/null)"
218 if [ $COMP_CWORD -gt 2 ] && [ "${COMP_WORDS[$COMP_CWORD - 1]}" = "$1" ]; then
230 local cur
="${COMP_WORDS[COMP_CWORD]}"
232 # Name must be the first arg after the create command
233 if [ $
((cmd
+ 1)) = $COMP_CWORD ]; then
234 __tgcomp
"$(__tg_topics)"
238 __tg_complete_arg
"-r" && {
239 __tgcomp
"$(__tg_remotes)"
250 __tgcomp
"$(__tg_refs)"
256 local cur
="${COMP_WORDS[COMP_CWORD]}"
265 __tgcomp
"$(__tg_topics)"
271 local subcommands
="add"
272 local subcommand
="$(__git_find_subcommand "$subcommands" 2>/dev/null || __git_find_on_cmdline "$subcommands" 2>/dev/null)"
273 if [ -z "$subcommand" ]; then
274 __tgcomp
"$subcommands"
278 case "$subcommand" in
280 __tgcomp
"$(__tg_refs)"
286 local cur
="${COMP_WORDS[COMP_CWORD]}"
288 __tg_complete_arg
"--collapse" && {
289 __tgcomp
"$(__tg_heads)"
293 __tg_complete_arg
"--quilt" && {
308 local cur
="${COMP_WORDS[COMP_CWORD]}"
315 __tgcomp
"$(__tg_commands)"
320 local cur
="${COMP_WORDS[COMP_CWORD]}"
322 __tg_complete_arg
"-p" && {
334 __tg_complete_revlist
340 local cur
="${COMP_WORDS[COMP_CWORD]}"
344 __tgcomp
"$(__tg_topics)"
350 local cur
="${COMP_WORDS[COMP_CWORD]}"
354 __tgcomp
"$(__tg_topics)"
360 local cur
="${COMP_WORDS[COMP_CWORD]}"
372 __tgcomp
"$(__tg_topics)"
378 local cur
="${COMP_WORDS[COMP_CWORD]}"
388 __tgcomp
"$(__tg_topics)"
394 local cur
="${COMP_WORDS[COMP_CWORD]}"
396 __tg_complete_arg
"-r" && {
397 __tgcomp
"$(__tg_remotes)"
411 __tgcomp
"$(__tg_topics)"
417 local cur
="${COMP_WORDS[COMP_CWORD]}"
426 __tgcomp
"$(__tg_remotes)"
432 local cur
="${COMP_WORDS[COMP_CWORD]}"
449 local cur
="${COMP_WORDS[COMP_CWORD]}"
453 __tgcomp
"$(__tg_topics)"
459 local cur
="${COMP_WORDS[COMP_CWORD]}"
469 __tgcomp
"$(__tg_heads)"
475 local cur
="${COMP_WORDS[COMP_CWORD]}"
485 __tgcomp
"$(__tg_topics)"
490 ### {{{ tg completion
494 local i c
=1 command __tg_dir
496 while [ $c -lt $COMP_CWORD ]; do
501 if [ $c -lt $COMP_CWORD ]; then
502 __tgcomp
"$(__tg_remotes)"
506 -h|
--help) command="help"; break ;;
507 *) command="$i"; break ;;
512 if [ -z "$command" ]; then
513 case "${COMP_WORDS[COMP_CWORD]}" in
520 *) __tgcomp
"$(__tg_commands)" ;;
526 create
) _tg_create
"$c" ;;
527 delete
) _tg_delete
;;
528 depend
) _tg_depend
;;
529 export) _tg_export
;;
532 import
) _tg_import
;;
540 remote
) _tg_remote
;;
541 summary
) _tg_summary
;;
542 update
) _tg_update
;;
549 complete
-o default
-o nospace
-F _tg tg
551 # The following are necessary only for Cygwin, and only are needed
552 # when the user has tab-completed the executable name and consequently
553 # included the '.exe' suffix.
555 if [ Cygwin
= "$(uname -o 2>/dev/null)" ]; then
556 complete
-o default
-o nospace
-F _tg tg.exe