forked from nvie/gitflow
-
Notifications
You must be signed in to change notification settings - Fork 2
/
git-flow-feature
183 lines (158 loc) · 4.46 KB
/
git-flow-feature
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#
# git-flow -- A collection of Git extensions to provide high-level
# repository operations for Vincent Driessen's branching model.
#
# Original blog post presenting this model is found at:
# http://nvie.com/archives/323
#
# Feel free to contribute to this project at:
# http://github.com/nvie/gitflow
#
# Copyright (c) 2010 by Vincent Driessen
# Copyright (c) 2010 by Benedikt Böhm
#
usage() {
echo "usage: git flow feature [list]"
echo " git flow feature start <name> [<base>]"
echo " git flow feature finish <name> [<base>]"
echo " git flow feature publish <name>"
echo " git flow feature track <name>"
echo " git flow feature diff <name>"
# TODO
#echo ""
#echo "options:"
#echo "--option Explanation"
#echo ""
#echo "start-only options:"
#echo "--option Explanation"
#echo ""
#echo "finish-only options:"
#echo "--rebase Rebases the feature branch on top of develop, instead of merging"
#echo "--squash Squashes all commits of the feature branch into a single commit"
#echo " on develop"
#echo "--push Push to the origin repo when finished"
}
# setup will always be called before the actual cmd_* functions
setup() {
PREFIX=$(git config --get gitflow.prefix.feature || echo feature/)
}
cmd_default() {
cmd_list "$@"
}
cmd_list() {
FEATURE_BRANCHES="$(echo "$LOCAL_BRANCHES" | grep "^$PREFIX")"
if [ -z "$FEATURE_BRANCHES" ]; then
warn "No feature branches exist."
exit 0
fi
echo "$FEATURE_BRANCHES" | sed "s?^$PREFIX??g"
}
cmd_help() {
usage
exit 0
}
parse_args() {
NAME="$1"
BASE="${2:-$DEVELOP_BRANCH}"
if [ "$NAME" = "" ]; then
echo "Missing argument <name>."
usage
exit 1
fi
PREFIX=$(git config --get gitflow.prefix.feature || echo feature/)
BRANCH=$PREFIX$NAME
}
cmd_start() {
parse_args "$@"
# sanity checks
gitflow_check_clean_working_tree
gitflow_require_branch_absent $BRANCH
if [ "$BASE" = "$DEVELOP_BRANCH" ]; then
git fetch -q $ORIGIN $DEVELOP_BRANCH
gitflow_require_branches_equal $DEVELOP_BRANCH $ORIGIN/$DEVELOP_BRANCH
fi
# create branch
git checkout -b $BRANCH $BASE
echo
echo "Summary of actions:"
echo "- A new branch '$BRANCH' was created, based on '$BASE'"
echo "- You are now on branch '$BRANCH'"
echo ""
echo "Now, start committing on your feature. When done, use:"
echo ""
echo " git flow finish feature $NAME"
echo
}
cmd_finish() {
parse_args "$@"
# sanity checks
gitflow_check_clean_working_tree
gitflow_require_branch $BRANCH
git fetch -q $ORIGIN
if has $ORIGIN/$BRANCH $REMOTE_BRANCHES; then
gitflow_require_branches_equal $BRANCH $ORIGIN/$BRANCH
fi
if [ "$BASE" = "$DEVELOP_BRANCH" ]; then
gitflow_require_branches_equal $DEVELOP_BRANCH $ORIGIN/$DEVELOP_BRANCH
fi
# merge into BASE
git checkout $BASE
if [ "$(git rev-list -n2 $BASE..$BRANCH | wc -l)" = "1" ]; then
git merge --ff $BRANCH
else
git merge --no-ff $BRANCH
fi
# delete branch
# TODO: How do we handle merge conflicts here??
git push $ORIGIN :refs/heads/$BRANCH
git branch -d $BRANCH
echo
echo "Summary of actions:"
echo "- The feature branch '$BRANCH' was merged into '$BASE'"
#echo "- Merge conflicts were resolved" # TODO: Add this line when it's supported
echo "- Feature branch '$BRANCH' has been removed"
echo "- You are now on branch '$BASE'"
echo
}
cmd_publish() {
parse_args "$@"
# sanity checks
gitflow_check_clean_working_tree
gitflow_require_branch $BRANCH
git fetch -q $ORIGIN
gitflow_require_branch_absent $ORIGIN/$BRANCH
# create remote branch
git push $ORIGIN $BRANCH:refs/heads/$BRANCH
git fetch -q $ORIGIN
# configure remote tracking
git config branch.$BRANCH.remote $ORIGIN
git config branch.$BRANCH.merge refs/heads/$BRANCH
git checkout $BRANCH
echo
echo "Summary of actions:"
echo "- A new remote branch '$BRANCH' was created"
echo "- The local branch '$BRANCH' was configured to track the remote branch"
echo "- You are now on branch '$BRANCH'"
echo
}
cmd_track() {
parse_args "$@"
# sanity checks
gitflow_check_clean_working_tree
gitflow_require_branch_absent $BRANCH
git fetch -q $ORIGIN
gitflow_require_branch $ORIGIN/$BRANCH
# create tracking branch
git checkout -b $BRANCH $ORIGIN/$BRANCH
echo
echo "Summary of actions:"
echo "- A new remote tracking branch '$BRANCH' was created"
echo "- You are now on branch '$BRANCH'"
echo
}
cmd_diff() {
parse_args "$@"
# TODO: if this feature has been based on a non-develop branch, we really
# should not be comparing to $DEVELOP. How to deal with this?
git diff $DEVELOP..$BRANCH
}