Robustify rebase test: check patches are reapplied.
[stgit] / contrib / stgit-completion.bash
1 # bash completion support for StGIT -*- shell-script -*-
2 #
3 # Copyright (C) 2006, Karl Hasselström <kha@treskal.com>
4 # Based on git-completion.sh
5 #
6 # To use these routines:
7 #
8 # 1. Copy this file to somewhere (e.g. ~/.stgit-completion.bash).
9 #
10 # 2. Add the following line to your .bashrc:
11 # . ~/.stgit-completion.bash
12
13 _stg_commands="
14 add
15 applied
16 assimilate
17 branch
18 delete
19 diff
20 clean
21 clone
22 commit
23 cp
24 export
25 files
26 float
27 fold
28 goto
29 hide
30 id
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
45 rm
46 series
47 show
48 sink
49 status
50 sync
51 top
52 unapplied
53 uncommit
54 unhide
55 "
56
57 # The path to .git, or empty if we're not in a repository.
58 _gitdir ()
59 {
60 echo "$(git rev-parse --git-dir 2>/dev/null)"
61 }
62
63 # Name of the current branch, or empty if there isn't one.
64 _current_branch ()
65 {
66 local b=$(git symbolic-ref HEAD 2>/dev/null)
67 echo ${b#refs/heads/}
68 }
69
70 # List of all applied patches.
71 _applied_patches ()
72 {
73 local g=$(_gitdir)
74 [ "$g" ] && cat "$g/patches/$(_current_branch)/applied"
75 }
76
77 # List of all unapplied patches.
78 _unapplied_patches ()
79 {
80 local g=$(_gitdir)
81 [ "$g" ] && cat "$g/patches/$(_current_branch)/unapplied"
82 }
83
84 # List of all patches.
85 _all_patches ()
86 {
87 local b=$(_current_branch)
88 local g=$(_gitdir)
89 [ "$g" ] && cat "$g/patches/$b/applied" "$g/patches/$b/unapplied"
90 }
91
92 # List of all patches except the current patch.
93 _all_other_patches ()
94 {
95 local b=$(_current_branch)
96 local g=$(_gitdir)
97 [ "$g" ] && cat "$g/patches/$b/applied" "$g/patches/$b/unapplied" \
98 | grep -v "^$(cat $g/patches/$b/current 2> /dev/null)$"
99 }
100
101 _all_branches ()
102 {
103 local g=$(_gitdir)
104 [ "$g" ] && (cd .git/patches/ && echo *)
105 }
106
107 # List the command options
108 _cmd_options ()
109 {
110 stg $1 --help 2>/dev/null | grep -e " --[A-Za-z]" | sed -e "s/.*\(--[^ =]\+\).*/\1/"
111 }
112
113 # Generate completions for patches and patch ranges from the given
114 # patch list function, and options from the given list.
115 _complete_patch_range ()
116 {
117 local patchlist="$1" options="$2"
118 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
119 case "$cur" in
120 *..*)
121 pfx="${cur%..*}.."
122 cur="${cur#*..}"
123 COMPREPLY=($(compgen -P "$pfx" -W "$($patchlist)" -- "$cur"))
124 ;;
125 *)
126 COMPREPLY=($(compgen -W "$options $($patchlist)" -- "$cur"))
127 ;;
128 esac
129 }
130
131 _complete_patch_range_options ()
132 {
133 local patchlist="$1" options="$2" patch_options="$3"
134 local prev="${COMP_WORDS[COMP_CWORD-1]}"
135 local cur="${COMP_WORDS[COMP_CWORD]}"
136 local popt
137 for popt in $patch_options; do
138 if [ $prev == $popt ]; then
139 _complete_patch_range $patchlist
140 return
141 fi
142 done
143 COMPREPLY=($(compgen -W "$options" -- "$cur"))
144 }
145
146 _complete_branch ()
147 {
148 COMPREPLY=($(compgen -W "$(_cmd_options $1) $($2)" -- "${COMP_WORDS[COMP_CWORD]}"))
149 }
150
151 # Generate completions for options from the given list.
152 _complete_options ()
153 {
154 local options="$1"
155 COMPREPLY=($(compgen -W "$options" -- "${COMP_WORDS[COMP_CWORD]}"))
156 }
157
158 _stg_common ()
159 {
160 _complete_options "$(_cmd_options $1)"
161 }
162
163 _stg_patches ()
164 {
165 _complete_patch_range "$2" "$(_cmd_options $1)"
166 }
167
168 _stg_patches_options ()
169 {
170 _complete_patch_range_options "$2" "$(_cmd_options $1)" "$3"
171 }
172
173 _stg_help ()
174 {
175 _complete_options "$_stg_commands"
176 }
177
178 _stg ()
179 {
180 local i c=1 command
181
182 while [ $c -lt $COMP_CWORD ]; do
183 if [ $c == 1 ]; then
184 command="${COMP_WORDS[c]}"
185 fi
186 c=$((++c))
187 done
188
189 # Complete name of subcommand.
190 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
191 COMPREPLY=($(compgen \
192 -W "--help --version copyright help $_stg_commands" \
193 -- "${COMP_WORDS[COMP_CWORD]}"))
194 return;
195 fi
196
197 # Complete arguments to subcommands.
198 case "$command" in
199 # generic commands
200 help) _stg_help ;;
201 # repository commands
202 id) _stg_patches $command _all_patches ;;
203 # stack commands
204 float) _stg_patches $command _all_patches ;;
205 goto) _stg_patches $command _all_other_patches ;;
206 hide) _stg_patches $command _all_patches ;;
207 pop) _stg_patches $command _applied_patches ;;
208 push) _stg_patches $command _unapplied_patches ;;
209 series) _stg_patches $command _all_patches ;;
210 sink) _stg_patches $command _all_patches ;;
211 unhide) _stg_patches $command _all_patches ;;
212 # patch commands
213 delete) _stg_patches $command _all_patches ;;
214 export) _stg_patches $command _applied_patches ;;
215 files) _stg_patches $command _all_patches ;;
216 log) _stg_patches $command _all_patches ;;
217 mail) _stg_patches $command _all_patches ;;
218 pick) _stg_patches $command _unapplied_patches ;;
219 refresh)_stg_patches_options $command _applied_patches "-p --patch" ;;
220 rename) _stg_patches $command _all_patches ;;
221 show) _stg_patches $command _all_patches ;;
222 sync) _stg_patches $command _applied_patches ;;
223 # working-copy commands
224 diff) _stg_patches_options $command _applied_patches "-r --range" ;;
225 # commands that usually raher accept branches
226 branch) _complete_branch $command _all_branches ;;
227 rebase) _complete_branch $command _all_branches ;;
228 # all the other commands
229 *) _stg_common $command ;;
230 esac
231 }
232
233 complete -o default -F _stg stg