Add --keep option to goto
[stgit/ydirson.git] / contrib / stgit-completion.bash
bloba843db4407140dd68179950e51b82ba08cefe34e
1 # bash completion support for StGIT -*- shell-script -*-
3 # Copyright (C) 2006, Karl Hasselström <kha@treskal.com>
4 # Based on git-completion.sh
6 # To use these routines:
8 # 1. Copy this file to somewhere (e.g. ~/.stgit-completion.bash).
10 # 2. Add the following line to your .bashrc:
11 # . ~/.stgit-completion.bash
13 _stg_commands="
14 add
15 applied
16 assimilate
17 branch
18 delete
19 diff
20 clean
21 clone
22 commit
24 export
25 files
26 float
27 fold
28 goto
29 hide
31 import
32 init
33 log
34 mail
35 new
36 patches
37 pick
38 pop
39 pull
40 push
41 rebase
42 refresh
43 rename
44 resolved
46 series
47 show
48 sink
49 status
50 sync
51 top
52 unapplied
53 uncommit
54 unhide
57 # The path to .git, or empty if we're not in a repository.
58 _gitdir ()
60 echo "$(git rev-parse --git-dir 2>/dev/null)"
63 # Name of the current branch, or empty if there isn't one.
64 _current_branch ()
66 local b=$(git symbolic-ref HEAD 2>/dev/null)
67 echo ${b#refs/heads/}
70 # List of all applied patches.
71 _applied_patches ()
73 local g=$(_gitdir)
74 [ "$g" ] && cat "$g/patches/$(_current_branch)/applied"
77 # List of all unapplied patches.
78 _unapplied_patches ()
80 local g=$(_gitdir)
81 [ "$g" ] && cat "$g/patches/$(_current_branch)/unapplied"
84 # List of all applied patches.
85 _hidden_patches ()
87 local g=$(_gitdir)
88 [ "$g" ] && cat "$g/patches/$(_current_branch)/hidden"
91 # List of all patches.
92 _all_patches ()
94 local b=$(_current_branch)
95 local g=$(_gitdir)
96 [ "$g" ] && cat "$g/patches/$b/applied" "$g/patches/$b/unapplied"
99 # List of all patches except the current patch.
100 _all_other_patches ()
102 local b=$(_current_branch)
103 local g=$(_gitdir)
104 [ "$g" ] && cat "$g/patches/$b/applied" "$g/patches/$b/unapplied" \
105 | grep -v "^$(cat $g/patches/$b/current 2> /dev/null)$"
108 _all_branches ()
110 local g=$(_gitdir)
111 [ "$g" ] && (cd .git/patches/ && echo *)
114 # List the command options
115 _cmd_options ()
117 stg $1 --help 2>/dev/null | grep -e " --[A-Za-z]" | sed -e "s/.*\(--[^ =]\+\).*/\1/"
120 # Generate completions for patches and patch ranges from the given
121 # patch list function, and options from the given list.
122 _complete_patch_range ()
124 local patchlist="$1" options="$2"
125 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
126 case "$cur" in
127 *..*)
128 pfx="${cur%..*}.."
129 cur="${cur#*..}"
130 COMPREPLY=($(compgen -P "$pfx" -W "$($patchlist)" -- "$cur"))
133 COMPREPLY=($(compgen -W "$options $($patchlist)" -- "$cur"))
135 esac
138 _complete_patch_range_options ()
140 local patchlist="$1" options="$2" patch_options="$3"
141 local prev="${COMP_WORDS[COMP_CWORD-1]}"
142 local cur="${COMP_WORDS[COMP_CWORD]}"
143 local popt
144 for popt in $patch_options; do
145 if [ $prev == $popt ]; then
146 _complete_patch_range $patchlist
147 return
149 done
150 COMPREPLY=($(compgen -W "$options" -- "$cur"))
153 _complete_branch ()
155 COMPREPLY=($(compgen -W "$(_cmd_options $1) $($2)" -- "${COMP_WORDS[COMP_CWORD]}"))
158 # Generate completions for options from the given list.
159 _complete_options ()
161 local options="$1"
162 COMPREPLY=($(compgen -W "$options" -- "${COMP_WORDS[COMP_CWORD]}"))
165 _stg_common ()
167 _complete_options "$(_cmd_options $1)"
170 _stg_patches ()
172 _complete_patch_range "$2" "$(_cmd_options $1)"
175 _stg_patches_options ()
177 _complete_patch_range_options "$2" "$(_cmd_options $1)" "$3"
180 _stg_help ()
182 _complete_options "$_stg_commands"
185 _stg ()
187 local i c=1 command
189 while [ $c -lt $COMP_CWORD ]; do
190 if [ $c == 1 ]; then
191 command="${COMP_WORDS[c]}"
193 c=$((++c))
194 done
196 # Complete name of subcommand.
197 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
198 COMPREPLY=($(compgen \
199 -W "--help --version copyright help $_stg_commands" \
200 -- "${COMP_WORDS[COMP_CWORD]}"))
201 return;
204 # Complete arguments to subcommands.
205 case "$command" in
206 # generic commands
207 help) _stg_help ;;
208 # repository commands
209 id) _stg_patches $command _all_patches ;;
210 # stack commands
211 float) _stg_patches $command _all_patches ;;
212 goto) _stg_patches $command _all_other_patches ;;
213 hide) _stg_patches $command _unapplied_patches ;;
214 pop) _stg_patches $command _applied_patches ;;
215 push) _stg_patches $command _unapplied_patches ;;
216 series) _stg_patches $command _all_patches ;;
217 sink) _stg_patches $command _all_patches ;;
218 unhide) _stg_patches $command _hidden_patches ;;
219 # patch commands
220 delete) _stg_patches $command _all_patches ;;
221 export) _stg_patches $command _applied_patches ;;
222 files) _stg_patches $command _all_patches ;;
223 log) _stg_patches $command _all_patches ;;
224 mail) _stg_patches $command _all_patches ;;
225 pick) _stg_patches $command _unapplied_patches ;;
226 refresh)_stg_patches_options $command _applied_patches "-p --patch" ;;
227 rename) _stg_patches $command _all_patches ;;
228 show) _stg_patches $command _all_patches ;;
229 sync) _stg_patches $command _applied_patches ;;
230 # working-copy commands
231 diff) _stg_patches_options $command _applied_patches "-r --range" ;;
232 # commands that usually raher accept branches
233 branch) _complete_branch $command _all_branches ;;
234 rebase) _complete_branch $command _all_branches ;;
235 # all the other commands
236 *) _stg_common $command ;;
237 esac
240 complete -o default -F _stg stg