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