aa1df8146d
Given the name of the option it is confusing if --keep-base actually changes the base of the branch without --fork-point being explicitly given on the command line. The combination of --keep-base with an explicit --fork-point is still supported even though --fork-point means we do not keep the same base if the upstream branch has been rewound. We do this in case anyone is relying on this behavior which is tested in t3431[1] [1] https://lore.kernel.org/git/20200715032014.GA10818@generichostname/ Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk> Signed-off-by: Junio C Hamano <gitster@pobox.com>
116 lines
2.9 KiB
Bash
Executable File
116 lines
2.9 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# Copyright (c) 2019 Denton Liu
|
|
#
|
|
|
|
test_description='git rebase --fork-point test'
|
|
|
|
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
|
|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
|
|
|
. ./test-lib.sh
|
|
|
|
# A---B---D---E (main)
|
|
# \
|
|
# C*---F---G (side)
|
|
#
|
|
# C was formerly part of main but main was rewound to remove C
|
|
#
|
|
test_expect_success setup '
|
|
test_commit A &&
|
|
test_commit B &&
|
|
test_commit C &&
|
|
git branch -t side &&
|
|
git reset --hard HEAD^ &&
|
|
test_commit D &&
|
|
test_commit E &&
|
|
git checkout side &&
|
|
test_commit F &&
|
|
test_commit G
|
|
'
|
|
|
|
do_test_rebase () {
|
|
expected="$1" &&
|
|
shift &&
|
|
git checkout main &&
|
|
git reset --hard E &&
|
|
git checkout side &&
|
|
git reset --hard G &&
|
|
git rebase $* &&
|
|
test_write_lines $expected >expect &&
|
|
git log --pretty=%s >actual &&
|
|
test_cmp expect actual
|
|
}
|
|
|
|
test_rebase () {
|
|
expected="$1" &&
|
|
shift &&
|
|
test_expect_success "git rebase $*" "do_test_rebase '$expected' $*"
|
|
}
|
|
|
|
test_rebase 'G F E D B A'
|
|
test_rebase 'G F D B A' --onto D
|
|
test_rebase 'G F C B A' --keep-base
|
|
test_rebase 'G F C E D B A' --no-fork-point
|
|
test_rebase 'G F C D B A' --no-fork-point --onto D
|
|
test_rebase 'G F C B A' --no-fork-point --keep-base
|
|
|
|
test_rebase 'G F E D B A' --fork-point refs/heads/main
|
|
test_rebase 'G F E D B A' --fork-point main
|
|
|
|
test_rebase 'G F D B A' --fork-point --onto D refs/heads/main
|
|
test_rebase 'G F D B A' --fork-point --onto D main
|
|
|
|
test_rebase 'G F B A' --fork-point --keep-base refs/heads/main
|
|
test_rebase 'G F B A' --fork-point --keep-base main
|
|
|
|
test_rebase 'G F C E D B A' refs/heads/main
|
|
test_rebase 'G F C E D B A' main
|
|
|
|
test_rebase 'G F C D B A' --onto D refs/heads/main
|
|
test_rebase 'G F C D B A' --onto D main
|
|
|
|
test_rebase 'G F C B A' --keep-base refs/heads/main
|
|
test_rebase 'G F C B A' --keep-base main
|
|
|
|
test_expect_success 'git rebase --fork-point with ambigous refname' '
|
|
git checkout main &&
|
|
git checkout -b one &&
|
|
git checkout side &&
|
|
git tag one &&
|
|
test_must_fail git rebase --fork-point --onto D one
|
|
'
|
|
|
|
test_expect_success '--fork-point and --root both given' '
|
|
test_must_fail git rebase --fork-point --root 2>err &&
|
|
test_i18ngrep "cannot be used together" err
|
|
'
|
|
|
|
test_expect_success 'rebase.forkPoint set to false' '
|
|
test_config rebase.forkPoint false &&
|
|
do_test_rebase "G F C E D B A"
|
|
'
|
|
|
|
test_expect_success 'rebase.forkPoint set to false and then to true' '
|
|
test_config_global rebase.forkPoint false &&
|
|
test_config rebase.forkPoint true &&
|
|
do_test_rebase "G F E D B A"
|
|
'
|
|
|
|
test_expect_success 'rebase.forkPoint set to false and command line says --fork-point' '
|
|
test_config rebase.forkPoint false &&
|
|
do_test_rebase "G F E D B A" --fork-point
|
|
'
|
|
|
|
test_expect_success 'rebase.forkPoint set to true and command line says --no-fork-point' '
|
|
test_config rebase.forkPoint true &&
|
|
do_test_rebase "G F C E D B A" --no-fork-point
|
|
'
|
|
|
|
test_expect_success 'rebase.forkPoint set to true and --root given' '
|
|
test_config rebase.forkPoint true &&
|
|
git rebase --root
|
|
'
|
|
|
|
test_done
|