git-commit-vandalism/t/t3437-rebase-fixup-options.sh

228 lines
6.5 KiB
Bash
Raw Normal View History

#!/bin/sh
#
# Copyright (c) 2018 Phillip Wood
#
test_description='git rebase interactive fixup options
This test checks the "fixup [-C|-c]" command of rebase interactive.
In addition to amending the contents of the commit, "fixup -C"
replaces the original commit message with the message of the fixup
commit. "fixup -c" also replaces the original message, but opens the
editor to allow the user to edit the message before committing.
'
. ./test-lib.sh
. "$TEST_DIRECTORY"/lib-rebase.sh
EMPTY=""
test_commit_message () {
rev="$1" && # commit or tag we want to test
file="$2" && # test against the content of a file
git show --no-patch --pretty=format:%B "$rev" >actual-message &&
if test "$2" = -m
then
str="$3" && # test against a string
printf "%s\n" "$str" >tmp-expected-message &&
file="tmp-expected-message"
fi
test_cmp "$file" actual-message
}
get_author () {
rev="$1" &&
git log -1 --pretty=format:"%an %ae %at" "$rev"
}
test_expect_success 'setup' '
cat >message <<-EOF &&
amend! B
$EMPTY
new subject
$EMPTY
new
body
EOF
test_commit A A &&
test_commit B B &&
get_author HEAD >expected-author &&
ORIG_AUTHOR_NAME="$GIT_AUTHOR_NAME" &&
ORIG_AUTHOR_EMAIL="$GIT_AUTHOR_EMAIL" &&
GIT_AUTHOR_NAME="Amend Author" &&
GIT_AUTHOR_EMAIL="amend@example.com" &&
test_commit "$(cat message)" A A1 A1 &&
test_commit A2 A &&
test_commit A3 A &&
GIT_AUTHOR_NAME="$ORIG_AUTHOR_NAME" &&
GIT_AUTHOR_EMAIL="$ORIG_AUTHOR_EMAIL" &&
git checkout -b conflicts-branch A &&
test_commit conflicts A &&
set_fake_editor &&
git checkout -b branch B &&
echo B1 >B &&
test_tick &&
git commit --fixup=HEAD -a &&
test_tick &&
git commit --allow-empty -F - <<-EOF &&
amend! B
$EMPTY
B
$EMPTY
edited 1
EOF
test_tick &&
git commit --allow-empty -F - <<-EOF &&
amend! amend! B
$EMPTY
B
$EMPTY
edited 1
$EMPTY
edited 2
EOF
echo B2 >B &&
test_tick &&
FAKE_COMMIT_AMEND="edited squash" git commit --squash=HEAD -a &&
echo B3 >B &&
test_tick &&
git commit -a -F - <<-EOF &&
amend! amend! amend! B
$EMPTY
B
$EMPTY
edited 1
$EMPTY
edited 2
$EMPTY
edited 3
EOF
GIT_AUTHOR_NAME="Rebase Author" &&
GIT_AUTHOR_EMAIL="rebase.author@example.com" &&
GIT_COMMITTER_NAME="Rebase Committer" &&
GIT_COMMITTER_EMAIL="rebase.committer@example.com"
'
test_expect_success 'simple fixup -C works' '
test_when_finished "test_might_fail git rebase --abort" &&
git checkout --detach A2 &&
FAKE_LINES="1 fixup_-C 2" git rebase -i B &&
test_cmp_rev HEAD^ B &&
test_cmp_rev HEAD^{tree} A2^{tree} &&
test_commit_message HEAD -m "A2"
'
test_expect_success 'simple fixup -c works' '
test_when_finished "test_might_fail git rebase --abort" &&
git checkout --detach A2 &&
git log -1 --pretty=format:%B >expected-fixup-message &&
test_write_lines "" "Modified A2" >>expected-fixup-message &&
FAKE_LINES="1 fixup_-c 2" \
FAKE_COMMIT_AMEND="Modified A2" \
git rebase -i B &&
test_cmp_rev HEAD^ B &&
test_cmp_rev HEAD^{tree} A2^{tree} &&
test_commit_message HEAD expected-fixup-message
'
test_expect_success 'fixup -C removes amend! from message' '
test_when_finished "test_might_fail git rebase --abort" &&
git checkout --detach A1 &&
git log -1 --pretty=format:%b >expected-message &&
FAKE_LINES="1 fixup_-C 2" git rebase -i A &&
test_cmp_rev HEAD^ A &&
test_cmp_rev HEAD^{tree} A1^{tree} &&
test_commit_message HEAD expected-message &&
get_author HEAD >actual-author &&
test_cmp expected-author actual-author
'
test_expect_success 'fixup -C with conflicts gives correct message' '
test_when_finished "test_might_fail git rebase --abort" &&
git checkout --detach A1 &&
git log -1 --pretty=format:%b >expected-message &&
test_write_lines "" "edited" >>expected-message &&
test_must_fail env FAKE_LINES="1 fixup_-C 2" git rebase -i conflicts &&
git checkout --theirs -- A &&
git add A &&
FAKE_COMMIT_AMEND=edited git rebase --continue &&
test_cmp_rev HEAD^ conflicts &&
test_cmp_rev HEAD^{tree} A1^{tree} &&
test_commit_message HEAD expected-message &&
get_author HEAD >actual-author &&
test_cmp expected-author actual-author
'
test_expect_success 'skipping fixup -C after fixup gives correct message' '
test_when_finished "test_might_fail git rebase --abort" &&
git checkout --detach A3 &&
test_must_fail env FAKE_LINES="1 fixup 2 fixup_-C 4" git rebase -i A &&
git reset --hard &&
FAKE_COMMIT_AMEND=edited git rebase --continue &&
test_commit_message HEAD -m "B"
'
test_expect_success 'sequence of fixup, fixup -C & squash --signoff works' '
git checkout --detach branch &&
FAKE_LINES="1 fixup 2 fixup_-C 3 fixup_-C 4 squash 5 fixup_-C 6" \
FAKE_COMMIT_AMEND=squashed \
FAKE_MESSAGE_COPY=actual-squash-message \
git -c commit.status=false rebase -ik --signoff A &&
git diff-tree --exit-code --patch HEAD branch -- &&
test_cmp_rev HEAD^ A &&
test_i18ncmp "$TEST_DIRECTORY/t3437/expected-squash-message" \
actual-squash-message
'
test_expect_success 'first fixup -C commented out in sequence fixup fixup -C fixup -C' '
test_when_finished "test_might_fail git rebase --abort" &&
git checkout branch && git checkout --detach branch~2 &&
git log -1 --pretty=format:%b >expected-message &&
FAKE_LINES="1 fixup 2 fixup_-C 3 fixup_-C 4" git rebase -i A &&
test_cmp_rev HEAD^ A &&
test_commit_message HEAD expected-message
'
test_expect_success 'multiple fixup -c opens editor once' '
test_when_finished "test_might_fail git rebase --abort" &&
git checkout --detach A3 &&
base=$(git rev-parse HEAD~4) &&
FAKE_COMMIT_MESSAGE="Modified-A3" \
FAKE_LINES="1 fixup_-C 2 fixup_-c 3 fixup_-c 4" \
EXPECT_HEADER_COUNT=4 \
git rebase -i $base &&
test_cmp_rev $base HEAD^ &&
get_author HEAD >actual-author &&
test_cmp expected-author actual-author &&
test 1 = $(git show | grep Modified-A3 | wc -l)
'
test_expect_success 'sequence squash, fixup & fixup -c gives combined message' '
test_when_finished "test_might_fail git rebase --abort" &&
git checkout --detach A3 &&
FAKE_LINES="1 squash 2 fixup 3 fixup_-c 4" \
FAKE_MESSAGE_COPY=actual-combined-message \
git -c commit.status=false rebase -i A &&
test_i18ncmp "$TEST_DIRECTORY/t3437/expected-combined-message" \
actual-combined-message &&
test_cmp_rev HEAD^ A
'
test_expect_success 'fixup -C works upon --autosquash with amend!' '
git checkout --detach branch &&
FAKE_COMMIT_AMEND=squashed \
FAKE_MESSAGE_COPY=actual-squash-message \
git -c commit.status=false rebase -ik --autosquash \
--signoff A &&
git diff-tree --exit-code --patch HEAD branch -- &&
test_cmp_rev HEAD^ A &&
test_i18ncmp "$TEST_DIRECTORY/t3437/expected-squash-message" \
actual-squash-message
'
test_done