a3ec9eaf38
In commitb00bf1c9a8
("git-rebase: make --allow-empty-message the default", 2018-06-27), several arguments were given for transplanting empty commits without halting and asking the user for confirmation on each commit. These arguments were incomplete because the logic clearly assumed the only cases under consideration were transplanting of commits with empty messages (see the comment about "There are two sources for commits with empty messages). It didn't discuss or even consider rewords, squashes, etc. where the user is explicitly asked for a new commit message and provides an empty one. (My bad, I totally should have thought about that at the time, but just didn't.) Rewords and squashes are significantly different, though, as described by SZEDER: Let's suppose you start an interactive rebase, choose a commit to squash, save the instruction sheet, rebase fires up your editor, and then you notice that you mistakenly chose the wrong commit to squash. What do you do, how do you abort? Before [that commit] you could clear the commit message, exit the editor, and then rebase would say "Aborting commit due to empty commit message.", and you get to run 'git rebase --abort', and start over. But [since that commit, ...] saving the commit message as is would let rebase continue and create a bunch of unnecessary objects, and then you would have to use the reflog to return to the pre-rebase state. Also, he states: The instructions in the commit message template, which is shown for 'reword' and 'squash', too, still say... # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. These are sound arguments that when editing commit messages during a sequencer operation, that if the commit message is empty then the operation should halt and ask the user to correct. The arguments in commitb00bf1c9a8
(referenced above) still apply when transplanting previously created commits with empty commit messages, so the sequencer should not halt for those. Furthermore, all rationale so far applies equally for cherry-pick as for rebase. Therefore, make the code default to --allow-empty-message when transplanting an existing commit, and to default to halting when the user is asked to edit a commit message and provides an empty one -- for both rebase and cherry-pick. Signed-off-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
91 lines
1.9 KiB
Bash
Executable File
91 lines
1.9 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
test_description='rebase should handle arbitrary git message'
|
|
|
|
. ./test-lib.sh
|
|
. "$TEST_DIRECTORY"/lib-rebase.sh
|
|
|
|
cat >F <<\EOF
|
|
This is an example of a commit log message
|
|
that does not conform to git commit convention.
|
|
|
|
It has two paragraphs, but its first paragraph is not friendly
|
|
to oneline summary format.
|
|
EOF
|
|
|
|
cat >G <<\EOF
|
|
commit log message containing a diff
|
|
EOF
|
|
|
|
|
|
test_expect_success setup '
|
|
|
|
>file1 &&
|
|
>file2 &&
|
|
git add file1 file2 &&
|
|
test_tick &&
|
|
git commit -m "Initial commit" &&
|
|
git branch diff-in-message &&
|
|
git branch empty-message-merge &&
|
|
|
|
git checkout -b multi-line-subject &&
|
|
cat F >file2 &&
|
|
git add file2 &&
|
|
test_tick &&
|
|
git commit -F F &&
|
|
|
|
git cat-file commit HEAD | sed -e "1,/^\$/d" >F0 &&
|
|
|
|
git checkout diff-in-message &&
|
|
echo "commit log message containing a diff" >G &&
|
|
echo "" >>G &&
|
|
cat G >file2 &&
|
|
git add file2 &&
|
|
git diff --cached >>G &&
|
|
test_tick &&
|
|
git commit -F G &&
|
|
|
|
git cat-file commit HEAD | sed -e "1,/^\$/d" >G0 &&
|
|
|
|
git checkout empty-message-merge &&
|
|
echo file3 >file3 &&
|
|
git add file3 &&
|
|
git commit --allow-empty-message -m "" &&
|
|
|
|
git checkout master &&
|
|
|
|
echo One >file1 &&
|
|
test_tick &&
|
|
git add file1 &&
|
|
git commit -m "Second commit"
|
|
'
|
|
|
|
test_expect_success 'rebase commit with multi-line subject' '
|
|
|
|
git rebase master multi-line-subject &&
|
|
git cat-file commit HEAD | sed -e "1,/^\$/d" >F1 &&
|
|
|
|
test_cmp F0 F1 &&
|
|
test_cmp F F0
|
|
'
|
|
|
|
test_expect_success 'rebase commit with diff in message' '
|
|
git rebase master diff-in-message &&
|
|
git cat-file commit HEAD | sed -e "1,/^$/d" >G1 &&
|
|
test_cmp G0 G1 &&
|
|
test_cmp G G0
|
|
'
|
|
|
|
test_expect_success 'rebase -m commit with empty message' '
|
|
git rebase -m master empty-message-merge
|
|
'
|
|
|
|
test_expect_success 'rebase -i commit with empty message' '
|
|
git checkout diff-in-message &&
|
|
set_fake_editor &&
|
|
test_must_fail env FAKE_COMMIT_MESSAGE=" " FAKE_LINES="reword 1" \
|
|
git rebase -i HEAD^
|
|
'
|
|
|
|
test_done
|