t3406: rework rebase reflog tests

Refactor the tests in preparation for adding more tests in the next
few commits. The reworked tests use the same function for testing both
the "merge" and "apply" backends. The test coverage for the "apply"
backend now includes setting GIT_REFLOG_ACTION.

Note that rebasing the "conflicts" branch does not create any
conflicts yet. A commit to do that will be added in the next commit
and the diff ends up smaller if we have don't rename the branch when
it is added.

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Phillip Wood 2022-10-12 09:35:06 +00:00 committed by Junio C Hamano
parent 57a1498592
commit 4e5e1b4b61
1 changed files with 77 additions and 40 deletions

View File

@ -10,10 +10,15 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
test_expect_success 'setup' ' test_expect_success 'setup' '
test_commit O fileO && test_commit O fileO &&
test_commit X fileX && test_commit X fileX &&
git branch fast-forward &&
test_commit A fileA && test_commit A fileA &&
test_commit B fileB && test_commit B fileB &&
test_commit Y fileY && test_commit Y fileY &&


git checkout -b conflicts O &&
test_commit P &&
test_commit Q &&

git checkout -b topic O && git checkout -b topic O &&
git cherry-pick A B && git cherry-pick A B &&
test_commit Z fileZ && test_commit Z fileZ &&
@ -79,54 +84,86 @@ test_expect_success 'error out early upon -C<n> or --whitespace=<bad>' '
test_i18ngrep "Invalid whitespace option" err test_i18ngrep "Invalid whitespace option" err
' '


test_expect_success 'GIT_REFLOG_ACTION' ' write_reflog_expect () {
git checkout start && if test $mode = --apply
test_commit reflog-onto && then
git checkout -b reflog-topic start && sed 's/.*(finish)/rebase finished/; s/ ([^)]*)//'
test_commit reflog-to-rebase && else
cat
fi >expect
}


git rebase reflog-onto && test_reflog () {
git log -g --format=%gs -3 >actual && mode=$1
cat >expect <<-\EOF && reflog_action="$2"
rebase (finish): returning to refs/heads/reflog-topic
rebase (pick): reflog-to-rebase test_expect_success "rebase $mode reflog${reflog_action:+ GIT_REFLOG_ACTION=$reflog_action}" '
rebase (start): checkout reflog-onto git checkout conflicts &&
test_when_finished "git reset --hard Q" &&

(
if test -n "$reflog_action"
then
GIT_REFLOG_ACTION="$reflog_action" &&
export GIT_REFLOG_ACTION
fi &&
git rebase $mode main
) &&

git log -g --format=%gs -4 >actual &&
write_reflog_expect <<-EOF &&
${reflog_action:-rebase} (finish): returning to refs/heads/conflicts
${reflog_action:-rebase} (pick): Q
${reflog_action:-rebase} (pick): P
${reflog_action:-rebase} (start): checkout main
EOF EOF
test_cmp expect actual && test_cmp expect actual &&


git checkout -b reflog-prefix reflog-to-rebase && git log -g --format=%gs -1 conflicts >actual &&
GIT_REFLOG_ACTION=change-the-reflog git rebase reflog-onto && write_reflog_expect <<-EOF &&
git log -g --format=%gs -3 >actual && ${reflog_action:-rebase} (finish): refs/heads/conflicts onto $(git rev-parse main)
cat >expect <<-\EOF &&
change-the-reflog (finish): returning to refs/heads/reflog-prefix
change-the-reflog (pick): reflog-to-rebase
change-the-reflog (start): checkout reflog-onto
EOF
test_cmp expect actual
'

test_expect_success 'rebase --apply reflog' '
git checkout -b reflog-apply start &&
old_head_reflog="$(git log -g --format=%gs -1 HEAD)" &&

git rebase --apply Y &&

git log -g --format=%gs -4 HEAD >actual &&
cat >expect <<-EOF &&
rebase finished: returning to refs/heads/reflog-apply
rebase: Z
rebase: checkout Y
$old_head_reflog
EOF EOF
test_cmp expect actual && test_cmp expect actual &&


git log -g --format=%gs -2 reflog-apply >actual && # check there is only one new entry in the branch reflog
cat >expect <<-EOF && test_cmp_rev conflicts@{1} Q
rebase finished: refs/heads/reflog-apply onto $(git rev-parse Y) '
branch: Created from start
test_expect_success "rebase $mode fast-forward reflog${reflog_action:+ GIT_REFLOG_ACTION=$reflog_action}" '
git checkout fast-forward &&
test_when_finished "git reset --hard X" &&

(
if test -n "$reflog_action"
then
GIT_REFLOG_ACTION="$reflog_action" &&
export GIT_REFLOG_ACTION
fi &&
git rebase $mode main
) &&

git log -g --format=%gs -2 >actual &&
write_reflog_expect <<-EOF &&
${reflog_action:-rebase} (finish): returning to refs/heads/fast-forward
${reflog_action:-rebase} (start): checkout main
EOF EOF
test_cmp expect actual test_cmp expect actual &&
'
git log -g --format=%gs -1 fast-forward >actual &&
write_reflog_expect <<-EOF &&
${reflog_action:-rebase} (finish): refs/heads/fast-forward onto $(git rev-parse main)
EOF
test_cmp expect actual &&

# check there is only one new entry in the branch reflog
test_cmp_rev fast-forward@{1} X
'
}

test_reflog --merge
test_reflog --merge my-reflog-action
test_reflog --apply
test_reflog --apply my-reflog-action


test_expect_success 'rebase -i onto unrelated history' ' test_expect_success 'rebase -i onto unrelated history' '
git init unrelated && git init unrelated &&