chiark / gitweb /
Add a no-act flag to stg-dispatch and stg-fold-file-from.
[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
1aaf55c9
CM
24 export
25 files
26 float
27 fold
28 goto
841c7b2a 29 hide
1aaf55c9
CM
30 id
31 import
32 init
33 log
34 mail
35 new
36 patches
37 pick
38 pop
39 pull
40 push
22037590 41 rebase
1aaf55c9
CM
42 refresh
43 rename
44 resolved
45 rm
46 series
47 show
6f1c5e3c 48 sink
1aaf55c9 49 status
06848fab 50 sync
1aaf55c9
CM
51 top
52 unapplied
53 uncommit
841c7b2a 54 unhide
1aaf55c9
CM
55"
56
8ebae56b
KH
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
ca8b854c
CM
84# List of all applied patches.
85_hidden_patches ()
86{
87 local g=$(_gitdir)
88 [ "$g" ] && cat "$g/patches/$(_current_branch)/hidden"
89}
90
8ebae56b
KH
91# List of all patches.
92_all_patches ()
93{
94 local b=$(_current_branch)
95 local g=$(_gitdir)
96 [ "$g" ] && cat "$g/patches/$b/applied" "$g/patches/$b/unapplied"
97}
98
99# List of all patches except the current patch.
100_all_other_patches ()
101{
102 local b=$(_current_branch)
103 local g=$(_gitdir)
104 [ "$g" ] && cat "$g/patches/$b/applied" "$g/patches/$b/unapplied" \
7ae2e706 105 | grep -v "^$(cat $g/patches/$b/current 2> /dev/null)$"
8ebae56b
KH
106}
107
450ae43a
YD
108_all_branches ()
109{
110 local g=$(_gitdir)
111 [ "$g" ] && (cd .git/patches/ && echo *)
112}
113
1aaf55c9
CM
114# List the command options
115_cmd_options ()
116{
21b1cc55 117 stg $1 --help 2>/dev/null | grep -e " --[A-Za-z]" | sed -e "s/.*\(--[^ =]\+\).*/\1/"
1aaf55c9
CM
118}
119
8ebae56b
KH
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 ()
123{
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"))
131 ;;
132 *)
133 COMPREPLY=($(compgen -W "$options $($patchlist)" -- "$cur"))
134 ;;
135 esac
136}
137
ebbd6f00
CM
138_complete_patch_range_options ()
139{
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
148 fi
149 done
150 COMPREPLY=($(compgen -W "$options" -- "$cur"))
151}
152
450ae43a
YD
153_complete_branch ()
154{
155 COMPREPLY=($(compgen -W "$(_cmd_options $1) $($2)" -- "${COMP_WORDS[COMP_CWORD]}"))
156}
157
8ebae56b
KH
158# Generate completions for options from the given list.
159_complete_options ()
160{
161 local options="$1"
162 COMPREPLY=($(compgen -W "$options" -- "${COMP_WORDS[COMP_CWORD]}"))
163}
164
1aaf55c9 165_stg_common ()
8ebae56b 166{
1aaf55c9 167 _complete_options "$(_cmd_options $1)"
8ebae56b
KH
168}
169
ebbd6f00 170_stg_patches ()
8ebae56b 171{
ebbd6f00 172 _complete_patch_range "$2" "$(_cmd_options $1)"
8ebae56b
KH
173}
174
ebbd6f00 175_stg_patches_options ()
8ebae56b 176{
ebbd6f00 177 _complete_patch_range_options "$2" "$(_cmd_options $1)" "$3"
8ebae56b
KH
178}
179
1aaf55c9 180_stg_help ()
8ebae56b 181{
1aaf55c9 182 _complete_options "$_stg_commands"
8ebae56b
KH
183}
184
185_stg ()
186{
187 local i c=1 command
188
189 while [ $c -lt $COMP_CWORD ]; do
190 if [ $c == 1 ]; then
191 command="${COMP_WORDS[c]}"
192 fi
193 c=$((++c))
194 done
195
196 # Complete name of subcommand.
197 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
198 COMPREPLY=($(compgen \
1aaf55c9 199 -W "--help --version copyright help $_stg_commands" \
8ebae56b
KH
200 -- "${COMP_WORDS[COMP_CWORD]}"))
201 return;
202 fi
203
204 # Complete arguments to subcommands.
205 case "$command" in
1aaf55c9
CM
206 # generic commands
207 help) _stg_help ;;
208 # repository commands
ebbd6f00 209 id) _stg_patches $command _all_patches ;;
1aaf55c9 210 # stack commands
ebbd6f00
CM
211 float) _stg_patches $command _all_patches ;;
212 goto) _stg_patches $command _all_other_patches ;;
ca8b854c 213 hide) _stg_patches $command _unapplied_patches ;;
ebbd6f00
CM
214 pop) _stg_patches $command _applied_patches ;;
215 push) _stg_patches $command _unapplied_patches ;;
0aebdb85 216 series) _stg_patches $command _all_patches ;;
6f1c5e3c 217 sink) _stg_patches $command _all_patches ;;
ca8b854c 218 unhide) _stg_patches $command _hidden_patches ;;
1aaf55c9 219 # patch commands
ebbd6f00 220 delete) _stg_patches $command _all_patches ;;
8560c67b 221 export) _stg_patches $command _applied_patches ;;
ebbd6f00
CM
222 files) _stg_patches $command _all_patches ;;
223 log) _stg_patches $command _all_patches ;;
b4f656f0 224 mail) _stg_patches $command _all_patches ;;
ebbd6f00
CM
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 ;;
06848fab 229 sync) _stg_patches $command _applied_patches ;;
ebbd6f00
CM
230 # working-copy commands
231 diff) _stg_patches_options $command _applied_patches "-r --range" ;;
450ae43a
YD
232 # commands that usually raher accept branches
233 branch) _complete_branch $command _all_branches ;;
234 rebase) _complete_branch $command _all_branches ;;
1aaf55c9
CM
235 # all the other commands
236 *) _stg_common $command ;;
8ebae56b
KH
237 esac
238}
239
240complete -o default -F _stg stg