git-hubflow.plugin.zsh
9807 bytes
1alias ghf='git hf'
2alias ghff='git hf feature'
3alias ghfr='git hf release'
4alias ghfh='git hf hotfix'
5alias ghfs='git hf support'
6alias ghfu='git hf update'
7
8_git-hf ()
9{
10 local curcontext="$curcontext" state line
11 typeset -A opt_args
12
13 _arguments -C \
14 ':command:->command' \
15 '*::options:->options'
16
17 case $state in
18 (command)
19
20 local -a subcommands
21 subcommands=(
22 'init:Initialize a new git repo with support for the branching model.'
23 'feature:Manage your feature branches.'
24 'release:Manage your release branches.'
25 'hotfix:Manage your hotfix branches.'
26 'support:Manage your support branches.'
27 'update:Pull upstream changes down into your master and develop branches.'
28 'version:Shows version information.'
29 )
30 _describe -t commands 'git hf' subcommands
31 ;;
32
33 (options)
34 case $line[1] in
35
36 (init)
37 _arguments \
38 -f'[Force setting of gitflow branches, even if already configured]'
39 ;;
40
41 (version)
42 ;;
43
44 (hotfix)
45 __git-hf-hotfix
46 ;;
47
48 (release)
49 __git-hf-release
50 ;;
51
52 (feature)
53 __git-hf-feature
54 ;;
55 esac
56 ;;
57 esac
58}
59
60__git-hf-release ()
61{
62 local curcontext="$curcontext" state line
63 typeset -A opt_args
64
65 _arguments -C \
66 ':command:->command' \
67 '*::options:->options'
68
69 case $state in
70 (command)
71
72 local -a subcommands
73 subcommands=(
74 'start:Start a new release branch.'
75 'finish:Finish a release branch.'
76 'list:List all your release branches. (Alias to `git hf release`)'
77 'cancel:Cancel release'
78 'push:Push release to GitHub'
79 'pull:Pull release from GitHub'
80 'track:Track release'
81 )
82 _describe -t commands 'git hf release' subcommands
83 _arguments \
84 -v'[Verbose (more) output]'
85 ;;
86
87 (options)
88 case $line[1] in
89
90 (start)
91 _arguments \
92 -F'[Fetch from origin before performing finish]'\
93 ':version:__git_hf_version_list'
94 ;;
95
96 (finish)
97 _arguments \
98 -F'[Fetch from origin before performing finish]' \
99 -s'[Sign the release tag cryptographically]'\
100 -u'[Use the given GPG-key for the digital signature (implies -s)]'\
101 -m'[Use the given tag message]'\
102 -p'[Push to $ORIGIN after performing finish]'\
103 -k'[Keep branch after performing finish]'\
104 -n"[Don't tag this release]"\
105 ':version:__git_hf_version_list'
106 ;;
107
108 *)
109 _arguments \
110 -v'[Verbose (more) output]'
111 ;;
112 esac
113 ;;
114 esac
115}
116
117__git-hf-hotfix ()
118{
119 local curcontext="$curcontext" state line
120 typeset -A opt_args
121
122 _arguments -C \
123 ':command:->command' \
124 '*::options:->options'
125
126 case $state in
127 (command)
128
129 local -a subcommands
130 subcommands=(
131 'start:Start a new hotfix branch.'
132 'finish:Finish a hotfix branch.'
133 'list:List all your hotfix branches. (Alias to `git hf hotfix`)'
134 'publish:Publish the hotfix branch.'
135 'track:Track the hotfix branch.'
136 'pull:Pull the hotfix from GitHub.'
137 'push:Push the hotfix to GitHub.'
138 'cancel:Cancel the hotfix.'
139 )
140 _describe -t commands 'git hf hotfix' subcommands
141 _arguments \
142 -v'[Verbose (more) output]'
143 ;;
144
145 (options)
146 case $line[1] in
147
148 (start)
149 _arguments \
150 -F'[Fetch from origin before performing finish]'\
151 ':hotfix:__git_hf_version_list'\
152 ':branch-name:__git_branch_names'
153 ;;
154
155 (finish)
156 _arguments \
157 -F'[Fetch from origin before performing finish]' \
158 -s'[Sign the release tag cryptographically]'\
159 -u'[Use the given GPG-key for the digital signature (implies -s)]'\
160 -m'[Use the given tag message]'\
161 -p'[Push to $ORIGIN after performing finish]'\
162 -k'[Keep branch after performing finish]'\
163 -n"[Don't tag this release]"\
164 ':hotfix:__git_hf_hotfix_list'
165 ;;
166
167 *)
168 _arguments \
169 -v'[Verbose (more) output]'
170 ;;
171 esac
172 ;;
173 esac
174}
175
176__git-hf-feature ()
177{
178 local curcontext="$curcontext" state line
179 typeset -A opt_args
180
181 _arguments -C \
182 ':command:->command' \
183 '*::options:->options'
184
185 case $state in
186 (command)
187
188 local -a subcommands
189 subcommands=(
190 'list:List all your feature branches. (Alias to `git hf feature`)'
191 'start:Start a new feature branch'
192 'finish:Finish a feature branch'
193 'submit:submit'
194 'track:track'
195 'diff:Diff'
196 'rebase:Rebase feature branch against develop'
197 'checkout:Checkout feature'
198 'pull:Pull feature branch from GitHub'
199 'push:Push feature branch to GitHub'
200 'cancel:Cancel feature'
201 )
202 _describe -t commands 'git hf feature' subcommands
203 _arguments \
204 -v'[Verbose (more) output]'
205 ;;
206
207 (options)
208 case $line[1] in
209
210 (start)
211 _arguments \
212 -F'[Fetch from origin before performing finish]'\
213 ':feature:__git_hf_feature_list'\
214 ':branch-name:__git_branch_names'
215 ;;
216
217 (finish)
218 _arguments \
219 -F'[Fetch from origin before performing finish]' \
220 -r'[Rebase instead of merge]'\
221 ':feature:__git_hf_feature_list'
222 ;;
223
224 (publish)
225 _arguments \
226 ':feature:__git_hf_feature_list'\
227 ;;
228
229 (track)
230 _arguments \
231 ':feature:__git_hf_feature_list'\
232 ;;
233
234 (diff)
235 _arguments \
236 ':branch:__git_branch_names'\
237 ;;
238
239 (rebase)
240 _arguments \
241 -i'[Do an interactive rebase]' \
242 ':branch:__git_branch_names'
243 ;;
244
245 (checkout)
246 _arguments \
247 ':branch:__git_hf_feature_list'\
248 ;;
249
250 (pull)
251 _arguments \
252 ':remote:__git_remotes'\
253 ':branch:__git_branch_names'
254 ;;
255
256 *)
257 _arguments \
258 -v'[Verbose (more) output]'
259 ;;
260 esac
261 ;;
262 esac
263}
264
265__git_hf_version_list ()
266{
267 local expl
268 declare -a versions
269
270 versions=(${${(f)"$(_call_program versions git hf release list 2> /dev/null | tr -d ' |*')"}})
271 __git_command_successful || return
272
273 _wanted versions expl 'version' compadd $versions
274}
275
276__git_hf_feature_list ()
277{
278 local expl
279 declare -a features
280
281 features=(${${(f)"$(_call_program features git hf feature list 2> /dev/null | tr -d ' |*')"}})
282 __git_command_successful || return
283
284 _wanted features expl 'feature' compadd $features
285}
286
287__git_remotes () {
288 local expl gitdir remotes
289
290 gitdir=$(_call_program gitdir git rev-parse --git-dir 2>/dev/null)
291 __git_command_successful || return
292
293 remotes=(${${(f)"$(_call_program remotes git config --get-regexp '"^remote\..*\.url$"')"}//#(#b)remote.(*).url */$match[1]})
294 __git_command_successful || return
295
296 # TODO: Should combine the two instead of either or.
297 if (( $#remotes > 0 )); then
298 _wanted remotes expl remote compadd $* - $remotes
299 else
300 _wanted remotes expl remote _files $* - -W "($gitdir/remotes)" -g "$gitdir/remotes/*"
301 fi
302}
303
304__git_hf_hotfix_list ()
305{
306 local expl
307 declare -a hotfixes
308
309 hotfixes=(${${(f)"$(_call_program hotfixes git hf hotfix list 2> /dev/null | tr -d ' |*')"}})
310 __git_command_successful || return
311
312 _wanted hotfixes expl 'hotfix' compadd $hotfixes
313}
314
315__git_branch_names () {
316 local expl
317 declare -a branch_names
318
319 branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads 2>/dev/null)"}#refs/heads/})
320 __git_command_successful || return
321
322 _wanted branch-names expl branch-name compadd $* - $branch_names
323}
324
325__git_command_successful () {
326 if (( ${#pipestatus:#0} > 0 )); then
327 _message 'not a git repository'
328 return 1
329 fi
330 return 0
331}
332
333zstyle ':completion:*:*:git:*' user-commands flow:'description for foo'