@@ -9,6 +9,8 @@ Tests for template, signoff, squash and -F functions.'
9
9
10
10
. ./test-lib.sh
11
11
12
+ . " $TEST_DIRECTORY " /lib-rebase.sh
13
+
12
14
commit_msg_is () {
13
15
expect=commit_msg_is.expect
14
16
actual=commit_msg_is.actual
@@ -279,6 +281,163 @@ test_expect_success 'commit --fixup -m"something" -m"extra"' '
279
281
280
282
extra"
281
283
'
284
+ get_commit_msg () {
285
+ rev=" $1 " &&
286
+ git log -1 --pretty=format:" %B" " $rev "
287
+ }
288
+
289
+ test_expect_success ' commit --fixup=amend: creates amend! commit' '
290
+ commit_for_rebase_autosquash_setup &&
291
+ cat >expected <<-EOF &&
292
+ amend! $(git log -1 --format=%s HEAD~)
293
+
294
+ $(get_commit_msg HEAD~)
295
+
296
+ edited
297
+ EOF
298
+ (
299
+ set_fake_editor &&
300
+ FAKE_COMMIT_AMEND="edited" \
301
+ git commit --fixup=amend:HEAD~
302
+ ) &&
303
+ get_commit_msg HEAD >actual &&
304
+ test_cmp expected actual
305
+ '
306
+
307
+ test_expect_success ' --fixup=amend: --only ignores staged changes' '
308
+ commit_for_rebase_autosquash_setup &&
309
+ cat >expected <<-EOF &&
310
+ amend! $(git log -1 --format=%s HEAD~)
311
+
312
+ $(get_commit_msg HEAD~)
313
+
314
+ edited
315
+ EOF
316
+ (
317
+ set_fake_editor &&
318
+ FAKE_COMMIT_AMEND="edited" \
319
+ git commit --fixup=amend:HEAD~ --only
320
+ ) &&
321
+ get_commit_msg HEAD >actual &&
322
+ test_cmp expected actual &&
323
+ test_cmp_rev HEAD@{1}^{tree} HEAD^{tree} &&
324
+ test_cmp_rev HEAD@{1} HEAD^ &&
325
+ test_expect_code 1 git diff --cached --exit-code &&
326
+ git cat-file blob :foo >actual &&
327
+ test_cmp foo actual
328
+ '
329
+
330
+ test_expect_success ' --fixup=reword: ignores staged changes' '
331
+ commit_for_rebase_autosquash_setup &&
332
+ cat >expected <<-EOF &&
333
+ amend! $(git log -1 --format=%s HEAD~)
334
+
335
+ $(get_commit_msg HEAD~)
336
+
337
+ edited
338
+ EOF
339
+ (
340
+ set_fake_editor &&
341
+ FAKE_COMMIT_AMEND="edited" \
342
+ git commit --fixup=reword:HEAD~
343
+ ) &&
344
+ get_commit_msg HEAD >actual &&
345
+ test_cmp expected actual &&
346
+ test_cmp_rev HEAD@{1}^{tree} HEAD^{tree} &&
347
+ test_cmp_rev HEAD@{1} HEAD^ &&
348
+ test_expect_code 1 git diff --cached --exit-code &&
349
+ git cat-file blob :foo >actual &&
350
+ test_cmp foo actual
351
+ '
352
+
353
+ test_expect_success ' --fixup=reword: error out with -m option' '
354
+ commit_for_rebase_autosquash_setup &&
355
+ echo "fatal: cannot combine -m with --fixup:reword" >expect &&
356
+ test_must_fail git commit --fixup=reword:HEAD~ -m "reword commit message" 2>actual &&
357
+ test_cmp expect actual
358
+ '
359
+
360
+ test_expect_success ' --fixup=amend: error out with -m option' '
361
+ commit_for_rebase_autosquash_setup &&
362
+ echo "fatal: cannot combine -m with --fixup:amend" >expect &&
363
+ test_must_fail git commit --fixup=amend:HEAD~ -m "amend commit message" 2>actual &&
364
+ test_cmp expect actual
365
+ '
366
+
367
+ test_expect_success ' consecutive amend! commits remove amend! line from commit msg body' '
368
+ commit_for_rebase_autosquash_setup &&
369
+ cat >expected <<-EOF &&
370
+ amend! amend! $(git log -1 --format=%s HEAD~)
371
+
372
+ $(get_commit_msg HEAD~)
373
+
374
+ edited 1
375
+
376
+ edited 2
377
+ EOF
378
+ echo "reword new commit message" >actual &&
379
+ (
380
+ set_fake_editor &&
381
+ FAKE_COMMIT_AMEND="edited 1" \
382
+ git commit --fixup=reword:HEAD~ &&
383
+ FAKE_COMMIT_AMEND="edited 2" \
384
+ git commit --fixup=reword:HEAD
385
+ ) &&
386
+ get_commit_msg HEAD >actual &&
387
+ test_cmp expected actual
388
+ '
389
+
390
+ test_expect_success ' deny to create amend! commit if its commit msg body is empty' '
391
+ commit_for_rebase_autosquash_setup &&
392
+ echo "Aborting commit due to empty commit message body." >expected &&
393
+ (
394
+ set_fake_editor &&
395
+ test_must_fail env FAKE_COMMIT_MESSAGE="amend! target message subject line" \
396
+ git commit --fixup=amend:HEAD~ 2>actual
397
+ ) &&
398
+ test_cmp expected actual
399
+ '
400
+
401
+ test_expect_success ' amend! commit allows empty commit msg body with --allow-empty-message' '
402
+ commit_for_rebase_autosquash_setup &&
403
+ cat >expected <<-EOF &&
404
+ amend! $(git log -1 --format=%s HEAD~)
405
+ EOF
406
+ (
407
+ set_fake_editor &&
408
+ FAKE_COMMIT_MESSAGE="amend! target message subject line" \
409
+ git commit --fixup=amend:HEAD~ --allow-empty-message &&
410
+ get_commit_msg HEAD >actual
411
+ ) &&
412
+ test_cmp expected actual
413
+ '
414
+
415
+ test_fixup_reword_opt () {
416
+ test_expect_success C_LOCALE_OUTPUT " --fixup=reword: incompatible with $1 " "
417
+ echo 'fatal: reword option of --fixup is mutually exclusive with'\
418
+ '--patch/--interactive/--all/--include/--only' >expect &&
419
+ test_must_fail git commit --fixup=reword:HEAD~ $1 2>actual &&
420
+ test_cmp expect actual
421
+ "
422
+ }
423
+
424
+ for opt in --all --include --only --interactive --patch
425
+ do
426
+ test_fixup_reword_opt $opt
427
+ done
428
+
429
+ test_expect_success ' --fixup=reword: give error with pathsec' '
430
+ commit_for_rebase_autosquash_setup &&
431
+ echo "fatal: cannot combine reword option of --fixup with path ' \' ' foo' \' ' " >expect &&
432
+ test_must_fail git commit --fixup=reword:HEAD~ -- foo 2>actual &&
433
+ test_cmp expect actual
434
+ '
435
+
436
+ test_expect_success ' --fixup=reword: -F give error message' '
437
+ echo "fatal: Only one of -c/-C/-F/--fixup can be used." >expect &&
438
+ test_must_fail git commit --fixup=reword:HEAD~ -F msg 2>actual &&
439
+ test_cmp expect actual
440
+ '
282
441
283
442
test_expect_success ' commit --squash works with -F' '
284
443
commit_for_rebase_autosquash_setup &&
0 commit comments