chiark / gitweb /
d0d716c292e0e82bb1b8db1b54c5072e94d3ec38
[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     export
24     files
25     float
26     fold
27     goto
28     id
29     import
30     init
31     log
32     mail
33     new
34     patches
35     pick
36     pop
37     pull
38     push
39     rebase
40     refresh
41     rename
42     resolved
43     rm
44     series
45     show
46     status
47     sync
48     top
49     unapplied
50     uncommit
51 "
52
53 # The path to .git, or empty if we're not in a repository.
54 _gitdir ()
55 {
56     echo "$(git rev-parse --git-dir 2>/dev/null)"
57 }
58
59 # Name of the current branch, or empty if there isn't one.
60 _current_branch ()
61 {
62     local b=$(git symbolic-ref HEAD 2>/dev/null)
63     echo ${b#refs/heads/}
64 }
65
66 # List of all applied patches.
67 _applied_patches ()
68 {
69     local g=$(_gitdir)
70     [ "$g" ] && cat "$g/patches/$(_current_branch)/applied"
71 }
72
73 # List of all unapplied patches.
74 _unapplied_patches ()
75 {
76     local g=$(_gitdir)
77     [ "$g" ] && cat "$g/patches/$(_current_branch)/unapplied"
78 }
79
80 # List of all patches.
81 _all_patches ()
82 {
83     local b=$(_current_branch)
84     local g=$(_gitdir)
85     [ "$g" ] && cat "$g/patches/$b/applied" "$g/patches/$b/unapplied"
86 }
87
88 # List of all patches except the current patch.
89 _all_other_patches ()
90 {
91     local b=$(_current_branch)
92     local g=$(_gitdir)
93     [ "$g" ] && cat "$g/patches/$b/applied" "$g/patches/$b/unapplied" \
94         | grep -v "^$(cat $g/patches/$b/current 2> /dev/null)$"
95 }
96
97 # List the command options
98 _cmd_options ()
99 {
100     stg $1 --help | grep -e " --[A-Za-z]" | sed -e "s/.*\(--[^ =]\+\).*/\1/"
101 }
102
103 # Generate completions for patches and patch ranges from the given
104 # patch list function, and options from the given list.
105 _complete_patch_range ()
106 {
107     local patchlist="$1" options="$2"
108     local pfx cur="${COMP_WORDS[COMP_CWORD]}"
109     case "$cur" in
110         *..*)
111             pfx="${cur%..*}.."
112             cur="${cur#*..}"
113             COMPREPLY=($(compgen -P "$pfx" -W "$($patchlist)" -- "$cur"))
114             ;;
115         *)
116             COMPREPLY=($(compgen -W "$options $($patchlist)" -- "$cur"))
117             ;;
118     esac
119 }
120
121 _complete_patch_range_options ()
122 {
123     local patchlist="$1" options="$2" patch_options="$3"
124     local prev="${COMP_WORDS[COMP_CWORD-1]}"
125     local cur="${COMP_WORDS[COMP_CWORD]}"
126     local popt
127     for popt in $patch_options; do
128         if [ $prev == $popt ]; then
129             _complete_patch_range $patchlist
130             return
131         fi
132     done
133     COMPREPLY=($(compgen -W "$options" -- "$cur"))
134 }
135
136 # Generate completions for options from the given list.
137 _complete_options ()
138 {
139     local options="$1"
140     COMPREPLY=($(compgen -W "$options" -- "${COMP_WORDS[COMP_CWORD]}"))
141 }
142
143 _stg_common ()
144 {
145     _complete_options "$(_cmd_options $1)"
146 }
147
148 _stg_patches ()
149 {
150     _complete_patch_range "$2" "$(_cmd_options $1)"
151 }
152
153 _stg_patches_options ()
154 {
155     _complete_patch_range_options "$2" "$(_cmd_options $1)" "$3"
156 }
157
158 _stg_help ()
159 {
160     _complete_options "$_stg_commands"
161 }
162
163 _stg ()
164 {
165     local i c=1 command
166
167     while [ $c -lt $COMP_CWORD ]; do
168         if [ $c == 1 ]; then
169             command="${COMP_WORDS[c]}"
170         fi
171         c=$((++c))
172     done
173
174     # Complete name of subcommand.
175     if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
176         COMPREPLY=($(compgen \
177             -W "--help --version copyright help $_stg_commands" \
178             -- "${COMP_WORDS[COMP_CWORD]}"))
179         return;
180     fi
181
182     # Complete arguments to subcommands.
183     case "$command" in
184         # generic commands
185         help)   _stg_help ;;
186         # repository commands
187         id)     _stg_patches $command _all_patches ;;
188         # stack commands
189         float)  _stg_patches $command _all_patches ;;
190         goto)   _stg_patches $command _all_other_patches ;;
191         pop)    _stg_patches $command _applied_patches ;;
192         push)   _stg_patches $command _unapplied_patches ;;
193         # patch commands
194         delete) _stg_patches $command _all_patches ;;
195         export) _stg_patches $command _applied_patches ;;
196         files)  _stg_patches $command _all_patches ;;
197         log)    _stg_patches $command _all_patches ;;
198         mail)   _stg_patches $command _all_patches ;;
199         pick)   _stg_patches $command _unapplied_patches ;;
200         refresh)_stg_patches_options $command _applied_patches "-p --patch" ;;
201         rename) _stg_patches $command _all_patches ;;
202         show)   _stg_patches $command _all_patches ;;
203         sync)   _stg_patches $command _applied_patches ;;
204         # working-copy commands
205         diff)   _stg_patches_options $command _applied_patches "-r --range" ;;
206         # all the other commands
207         *)      _stg_common $command ;;
208     esac
209 }
210
211 complete -o default -F _stg stg