You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
258 lines
6.7 KiB
258 lines
6.7 KiB
#!/bin/sh |
|
|
|
test_description='messages from rebase operation' |
|
|
|
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main |
|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME |
|
|
|
. ./test-lib.sh |
|
|
|
test_expect_success 'setup' ' |
|
test_commit O fileO && |
|
test_commit X fileX && |
|
git branch fast-forward && |
|
test_commit A fileA && |
|
test_commit B fileB && |
|
test_commit Y fileY && |
|
|
|
git checkout -b conflicts O && |
|
test_commit P && |
|
test_commit conflict-X fileX && |
|
test_commit Q && |
|
|
|
git checkout -b topic O && |
|
git cherry-pick A B && |
|
test_commit Z fileZ && |
|
git tag start |
|
' |
|
|
|
test_expect_success 'rebase -m' ' |
|
git rebase -m main >actual && |
|
test_must_be_empty actual |
|
' |
|
|
|
test_expect_success 'rebase against main twice' ' |
|
git rebase --apply main >out && |
|
test_i18ngrep "Current branch topic is up to date" out |
|
' |
|
|
|
test_expect_success 'rebase against main twice with --force' ' |
|
git rebase --force-rebase --apply main >out && |
|
test_i18ngrep "Current branch topic is up to date, rebase forced" out |
|
' |
|
|
|
test_expect_success 'rebase against main twice from another branch' ' |
|
git checkout topic^ && |
|
git rebase --apply main topic >out && |
|
test_i18ngrep "Current branch topic is up to date" out |
|
' |
|
|
|
test_expect_success 'rebase fast-forward to main' ' |
|
git checkout topic^ && |
|
git rebase --apply topic >out && |
|
test_i18ngrep "Fast-forwarded HEAD to topic" out |
|
' |
|
|
|
test_expect_success 'rebase --stat' ' |
|
git reset --hard start && |
|
git rebase --stat main >diffstat.txt && |
|
grep "^ fileX | *1 +$" diffstat.txt |
|
' |
|
|
|
test_expect_success 'rebase w/config rebase.stat' ' |
|
git reset --hard start && |
|
git config rebase.stat true && |
|
git rebase main >diffstat.txt && |
|
grep "^ fileX | *1 +$" diffstat.txt |
|
' |
|
|
|
test_expect_success 'rebase -n overrides config rebase.stat config' ' |
|
git reset --hard start && |
|
git config rebase.stat true && |
|
git rebase -n main >diffstat.txt && |
|
! grep "^ fileX | *1 +$" diffstat.txt |
|
' |
|
|
|
test_expect_success 'rebase --onto outputs the invalid ref' ' |
|
test_must_fail git rebase --onto invalid-ref HEAD HEAD 2>err && |
|
test_i18ngrep "invalid-ref" err |
|
' |
|
|
|
test_expect_success 'error out early upon -C<n> or --whitespace=<bad>' ' |
|
test_must_fail git rebase -Cnot-a-number HEAD 2>err && |
|
test_i18ngrep "numerical value" err && |
|
test_must_fail git rebase --whitespace=bad HEAD 2>err && |
|
test_i18ngrep "Invalid whitespace option" err |
|
' |
|
|
|
write_reflog_expect () { |
|
if test $mode = --apply |
|
then |
|
sed 's/(continue)/(pick)/' |
|
else |
|
cat |
|
fi >expect |
|
} |
|
|
|
test_reflog () { |
|
mode=$1 |
|
reflog_action="$2" |
|
|
|
test_expect_success "rebase $mode reflog${reflog_action:+ GIT_REFLOG_ACTION=$reflog_action}" ' |
|
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 && |
|
test_must_fail git rebase $mode main && |
|
echo resolved >fileX && |
|
git add fileX && |
|
git rebase --continue |
|
) && |
|
|
|
git log -g --format=%gs -5 >actual && |
|
write_reflog_expect <<-EOF && |
|
${reflog_action:-rebase} (finish): returning to refs/heads/conflicts |
|
${reflog_action:-rebase} (pick): Q |
|
${reflog_action:-rebase} (continue): conflict-X |
|
${reflog_action:-rebase} (pick): P |
|
${reflog_action:-rebase} (start): checkout main |
|
EOF |
|
test_cmp expect actual && |
|
|
|
git log -g --format=%gs -1 conflicts >actual && |
|
write_reflog_expect <<-EOF && |
|
${reflog_action:-rebase} (finish): refs/heads/conflicts onto $(git rev-parse main) |
|
EOF |
|
test_cmp expect actual && |
|
|
|
# check there is only one new entry in the branch reflog |
|
test_cmp_rev conflicts@{1} Q |
|
' |
|
|
|
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 |
|
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_expect_success "rebase $mode --skip reflog${reflog_action:+ GIT_REFLOG_ACTION=$reflog_action}" ' |
|
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 && |
|
test_must_fail git rebase $mode main && |
|
git rebase --skip |
|
) && |
|
|
|
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 |
|
test_cmp expect actual |
|
' |
|
|
|
test_expect_success "rebase $mode --abort reflog${reflog_action:+ GIT_REFLOG_ACTION=$reflog_action}" ' |
|
git checkout conflicts && |
|
test_when_finished "git reset --hard Q" && |
|
|
|
git log -g -1 conflicts >branch-expect && |
|
( |
|
if test -n "$reflog_action" |
|
then |
|
GIT_REFLOG_ACTION="$reflog_action" && |
|
export GIT_REFLOG_ACTION |
|
fi && |
|
test_must_fail git rebase $mode main && |
|
git rebase --abort |
|
) && |
|
|
|
git log -g --format=%gs -3 >actual && |
|
write_reflog_expect <<-EOF && |
|
${reflog_action:-rebase} (abort): returning to refs/heads/conflicts |
|
${reflog_action:-rebase} (pick): P |
|
${reflog_action:-rebase} (start): checkout main |
|
EOF |
|
test_cmp expect actual && |
|
|
|
# check branch reflog is unchanged |
|
git log -g -1 conflicts >branch-actual && |
|
test_cmp branch-expect branch-actual |
|
' |
|
|
|
test_expect_success "rebase $mode --abort detached HEAD reflog${reflog_action:+ GIT_REFLOG_ACTION=$reflog_action}" ' |
|
git checkout Q && |
|
test_when_finished "git reset --hard Q" && |
|
|
|
( |
|
if test -n "$reflog_action" |
|
then |
|
GIT_REFLOG_ACTION="$reflog_action" && |
|
export GIT_REFLOG_ACTION |
|
fi && |
|
test_must_fail git rebase $mode main && |
|
git rebase --abort |
|
) && |
|
|
|
git log -g --format=%gs -3 >actual && |
|
write_reflog_expect <<-EOF && |
|
${reflog_action:-rebase} (abort): returning to $(git rev-parse Q) |
|
${reflog_action:-rebase} (pick): P |
|
${reflog_action:-rebase} (start): checkout main |
|
EOF |
|
test_cmp expect actual |
|
' |
|
} |
|
|
|
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' ' |
|
git init unrelated && |
|
test_commit -C unrelated 1 && |
|
git -C unrelated remote add -f origin "$PWD" && |
|
git -C unrelated branch --set-upstream-to=origin/main && |
|
git -C unrelated -c core.editor=true rebase -i -v --stat >actual && |
|
test_i18ngrep "Changes to " actual && |
|
test_i18ngrep "5 files changed" actual |
|
' |
|
|
|
test_done
|
|
|