]>
Commit | Line | Data |
---|---|---|
8089c85b PB |
1 | #!/bin/sh |
2 | ||
3 | test_description='prepare-commit-msg hook' | |
4 | ||
5 | . ./test-lib.sh | |
6 | ||
15cd6d3a PW |
7 | test_expect_success 'set up commits for rebasing' ' |
8 | test_commit root && | |
9 | test_commit a a a && | |
10 | test_commit b b b && | |
11 | git checkout -b rebase-me root && | |
12 | test_commit rebase-a a aa && | |
13 | test_commit rebase-b b bb && | |
14 | for i in $(test_seq 1 13) | |
15 | do | |
16 | test_commit rebase-$i c $i | |
17 | done && | |
18 | git checkout master && | |
19 | ||
20 | cat >rebase-todo <<-EOF | |
21 | pick $(git rev-parse rebase-a) | |
22 | pick $(git rev-parse rebase-b) | |
23 | fixup $(git rev-parse rebase-1) | |
24 | fixup $(git rev-parse rebase-2) | |
25 | pick $(git rev-parse rebase-3) | |
26 | fixup $(git rev-parse rebase-4) | |
27 | squash $(git rev-parse rebase-5) | |
28 | reword $(git rev-parse rebase-6) | |
29 | squash $(git rev-parse rebase-7) | |
30 | fixup $(git rev-parse rebase-8) | |
31 | fixup $(git rev-parse rebase-9) | |
32 | edit $(git rev-parse rebase-10) | |
33 | squash $(git rev-parse rebase-11) | |
34 | squash $(git rev-parse rebase-12) | |
35 | edit $(git rev-parse rebase-13) | |
36 | EOF | |
37 | ' | |
38 | ||
8089c85b PB |
39 | test_expect_success 'with no hook' ' |
40 | ||
41 | echo "foo" > file && | |
42 | git add file && | |
43 | git commit -m "first" | |
44 | ||
45 | ' | |
46 | ||
47 | # set up fake editor for interactive editing | |
48 | cat > fake-editor <<'EOF' | |
49 | #!/bin/sh | |
50 | exit 0 | |
51 | EOF | |
52 | chmod +x fake-editor | |
f69e836f BD |
53 | |
54 | ## Not using test_set_editor here so we can easily ensure the editor variable | |
55 | ## is only set for the editor tests | |
8089c85b PB |
56 | FAKE_EDITOR="$(pwd)/fake-editor" |
57 | export FAKE_EDITOR | |
58 | ||
59 | # now install hook that always succeeds and adds a message | |
60 | HOOKDIR="$(git rev-parse --git-dir)/hooks" | |
61 | HOOK="$HOOKDIR/prepare-commit-msg" | |
62 | mkdir -p "$HOOKDIR" | |
462f8caf JK |
63 | echo "#!$SHELL_PATH" > "$HOOK" |
64 | cat >> "$HOOK" <<'EOF' | |
65 | ||
15cd6d3a PW |
66 | GIT_DIR=$(git rev-parse --git-dir) |
67 | if test -d "$GIT_DIR/rebase-merge" | |
68 | then | |
69 | rebasing=1 | |
70 | else | |
71 | rebasing=0 | |
72 | fi | |
73 | ||
74 | get_last_cmd () { | |
75 | tail -n1 "$GIT_DIR/rebase-merge/done" | { | |
76 | read cmd id _ | |
77 | git log --pretty="[$cmd %s]" -n1 $id | |
78 | } | |
79 | } | |
80 | ||
4f8cbf2b PW |
81 | if test "$2" = commit |
82 | then | |
15cd6d3a PW |
83 | if test $rebasing = 1 |
84 | then | |
85 | source="$3" | |
86 | else | |
87 | source=$(git rev-parse "$3") | |
88 | fi | |
8089c85b | 89 | else |
4f8cbf2b | 90 | source=${2-default} |
8089c85b | 91 | fi |
15cd6d3a PW |
92 | test "$GIT_EDITOR" = : && source="$source (no editor)" |
93 | ||
94 | if test $rebasing = 1 | |
4f8cbf2b | 95 | then |
15cd6d3a | 96 | echo "$source $(get_last_cmd)" >"$1" |
8089c85b | 97 | else |
4f8cbf2b | 98 | sed -e "1s/.*/$source/" "$1" >msg.tmp |
15cd6d3a | 99 | mv msg.tmp "$1" |
8089c85b | 100 | fi |
8089c85b PB |
101 | exit 0 |
102 | EOF | |
103 | chmod +x "$HOOK" | |
104 | ||
105 | echo dummy template > "$(git rev-parse --git-dir)/template" | |
106 | ||
107 | test_expect_success 'with hook (-m)' ' | |
108 | ||
109 | echo "more" >> file && | |
110 | git add file && | |
111 | git commit -m "more" && | |
0c923256 | 112 | test "$(git log -1 --pretty=format:%s)" = "message (no editor)" |
8089c85b PB |
113 | |
114 | ' | |
115 | ||
116 | test_expect_success 'with hook (-m editor)' ' | |
117 | ||
118 | echo "more" >> file && | |
119 | git add file && | |
f69e836f | 120 | GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit -e -m "more more" && |
0c923256 | 121 | test "$(git log -1 --pretty=format:%s)" = message |
8089c85b PB |
122 | |
123 | ' | |
124 | ||
125 | test_expect_success 'with hook (-t)' ' | |
126 | ||
127 | echo "more" >> file && | |
128 | git add file && | |
129 | git commit -t "$(git rev-parse --git-dir)/template" && | |
0c923256 | 130 | test "$(git log -1 --pretty=format:%s)" = template |
8089c85b PB |
131 | |
132 | ' | |
133 | ||
134 | test_expect_success 'with hook (-F)' ' | |
135 | ||
136 | echo "more" >> file && | |
137 | git add file && | |
138 | (echo more | git commit -F -) && | |
0c923256 | 139 | test "$(git log -1 --pretty=format:%s)" = "message (no editor)" |
8089c85b PB |
140 | |
141 | ' | |
142 | ||
143 | test_expect_success 'with hook (-F editor)' ' | |
144 | ||
145 | echo "more" >> file && | |
146 | git add file && | |
f69e836f | 147 | (echo more more | GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit -e -F -) && |
0c923256 | 148 | test "$(git log -1 --pretty=format:%s)" = message |
8089c85b PB |
149 | |
150 | ' | |
151 | ||
152 | test_expect_success 'with hook (-C)' ' | |
153 | ||
0c923256 | 154 | head=$(git rev-parse HEAD) && |
8089c85b PB |
155 | echo "more" >> file && |
156 | git add file && | |
157 | git commit -C $head && | |
0c923256 | 158 | test "$(git log -1 --pretty=format:%s)" = "$head (no editor)" |
8089c85b PB |
159 | |
160 | ' | |
161 | ||
162 | test_expect_success 'with hook (editor)' ' | |
163 | ||
164 | echo "more more" >> file && | |
165 | git add file && | |
f69e836f | 166 | GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit && |
0c923256 | 167 | test "$(git log -1 --pretty=format:%s)" = default |
8089c85b PB |
168 | |
169 | ' | |
170 | ||
171 | test_expect_success 'with hook (--amend)' ' | |
172 | ||
0c923256 | 173 | head=$(git rev-parse HEAD) && |
8089c85b PB |
174 | echo "more" >> file && |
175 | git add file && | |
f69e836f | 176 | GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit --amend && |
0c923256 | 177 | test "$(git log -1 --pretty=format:%s)" = "$head" |
8089c85b PB |
178 | |
179 | ' | |
180 | ||
181 | test_expect_success 'with hook (-c)' ' | |
182 | ||
0c923256 | 183 | head=$(git rev-parse HEAD) && |
8089c85b PB |
184 | echo "more" >> file && |
185 | git add file && | |
f69e836f | 186 | GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit -c $head && |
0c923256 | 187 | test "$(git log -1 --pretty=format:%s)" = "$head" |
8089c85b PB |
188 | |
189 | ' | |
190 | ||
65969d43 JS |
191 | test_expect_success 'with hook (merge)' ' |
192 | ||
1fc4f97d BP |
193 | test_when_finished "git checkout -f master" && |
194 | git checkout -B other HEAD@{1} && | |
195 | echo "more" >>file && | |
196 | git add file && | |
197 | git commit -m other && | |
198 | git checkout - && | |
199 | git merge --no-ff other && | |
0c923256 | 200 | test "$(git log -1 --pretty=format:%s)" = "merge (no editor)" |
1fc4f97d BP |
201 | ' |
202 | ||
203 | test_expect_success 'with hook and editor (merge)' ' | |
204 | ||
205 | test_when_finished "git checkout -f master" && | |
206 | git checkout -B other HEAD@{1} && | |
207 | echo "more" >>file && | |
65969d43 JS |
208 | git add file && |
209 | git commit -m other && | |
210 | git checkout - && | |
1fc4f97d | 211 | env GIT_EDITOR="\"\$FAKE_EDITOR\"" git merge --no-ff -e other && |
0c923256 | 212 | test "$(git log -1 --pretty=format:%s)" = "merge" |
65969d43 JS |
213 | ' |
214 | ||
15cd6d3a PW |
215 | test_rebase () { |
216 | expect=$1 && | |
217 | mode=$2 && | |
218 | test_expect_$expect C_LOCALE_OUTPUT "with hook (rebase $mode)" ' | |
219 | test_when_finished "\ | |
220 | git rebase --abort | |
221 | git checkout -f master | |
222 | git branch -D tmp" && | |
223 | git checkout -b tmp rebase-me && | |
224 | GIT_SEQUENCE_EDITOR="cp rebase-todo" && | |
225 | GIT_EDITOR="\"$FAKE_EDITOR\"" && | |
226 | ( | |
227 | export GIT_SEQUENCE_EDITOR GIT_EDITOR && | |
228 | test_must_fail git rebase $mode b && | |
229 | echo x >a && | |
230 | git add a && | |
231 | test_must_fail git rebase --continue && | |
232 | echo x >b && | |
233 | git add b && | |
234 | git commit && | |
235 | git rebase --continue && | |
236 | echo y >a && | |
237 | git add a && | |
238 | git commit && | |
239 | git rebase --continue && | |
240 | echo y >b && | |
241 | git add b && | |
242 | git rebase --continue | |
243 | ) && | |
244 | if test $mode = -p # reword amended after pick | |
245 | then | |
246 | n=18 | |
247 | else | |
248 | n=17 | |
249 | fi && | |
250 | git log --pretty=%s -g -n$n HEAD@{1} >actual && | |
251 | test_cmp "$TEST_DIRECTORY/t7505/expected-rebase$mode" actual | |
252 | ' | |
253 | } | |
254 | ||
66618a50 | 255 | test_rebase success -i |
11aad464 | 256 | test_have_prereq !REBASE_P || test_rebase success -p |
15cd6d3a | 257 | |
66618a50 | 258 | test_expect_success 'with hook (cherry-pick)' ' |
15cd6d3a PW |
259 | test_when_finished "git checkout -f master" && |
260 | git checkout -B other b && | |
261 | git cherry-pick rebase-1 && | |
262 | test "$(git log -1 --pretty=format:%s)" = "message (no editor)" | |
263 | ' | |
264 | ||
265 | test_expect_success 'with hook and editor (cherry-pick)' ' | |
266 | test_when_finished "git checkout -f master" && | |
267 | git checkout -B other b && | |
268 | git cherry-pick -e rebase-1 && | |
269 | test "$(git log -1 --pretty=format:%s)" = merge | |
270 | ' | |
271 | ||
8089c85b PB |
272 | cat > "$HOOK" <<'EOF' |
273 | #!/bin/sh | |
274 | exit 1 | |
275 | EOF | |
276 | ||
277 | test_expect_success 'with failing hook' ' | |
278 | ||
1fc4f97d | 279 | test_when_finished "git checkout -f master" && |
0c923256 | 280 | head=$(git rev-parse HEAD) && |
8089c85b PB |
281 | echo "more" >> file && |
282 | git add file && | |
b7ae1414 | 283 | test_must_fail env GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit -c $head |
8089c85b PB |
284 | |
285 | ' | |
286 | ||
287 | test_expect_success 'with failing hook (--no-verify)' ' | |
288 | ||
1fc4f97d | 289 | test_when_finished "git checkout -f master" && |
0c923256 | 290 | head=$(git rev-parse HEAD) && |
8089c85b PB |
291 | echo "more" >> file && |
292 | git add file && | |
b7ae1414 | 293 | test_must_fail env GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit --no-verify -c $head |
8089c85b PB |
294 | |
295 | ' | |
296 | ||
3e4141d0 AP |
297 | test_expect_success 'with failing hook (merge)' ' |
298 | ||
1fc4f97d | 299 | test_when_finished "git checkout -f master" && |
3e4141d0 AP |
300 | git checkout -B other HEAD@{1} && |
301 | echo "more" >> file && | |
302 | git add file && | |
303 | rm -f "$HOOK" && | |
304 | git commit -m other && | |
3219bad9 | 305 | write_script "$HOOK" <<-EOF && |
3e4141d0 AP |
306 | exit 1 |
307 | EOF | |
308 | git checkout - && | |
1fc4f97d | 309 | test_must_fail git merge --no-ff other |
3e4141d0 AP |
310 | |
311 | ' | |
8089c85b | 312 | |
66618a50 | 313 | test_expect_success C_LOCALE_OUTPUT 'with failing hook (cherry-pick)' ' |
15cd6d3a PW |
314 | test_when_finished "git checkout -f master" && |
315 | git checkout -B other b && | |
316 | test_must_fail git cherry-pick rebase-1 2>actual && | |
317 | test $(grep -c prepare-commit-msg actual) = 1 | |
318 | ' | |
319 | ||
8089c85b | 320 | test_done |