Add patch editing command
[stgit] / contrib / stgit-completion.bash
CommitLineData
8ebae56b
KH
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
1aaf55c9
CM
13_stg_commands="
14 add
15 applied
16 assimilate
17 branch
18 delete
19 diff
20 clean
21 clone
22 commit
d5ae2173 23 cp
ed60fdae 24 edit
1aaf55c9
CM
25 export
26 files
27 float
28 fold
29 goto
841c7b2a 30 hide
1aaf55c9
CM
31 id
32 import
33 init
34 log
35 mail
36 new
37 patches
38 pick
39 pop
40 pull
41 push
22037590 42 rebase
1aaf55c9
CM
43 refresh
44 rename
45 resolved
46 rm
47 series
48 show
6f1c5e3c 49 sink
1aaf55c9 50 status
06848fab 51 sync
1aaf55c9
CM
52 top
53 unapplied
54 uncommit
841c7b2a 55 unhide
1aaf55c9
CM
56"
57
8ebae56b
KH
58# The path to .git, or empty if we're not in a repository.
59_gitdir ()
60{
61 echo "$(git rev-parse --git-dir 2>/dev/null)"
62}
63
64# Name of the current branch, or empty if there isn't one.
65_current_branch ()
66{
67 local b=$(git symbolic-ref HEAD 2>/dev/null)
68 echo ${b#refs/heads/}
69}
70
71# List of all applied patches.
72_applied_patches ()
73{
74 local g=$(_gitdir)
75 [ "$g" ] && cat "$g/patches/$(_current_branch)/applied"
76}
77
78# List of all unapplied patches.
79_unapplied_patches ()
80{
81 local g=$(_gitdir)
82 [ "$g" ] && cat "$g/patches/$(_current_branch)/unapplied"
83}
84
ca8b854c
CM
85# List of all applied patches.
86_hidden_patches ()
87{
88 local g=$(_gitdir)
89 [ "$g" ] && cat "$g/patches/$(_current_branch)/hidden"
90}
91
8ebae56b
KH
92# List of all patches.
93_all_patches ()
94{
95 local b=$(_current_branch)
96 local g=$(_gitdir)
97 [ "$g" ] && cat "$g/patches/$b/applied" "$g/patches/$b/unapplied"
98}
99
100# List of all patches except the current patch.
101_all_other_patches ()
102{
103 local b=$(_current_branch)
104 local g=$(_gitdir)
105 [ "$g" ] && cat "$g/patches/$b/applied" "$g/patches/$b/unapplied" \
7ae2e706 106 | grep -v "^$(cat $g/patches/$b/current 2> /dev/null)$"
8ebae56b
KH
107}
108
450ae43a
YD
109_all_branches ()
110{
111 local g=$(_gitdir)
f1dc6c26 112 [ "$g" ] && (cd $g/patches/ && echo *)
450ae43a
YD
113}
114
1c804cba
YD
115_conflicting_files ()
116{
117 local g=$(_gitdir)
118 [ "$g" ] && stg status --conflict
119}
120
121_dirty_files ()
122{
123 local g=$(_gitdir)
124 [ "$g" ] && stg status --modified --new --deleted
125}
126
127_unknown_files ()
128{
129 local g=$(_gitdir)
130 [ "$g" ] && stg status --unknown
131}
132
133_known_files ()
134{
135 local g=$(_gitdir)
136 [ "$g" ] && git ls-files
137}
138
1aaf55c9
CM
139# List the command options
140_cmd_options ()
141{
21b1cc55 142 stg $1 --help 2>/dev/null | grep -e " --[A-Za-z]" | sed -e "s/.*\(--[^ =]\+\).*/\1/"
1aaf55c9
CM
143}
144
8ebae56b
KH
145# Generate completions for patches and patch ranges from the given
146# patch list function, and options from the given list.
147_complete_patch_range ()
148{
149 local patchlist="$1" options="$2"
150 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
151 case "$cur" in
152 *..*)
153 pfx="${cur%..*}.."
154 cur="${cur#*..}"
155 COMPREPLY=($(compgen -P "$pfx" -W "$($patchlist)" -- "$cur"))
156 ;;
157 *)
158 COMPREPLY=($(compgen -W "$options $($patchlist)" -- "$cur"))
159 ;;
160 esac
161}
162
ebbd6f00
CM
163_complete_patch_range_options ()
164{
165 local patchlist="$1" options="$2" patch_options="$3"
166 local prev="${COMP_WORDS[COMP_CWORD-1]}"
167 local cur="${COMP_WORDS[COMP_CWORD]}"
168 local popt
169 for popt in $patch_options; do
170 if [ $prev == $popt ]; then
171 _complete_patch_range $patchlist
172 return
173 fi
174 done
175 COMPREPLY=($(compgen -W "$options" -- "$cur"))
176}
177
450ae43a
YD
178_complete_branch ()
179{
180 COMPREPLY=($(compgen -W "$(_cmd_options $1) $($2)" -- "${COMP_WORDS[COMP_CWORD]}"))
181}
182
8ebae56b
KH
183# Generate completions for options from the given list.
184_complete_options ()
185{
186 local options="$1"
187 COMPREPLY=($(compgen -W "$options" -- "${COMP_WORDS[COMP_CWORD]}"))
188}
189
1c804cba
YD
190_complete_files ()
191{
192 COMPREPLY=($(compgen -W "$(_cmd_options $1) $2" -- "${COMP_WORDS[COMP_CWORD]}"))
193}
194
1aaf55c9 195_stg_common ()
8ebae56b 196{
1aaf55c9 197 _complete_options "$(_cmd_options $1)"
8ebae56b
KH
198}
199
ebbd6f00 200_stg_patches ()
8ebae56b 201{
ebbd6f00 202 _complete_patch_range "$2" "$(_cmd_options $1)"
8ebae56b
KH
203}
204
ebbd6f00 205_stg_patches_options ()
8ebae56b 206{
ebbd6f00 207 _complete_patch_range_options "$2" "$(_cmd_options $1)" "$3"
8ebae56b
KH
208}
209
1aaf55c9 210_stg_help ()
8ebae56b 211{
1aaf55c9 212 _complete_options "$_stg_commands"
8ebae56b
KH
213}
214
215_stg ()
216{
217 local i c=1 command
218
219 while [ $c -lt $COMP_CWORD ]; do
220 if [ $c == 1 ]; then
221 command="${COMP_WORDS[c]}"
222 fi
223 c=$((++c))
224 done
225
226 # Complete name of subcommand.
227 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
228 COMPREPLY=($(compgen \
1aaf55c9 229 -W "--help --version copyright help $_stg_commands" \
8ebae56b
KH
230 -- "${COMP_WORDS[COMP_CWORD]}"))
231 return;
232 fi
233
234 # Complete arguments to subcommands.
235 case "$command" in
1aaf55c9
CM
236 # generic commands
237 help) _stg_help ;;
238 # repository commands
ebbd6f00 239 id) _stg_patches $command _all_patches ;;
1aaf55c9 240 # stack commands
ebbd6f00
CM
241 float) _stg_patches $command _all_patches ;;
242 goto) _stg_patches $command _all_other_patches ;;
ca8b854c 243 hide) _stg_patches $command _unapplied_patches ;;
ebbd6f00
CM
244 pop) _stg_patches $command _applied_patches ;;
245 push) _stg_patches $command _unapplied_patches ;;
0aebdb85 246 series) _stg_patches $command _all_patches ;;
6f1c5e3c 247 sink) _stg_patches $command _all_patches ;;
ca8b854c 248 unhide) _stg_patches $command _hidden_patches ;;
1aaf55c9 249 # patch commands
ebbd6f00 250 delete) _stg_patches $command _all_patches ;;
ed60fdae 251 edit) _stg_patches $command _applied_patches ;;
8560c67b 252 export) _stg_patches $command _applied_patches ;;
ebbd6f00
CM
253 files) _stg_patches $command _all_patches ;;
254 log) _stg_patches $command _all_patches ;;
b4f656f0 255 mail) _stg_patches $command _all_patches ;;
ebbd6f00 256 pick) _stg_patches $command _unapplied_patches ;;
1c804cba
YD
257# refresh)_stg_patches_options $command _applied_patches "-p --patch" ;;
258 refresh) _complete_files $command "$(_dirty_files)" ;;
ebbd6f00
CM
259 rename) _stg_patches $command _all_patches ;;
260 show) _stg_patches $command _all_patches ;;
06848fab 261 sync) _stg_patches $command _applied_patches ;;
ebbd6f00
CM
262 # working-copy commands
263 diff) _stg_patches_options $command _applied_patches "-r --range" ;;
1c804cba
YD
264 resolved) _complete_files $command "$(_conflicting_files)" ;;
265 add) _complete_files $command "$(_unknown_files)" ;;
266# rm) _complete_files $command "$(_known_files)" ;;
450ae43a
YD
267 # commands that usually raher accept branches
268 branch) _complete_branch $command _all_branches ;;
269 rebase) _complete_branch $command _all_branches ;;
1aaf55c9
CM
270 # all the other commands
271 *) _stg_common $command ;;
8ebae56b
KH
272 esac
273}
274
275complete -o default -F _stg stg