]> git.ipfire.org Git - thirdparty/git.git/blame - t/t7500-commit-template-squash-signoff.sh
The fifteenth batch
[thirdparty/git.git] / t / t7500-commit-template-squash-signoff.sh
CommitLineData
d1cc130a
SG
1#!/bin/sh
2#
3# Copyright (c) 2007 Steven Grimm
4#
5
47a528ad 6test_description='git commit
d1cc130a 7
ea6cff84 8Tests for template, signoff, squash and -F functions.'
d1cc130a
SG
9
10. ./test-lib.sh
11
3d1bda6b
CM
12. "$TEST_DIRECTORY"/lib-rebase.sh
13
d1cc130a 14commit_msg_is () {
d5a719e4
ÆAB
15 expect=commit_msg_is.expect
16 actual=commit_msg_is.actual
17
f66d000b
AP
18 printf "%s" "$(git log --pretty=format:%s%b -1)" >"$actual" &&
19 printf "%s" "$1" >"$expect" &&
1108cea7 20 test_cmp "$expect" "$actual"
d1cc130a
SG
21}
22
23# A sanity check to see if commit is working at all.
24test_expect_success 'a basic commit in an empty tree should succeed' '
25 echo content > foo &&
26 git add foo &&
27 git commit -m "initial commit"
28'
29
30test_expect_success 'nonexistent template file should return error' '
31 echo changes >> foo &&
32 git add foo &&
2140b140
JN
33 (
34 GIT_EDITOR="echo hello >\"\$1\"" &&
35 export GIT_EDITOR &&
36 test_must_fail git commit --template "$PWD"/notexist
37 )
d1cc130a
SG
38'
39
40test_expect_success 'nonexistent template file in config should return error' '
22179b30 41 test_config commit.template "$PWD"/notexist &&
2140b140
JN
42 (
43 GIT_EDITOR="echo hello >\"\$1\"" &&
44 export GIT_EDITOR &&
45 test_must_fail git commit
46 )
d1cc130a
SG
47'
48
49# From now on we'll use a template file that exists.
50TEMPLATE="$PWD"/template
51
52test_expect_success 'unedited template should not commit' '
53 echo "template line" > "$TEMPLATE" &&
d492b31c 54 test_must_fail git commit --template "$TEMPLATE"
d1cc130a
SG
55'
56
57test_expect_success 'unedited template with comments should not commit' '
58 echo "# comment in template" >> "$TEMPLATE" &&
d492b31c 59 test_must_fail git commit --template "$TEMPLATE"
d1cc130a
SG
60'
61
62test_expect_success 'a Signed-off-by line by itself should not commit' '
bfdbee98
JH
63 (
64 test_set_editor "$TEST_DIRECTORY"/t7500/add-signed-off &&
65 test_must_fail git commit --template "$TEMPLATE"
66 )
d1cc130a
SG
67'
68
69test_expect_success 'adding comments to a template should not commit' '
bfdbee98
JH
70 (
71 test_set_editor "$TEST_DIRECTORY"/t7500/add-comments &&
72 test_must_fail git commit --template "$TEMPLATE"
73 )
d1cc130a
SG
74'
75
29853c82 76test_expect_success 'adding real content to a template should commit' '
bfdbee98
JH
77 (
78 test_set_editor "$TEST_DIRECTORY"/t7500/add-content &&
79 git commit --template "$TEMPLATE"
80 ) &&
d1cc130a
SG
81 commit_msg_is "template linecommit message"
82'
83
29853c82 84test_expect_success '-t option should be short for --template' '
d1cc130a
SG
85 echo "short template" > "$TEMPLATE" &&
86 echo "new content" >> foo &&
87 git add foo &&
bfdbee98
JH
88 (
89 test_set_editor "$TEST_DIRECTORY"/t7500/add-content &&
90 git commit -t "$TEMPLATE"
91 ) &&
d1cc130a
SG
92 commit_msg_is "short templatecommit message"
93'
94
29853c82 95test_expect_success 'config-specified template should commit' '
d1cc130a 96 echo "new template" > "$TEMPLATE" &&
22179b30 97 test_config commit.template "$TEMPLATE" &&
d1cc130a
SG
98 echo "more content" >> foo &&
99 git add foo &&
bfdbee98
JH
100 (
101 test_set_editor "$TEST_DIRECTORY"/t7500/add-content &&
102 git commit
103 ) &&
d1cc130a
SG
104 commit_msg_is "new templatecommit message"
105'
106
107test_expect_success 'explicit commit message should override template' '
108 echo "still more content" >> foo &&
109 git add foo &&
bfdbee98 110 GIT_EDITOR="$TEST_DIRECTORY"/t7500/add-content git commit --template "$TEMPLATE" \
d1cc130a 111 -m "command line msg" &&
55246aac 112 commit_msg_is "command line msg"
d1cc130a
SG
113'
114
115test_expect_success 'commit message from file should override template' '
116 echo "content galore" >> foo &&
117 git add foo &&
118 echo "standard input msg" |
bfdbee98
JH
119 (
120 test_set_editor "$TEST_DIRECTORY"/t7500/add-content &&
121 git commit --template "$TEMPLATE" --file -
122 ) &&
55246aac 123 commit_msg_is "standard input msg"
d1cc130a
SG
124'
125
8b1ae678
BF
126cat >"$TEMPLATE" <<\EOF
127
128
129### template
130
131EOF
132test_expect_success 'commit message from template with whitespace issue' '
133 echo "content galore" >>foo &&
134 git add foo &&
567c53d0
JS
135 GIT_EDITOR=\""$TEST_DIRECTORY"\"/t7500/add-whitespaced-content \
136 git commit --template "$TEMPLATE" &&
8b1ae678
BF
137 commit_msg_is "commit message"
138'
139
859a4dbc
RV
140test_expect_success 'using alternate GIT_INDEX_FILE (1)' '
141
142 cp .git/index saved-index &&
143 (
144 echo some new content >file &&
145 GIT_INDEX_FILE=.git/another_index &&
146 export GIT_INDEX_FILE &&
147 git add file &&
148 git commit -m "commit using another index" &&
149 git diff-index --exit-code HEAD &&
150 git diff-files --exit-code
151 ) &&
152 cmp .git/index saved-index >/dev/null
153
154'
155
156test_expect_success 'using alternate GIT_INDEX_FILE (2)' '
157
158 cp .git/index saved-index &&
159 (
160 rm -f .git/no-such-index &&
161 GIT_INDEX_FILE=.git/no-such-index &&
162 export GIT_INDEX_FILE &&
163 git commit -m "commit using nonexistent index" &&
164 test -z "$(git ls-files)" &&
165 test -z "$(git ls-tree HEAD)"
166
167 ) &&
168 cmp .git/index saved-index >/dev/null
13208572 169'
859a4dbc 170
13208572
JS
171cat > expect << EOF
172zort
2150554b 173
13208572
JS
174Signed-off-by: C O Mitter <committer@example.com>
175EOF
176
177test_expect_success '--signoff' '
178 echo "yet another content *narf*" >> foo &&
7eb5bbdb 179 echo "zort" | git commit -s -F - foo &&
9524cf29 180 git cat-file commit HEAD | sed "1,/^\$/d" > output &&
bfdbee98 181 test_cmp expect output
859a4dbc
RV
182'
183
dbd0f5c7
JH
184test_expect_success 'commit message from file (1)' '
185 mkdir subdir &&
186 echo "Log in top directory" >log &&
187 echo "Log in sub directory" >subdir/log &&
188 (
189 cd subdir &&
190 git commit --allow-empty -F log
191 ) &&
192 commit_msg_is "Log in sub directory"
193'
194
195test_expect_success 'commit message from file (2)' '
196 rm -f log &&
197 echo "Log in sub directory" >subdir/log &&
198 (
199 cd subdir &&
200 git commit --allow-empty -F log
201 ) &&
202 commit_msg_is "Log in sub directory"
203'
204
205test_expect_success 'commit message from stdin' '
206 (
207 cd subdir &&
208 echo "Log with foo word" | git commit --allow-empty -F -
209 ) &&
210 commit_msg_is "Log with foo word"
211'
212
aae94ffb
SB
213test_expect_success 'commit -F overrides -t' '
214 (
215 cd subdir &&
216 echo "-F log" > f.log &&
217 echo "-t template" > t.template &&
218 git commit --allow-empty -F f.log -t t.template
219 ) &&
220 commit_msg_is "-F log"
221'
222
c9b5fde7
ÆAB
223test_expect_success 'Commit without message is allowed with --allow-empty-message' '
224 echo "more content" >>foo &&
225 git add foo &&
226 >empty &&
227 git commit --allow-empty-message <empty &&
076cbd63
JK
228 commit_msg_is "" &&
229 git tag empty-message-commit
c9b5fde7
ÆAB
230'
231
232test_expect_success 'Commit without message is no-no without --allow-empty-message' '
233 echo "more content" >>foo &&
234 git add foo &&
235 >empty &&
236 test_must_fail git commit <empty
237'
238
239test_expect_success 'Commit a message with --allow-empty-message' '
240 echo "even more content" >>foo &&
241 git add foo &&
242 git commit --allow-empty-message -m"hello there" &&
243 commit_msg_is "hello there"
244'
245
076cbd63
JK
246test_expect_success 'commit -C empty respects --allow-empty-message' '
247 echo more >>foo &&
248 git add foo &&
249 test_must_fail git commit -C empty-message-commit &&
250 git commit -C empty-message-commit --allow-empty-message &&
251 commit_msg_is ""
252'
253
b1a6c0a9
PN
254commit_for_rebase_autosquash_setup () {
255 echo "first content line" >>foo &&
256 git add foo &&
257 cat >log <<EOF &&
258target message subject line
259
260target message body line 1
261target message body line 2
262EOF
263 git commit -F log &&
264 echo "second content line" >>foo &&
265 git add foo &&
266 git commit -m "intermediate commit" &&
267 echo "third content line" >>foo &&
268 git add foo
269}
270
271test_expect_success 'commit --fixup provides correct one-line commit message' '
272 commit_for_rebase_autosquash_setup &&
8ef6aad6 273 EDITOR="echo ignored >>" git commit --fixup HEAD~1 &&
b1a6c0a9
PN
274 commit_msg_is "fixup! target message subject line"
275'
276
30884c9a
ÆAB
277test_expect_success 'commit --fixup -m"something" -m"extra"' '
278 commit_for_rebase_autosquash_setup &&
279 git commit --fixup HEAD~1 -m"something" -m"extra" &&
280 commit_msg_is "fixup! target message subject linesomething
281
282extra"
283'
8ef6aad6
JK
284test_expect_success 'commit --fixup --edit' '
285 commit_for_rebase_autosquash_setup &&
286 EDITOR="printf \"something\nextra\" >>" git commit --fixup HEAD~1 --edit &&
287 commit_msg_is "fixup! target message subject linesomething
288extra"
289'
290
3d1bda6b
CM
291get_commit_msg () {
292 rev="$1" &&
293 git log -1 --pretty=format:"%B" "$rev"
294}
295
296test_expect_success 'commit --fixup=amend: creates amend! commit' '
297 commit_for_rebase_autosquash_setup &&
298 cat >expected <<-EOF &&
299 amend! $(git log -1 --format=%s HEAD~)
300
301 $(get_commit_msg HEAD~)
302
303 edited
304 EOF
305 (
306 set_fake_editor &&
307 FAKE_COMMIT_AMEND="edited" \
308 git commit --fixup=amend:HEAD~
309 ) &&
310 get_commit_msg HEAD >actual &&
311 test_cmp expected actual
312'
313
314test_expect_success '--fixup=amend: --only ignores staged changes' '
315 commit_for_rebase_autosquash_setup &&
316 cat >expected <<-EOF &&
317 amend! $(git log -1 --format=%s HEAD~)
318
319 $(get_commit_msg HEAD~)
320
321 edited
322 EOF
323 (
324 set_fake_editor &&
325 FAKE_COMMIT_AMEND="edited" \
326 git commit --fixup=amend:HEAD~ --only
327 ) &&
328 get_commit_msg HEAD >actual &&
329 test_cmp expected actual &&
330 test_cmp_rev HEAD@{1}^{tree} HEAD^{tree} &&
331 test_cmp_rev HEAD@{1} HEAD^ &&
332 test_expect_code 1 git diff --cached --exit-code &&
333 git cat-file blob :foo >actual &&
334 test_cmp foo actual
335'
336
337test_expect_success '--fixup=reword: ignores staged changes' '
338 commit_for_rebase_autosquash_setup &&
339 cat >expected <<-EOF &&
340 amend! $(git log -1 --format=%s HEAD~)
341
342 $(get_commit_msg HEAD~)
343
344 edited
345 EOF
346 (
347 set_fake_editor &&
348 FAKE_COMMIT_AMEND="edited" \
349 git commit --fixup=reword:HEAD~
350 ) &&
351 get_commit_msg HEAD >actual &&
352 test_cmp expected actual &&
353 test_cmp_rev HEAD@{1}^{tree} HEAD^{tree} &&
354 test_cmp_rev HEAD@{1} HEAD^ &&
355 test_expect_code 1 git diff --cached --exit-code &&
356 git cat-file blob :foo >actual &&
357 test_cmp foo actual
358'
359
360test_expect_success '--fixup=reword: error out with -m option' '
361 commit_for_rebase_autosquash_setup &&
246cac85 362 echo "fatal: options '\''-m'\'' and '\''--fixup:reword'\'' cannot be used together" >expect &&
3d1bda6b
CM
363 test_must_fail git commit --fixup=reword:HEAD~ -m "reword commit message" 2>actual &&
364 test_cmp expect actual
365'
366
367test_expect_success '--fixup=amend: error out with -m option' '
368 commit_for_rebase_autosquash_setup &&
246cac85 369 echo "fatal: options '\''-m'\'' and '\''--fixup:amend'\'' cannot be used together" >expect &&
3d1bda6b
CM
370 test_must_fail git commit --fixup=amend:HEAD~ -m "amend commit message" 2>actual &&
371 test_cmp expect actual
372'
373
374test_expect_success 'consecutive amend! commits remove amend! line from commit msg body' '
375 commit_for_rebase_autosquash_setup &&
376 cat >expected <<-EOF &&
377 amend! amend! $(git log -1 --format=%s HEAD~)
378
379 $(get_commit_msg HEAD~)
380
381 edited 1
382
383 edited 2
384 EOF
385 echo "reword new commit message" >actual &&
386 (
387 set_fake_editor &&
388 FAKE_COMMIT_AMEND="edited 1" \
389 git commit --fixup=reword:HEAD~ &&
390 FAKE_COMMIT_AMEND="edited 2" \
391 git commit --fixup=reword:HEAD
392 ) &&
393 get_commit_msg HEAD >actual &&
394 test_cmp expected actual
395'
396
397test_expect_success 'deny to create amend! commit if its commit msg body is empty' '
398 commit_for_rebase_autosquash_setup &&
399 echo "Aborting commit due to empty commit message body." >expected &&
400 (
401 set_fake_editor &&
402 test_must_fail env FAKE_COMMIT_MESSAGE="amend! target message subject line" \
403 git commit --fixup=amend:HEAD~ 2>actual
404 ) &&
405 test_cmp expected actual
406'
407
408test_expect_success 'amend! commit allows empty commit msg body with --allow-empty-message' '
409 commit_for_rebase_autosquash_setup &&
410 cat >expected <<-EOF &&
411 amend! $(git log -1 --format=%s HEAD~)
412 EOF
413 (
414 set_fake_editor &&
415 FAKE_COMMIT_MESSAGE="amend! target message subject line" \
416 git commit --fixup=amend:HEAD~ --allow-empty-message &&
417 get_commit_msg HEAD >actual
418 ) &&
419 test_cmp expected actual
420'
421
422test_fixup_reword_opt () {
58cf6056 423 test_expect_success "--fixup=reword: incompatible with $1" "
246cac85
JNA
424 echo 'fatal: reword option of '\''--fixup'\'' and' \
425 ''\''--patch/--interactive/--all/--include/--only'\' \
426 'cannot be used together' >expect &&
3d1bda6b
CM
427 test_must_fail git commit --fixup=reword:HEAD~ $1 2>actual &&
428 test_cmp expect actual
429 "
430}
431
432for opt in --all --include --only --interactive --patch
433do
434 test_fixup_reword_opt $opt
435done
436
437test_expect_success '--fixup=reword: give error with pathsec' '
438 commit_for_rebase_autosquash_setup &&
246cac85 439 echo "fatal: reword option of '\''--fixup'\'' and path '\''foo'\'' cannot be used together" >expect &&
3d1bda6b
CM
440 test_must_fail git commit --fixup=reword:HEAD~ -- foo 2>actual &&
441 test_cmp expect actual
442'
443
444test_expect_success '--fixup=reword: -F give error message' '
a699367b 445 echo "fatal: options '\''-F'\'' and '\''--fixup'\'' cannot be used together" >expect &&
3d1bda6b
CM
446 test_must_fail git commit --fixup=reword:HEAD~ -F msg 2>actual &&
447 test_cmp expect actual
448'
30884c9a 449
7951bd30
PN
450test_expect_success 'commit --squash works with -F' '
451 commit_for_rebase_autosquash_setup &&
452 echo "log message from file" >msgfile &&
453 git commit --squash HEAD~1 -F msgfile &&
454 commit_msg_is "squash! target message subject linelog message from file"
455'
456
457test_expect_success 'commit --squash works with -m' '
458 commit_for_rebase_autosquash_setup &&
459 git commit --squash HEAD~1 -m "foo bar\nbaz" &&
460 commit_msg_is "squash! target message subject linefoo bar\nbaz"
461'
462
463test_expect_success 'commit --squash works with -C' '
464 commit_for_rebase_autosquash_setup &&
465 git commit --squash HEAD~1 -C HEAD &&
466 commit_msg_is "squash! target message subject lineintermediate commit"
467'
468
469test_expect_success 'commit --squash works with -c' '
470 commit_for_rebase_autosquash_setup &&
471 test_set_editor "$TEST_DIRECTORY"/t7500/edit-content &&
472 git commit --squash HEAD~1 -c HEAD &&
473 commit_msg_is "squash! target message subject lineedited commit"
474'
475
476test_expect_success 'commit --squash works with -C for same commit' '
477 commit_for_rebase_autosquash_setup &&
478 git commit --squash HEAD -C HEAD &&
479 commit_msg_is "squash! intermediate commit"
480'
481
482test_expect_success 'commit --squash works with -c for same commit' '
483 commit_for_rebase_autosquash_setup &&
484 test_set_editor "$TEST_DIRECTORY"/t7500/edit-content &&
485 git commit --squash HEAD -c HEAD &&
486 commit_msg_is "squash! edited commit"
487'
488
29853c82 489test_expect_success 'commit --squash works with editor' '
7951bd30
PN
490 commit_for_rebase_autosquash_setup &&
491 test_set_editor "$TEST_DIRECTORY"/t7500/add-content &&
492 git commit --squash HEAD~1 &&
493 commit_msg_is "squash! target message subject linecommit message"
494'
495
b1a6c0a9
PN
496test_expect_success 'invalid message options when using --fixup' '
497 echo changes >>foo &&
498 echo "message" >log &&
499 git add foo &&
7951bd30 500 test_must_fail git commit --fixup HEAD~1 --squash HEAD~2 &&
b1a6c0a9
PN
501 test_must_fail git commit --fixup HEAD~1 -C HEAD~2 &&
502 test_must_fail git commit --fixup HEAD~1 -c HEAD~2 &&
b1a6c0a9
PN
503 test_must_fail git commit --fixup HEAD~1 -F log
504'
505
b3cf1b77
KS
506cat >expected-template <<EOF
507
508# Please enter the commit message for your changes. Lines starting
6f70f00b 509# with '#' will be ignored.
b3cf1b77
KS
510#
511# Author: A U Thor <author@example.com>
512#
513# On branch commit-template-check
514# Changes to be committed:
515# new file: commit-template-check
516#
517# Untracked files not listed
518EOF
519
520test_expect_success 'new line found before status message in commit template' '
521 git checkout -b commit-template-check &&
522 git reset --hard HEAD &&
523 touch commit-template-check &&
524 git add commit-template-check &&
525 GIT_EDITOR="cat >editor-input" git commit --untracked-files=no --allow-empty-message &&
1108cea7 526 test_cmp expected-template editor-input
b3cf1b77
KS
527'
528
3e73cc62
EN
529test_expect_success 'setup empty commit with unstaged rename and copy' '
530 test_create_repo unstaged_rename_and_copy &&
531 (
532 cd unstaged_rename_and_copy &&
533
534 echo content >orig &&
535 git add orig &&
536 test_commit orig &&
537
538 cp orig new_copy &&
539 mv orig new_rename &&
540 git add -N new_copy new_rename
541 )
542'
543
544test_expect_success 'check commit with unstaged rename and copy' '
545 (
546 cd unstaged_rename_and_copy &&
547
548 test_must_fail git -c diff.renames=copy commit
549 )
550'
551
5c4f55f1
HW
552test_expect_success 'commit without staging files fails and displays hints' '
553 echo "initial" >file &&
554 git add file &&
555 git commit -m initial &&
556 echo "changes" >>file &&
557 test_must_fail git commit -m update >actual &&
6789275d 558 test_grep "no changes added to commit (use \"git add\" and/or \"git commit -a\")" actual
5c4f55f1
HW
559'
560
d1cc130a 561test_done