blob: 8049801bbc67338df65e944545b38333b119e435 [file] [log] [blame]
Justin Hilemanc5b58412010-04-26 13:06:11 -04001#!bash
2#
Justin Hilemanfd37e372010-04-26 13:30:18 -04003# git-flow-completion
4# ===================
5#
Justin Hileman1a6cd162010-04-26 13:31:08 -04006# Bash completion support for [git-flow](http://github.com/nvie/gitflow)
Justin Hilemanfd37e372010-04-26 13:30:18 -04007#
Justin Hilemanc5b58412010-04-26 13:06:11 -04008# The contained completion routines provide support for completing:
Justin Hilemanfd37e372010-04-26 13:30:18 -04009#
Justin Hilemanc5b58412010-04-26 13:06:11 -040010# * git-flow init and version
11# * feature, hotfix and release branches
12# * remote feature branch names (for `git-flow feature track`)
Justin Hilemanfd37e372010-04-26 13:30:18 -040013#
14#
15# Installation
16# ------------
17#
Justin Hilemanb20e97a2010-04-26 13:12:01 -040018# To achieve git-flow completion nirvana:
Justin Hilemanfd37e372010-04-26 13:30:18 -040019#
Justin Hilemanb20e97a2010-04-26 13:12:01 -040020# 0. Install git-completion.
Justin Hilemanfd37e372010-04-26 13:30:18 -040021#
Justin Hilemanb20e97a2010-04-26 13:12:01 -040022# 1. Install this file. Either:
Justin Hilemanfd37e372010-04-26 13:30:18 -040023#
Justin Hilemanb20e97a2010-04-26 13:12:01 -040024# a. Place it in a `bash-completion.d` folder:
Justin Hilemanfd37e372010-04-26 13:30:18 -040025#
Justin Hilemanb20e97a2010-04-26 13:12:01 -040026# * /etc/bash-completion.d
27# * /usr/local/etc/bash-completion.d
28# * ~/bash-completion.d
Justin Hilemanfd37e372010-04-26 13:30:18 -040029#
Justin Hilemanb20e97a2010-04-26 13:12:01 -040030# b. Or, copy it somewhere (e.g. ~/.git-flow-completion.sh) and put the following line in
31# your .bashrc:
Justin Hilemanfd37e372010-04-26 13:30:18 -040032#
Justin Hilemanb20e97a2010-04-26 13:12:01 -040033# source ~/.git-flow-completion.sh
Justin Hilemanfd37e372010-04-26 13:30:18 -040034#
Justin Hileman3e77edb2010-08-05 13:40:10 -040035# 2. If you are using Git < 1.7.1: Edit git-completion.sh and add the following line to the giant
Justin Hilemand0173602010-08-05 13:18:12 -040036# $command case in _git:
Justin Hilemanfd37e372010-04-26 13:30:18 -040037#
38# flow) _git_flow ;;
39#
40#
Justin Hilemanfd37e372010-04-26 13:30:18 -040041# The Fine Print
42# --------------
43#
44# Copyright (c) 2010 [Justin Hileman](http://justinhileman.com)
45#
46# Distributed under the [MIT License](http://creativecommons.org/licenses/MIT/)
Justin Hilemanc5b58412010-04-26 13:06:11 -040047
48_git_flow ()
49{
Justin Hilemanfad617d2010-04-26 17:33:11 -040050 local subcommands="init feature release hotfix"
Justin Hileman91843f82010-10-05 20:04:28 -040051 local subcommand="$(__git_find_on_cmdline "$subcommands")"
Justin Hilemanc5b58412010-04-26 13:06:11 -040052 if [ -z "$subcommand" ]; then
53 __gitcomp "$subcommands"
54 return
55 fi
56
57 case "$subcommand" in
58 feature)
59 __git_flow_feature
60 return
61 ;;
62 release)
63 __git_flow_release
64 return
65 ;;
66 hotfix)
67 __git_flow_hotfix
68 return
69 ;;
70 *)
71 COMPREPLY=()
72 ;;
73 esac
74}
75
76__git_flow_feature ()
77{
Justin Hileman522c0262010-08-05 13:54:02 -040078 local subcommands="list start finish publish track diff rebase checkout pull"
Justin Hileman91843f82010-10-05 20:04:28 -040079 local subcommand="$(__git_find_on_cmdline "$subcommands")"
Justin Hilemanc5b58412010-04-26 13:06:11 -040080 if [ -z "$subcommand" ]; then
81 __gitcomp "$subcommands"
82 return
83 fi
84
85 case "$subcommand" in
Justin Hileman522c0262010-08-05 13:54:02 -040086 pull)
87 __gitcomp "$(__git_remotes)"
88 return
89 ;;
90 checkout|finish|diff|rebase)
Justin Hilemanc5b58412010-04-26 13:06:11 -040091 __gitcomp "$(__git_flow_list_features)"
92 return
93 ;;
Justin Hileman522c0262010-08-05 13:54:02 -040094 publish)
95 __gitcomp "$(comm -23 <(__git_flow_list_features) <(__git_flow_list_remote_features))"
96 return
97 ;;
Justin Hilemanc5b58412010-04-26 13:06:11 -040098 track)
99 __gitcomp "$(__git_flow_list_remote_features)"
100 return
101 ;;
102 *)
103 COMPREPLY=()
104 ;;
105 esac
106}
107
108__git_flow_list_features ()
109{
Justin Hileman763f0f92010-08-05 13:24:36 -0400110 git flow feature list 2> /dev/null | tr -d ' |*'
Justin Hilemanc5b58412010-04-26 13:06:11 -0400111}
112
113__git_flow_list_remote_features ()
114{
Justin Hileman289fb032010-09-27 21:42:16 -0400115 git branch -r 2> /dev/null | grep "origin/$(__git_flow_feature_prefix)" | awk '{ sub(/^origin\/$(__git_flow_feature_prefix)/, "", $1); print }'
116}
117
118__git_flow_feature_prefix ()
119{
120 git config gitflow.prefix.feature 2> /dev/null || echo "feature/"
Justin Hilemanc5b58412010-04-26 13:06:11 -0400121}
122
123__git_flow_release ()
124{
125 local subcommands="list start finish"
Justin Hileman91843f82010-10-05 20:04:28 -0400126 local subcommand="$(__git_find_on_cmdline "$subcommands")"
Justin Hilemanc5b58412010-04-26 13:06:11 -0400127 if [ -z "$subcommand" ]; then
128 __gitcomp "$subcommands"
129 return
130 fi
131
132 case "$subcommand" in
133 finish)
134 __gitcomp "$(__git_flow_list_releases)"
135 return
136 ;;
137 *)
138 COMPREPLY=()
139 ;;
140 esac
141
142}
143
144__git_flow_list_releases ()
145{
Justin Hileman91891872010-04-26 17:30:53 -0400146 git flow release list 2> /dev/null
Justin Hilemanc5b58412010-04-26 13:06:11 -0400147}
148
149__git_flow_hotfix ()
150{
151 local subcommands="list start finish"
Justin Hileman91843f82010-10-05 20:04:28 -0400152 local subcommand="$(__git_find_on_cmdline "$subcommands")"
Justin Hilemanc5b58412010-04-26 13:06:11 -0400153 if [ -z "$subcommand" ]; then
154 __gitcomp "$subcommands"
155 return
156 fi
157
158 case "$subcommand" in
159 finish)
160 __gitcomp "$(__git_flow_list_hotfixes)"
161 return
162 ;;
163 *)
164 COMPREPLY=()
165 ;;
166 esac
167}
168
169__git_flow_list_hotfixes ()
170{
Justin Hileman91891872010-04-26 17:30:53 -0400171 git flow hotfix list 2> /dev/null
Justin Hilemanf144b1a2010-07-20 17:14:58 -0400172}
173
Justin Hileman91843f82010-10-05 20:04:28 -0400174# alias __git_find_on_cmdline for backwards compatibility
175if [ -z "`type -t __git_find_on_cmdline`" ]; then
176 alias __git_find_on_cmdline=__git_find_subcommand
177fi