11aad46432
The `--preserve-merges` mode of the `rebase` command is slated to be deprecated soon, as the more powerful `--rebase-merges` mode is available now, and the latter was designed with the express intent to address the shortcomings of `--preserve-merges`' design (e.g. the inability to reorder commits in an interactive rebase). As such, we will eventually even remove the `--preserve-merges` support, and along with it, its tests. In preparation for this, and also to allow the Windows phase of our automated tests to save some well-needed time when running the test suite, this commit introduces a new prerequisite REBASE_P, which can be forced to being unmet by setting the environment variable `GIT_TEST_SKIP_REBASE_P` to any non-empty string. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
264 lines
5.9 KiB
Bash
Executable File
264 lines
5.9 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
test_description='rebase topology tests with merges'
|
|
. ./test-lib.sh
|
|
. "$TEST_DIRECTORY"/lib-rebase.sh
|
|
|
|
test_revision_subjects () {
|
|
expected="$1"
|
|
shift
|
|
set -- $(git log --format=%s --no-walk=unsorted "$@")
|
|
test "$expected" = "$*"
|
|
}
|
|
|
|
# a---b-----------c
|
|
# \ \
|
|
# d-------e \
|
|
# \ \ \
|
|
# n---o---w---v
|
|
# \
|
|
# z
|
|
test_expect_success 'setup of non-linear-history' '
|
|
test_commit a &&
|
|
test_commit b &&
|
|
test_commit c &&
|
|
git checkout b &&
|
|
test_commit d &&
|
|
test_commit e &&
|
|
|
|
git checkout c &&
|
|
test_commit g &&
|
|
revert h g &&
|
|
git checkout d &&
|
|
cherry_pick gp g &&
|
|
test_commit i &&
|
|
git checkout b &&
|
|
test_commit f &&
|
|
|
|
git checkout d &&
|
|
test_commit n &&
|
|
test_commit o &&
|
|
test_merge w e &&
|
|
test_merge v c &&
|
|
git checkout o &&
|
|
test_commit z
|
|
'
|
|
|
|
test_run_rebase () {
|
|
result=$1
|
|
shift
|
|
test_expect_$result "rebase $* after merge from upstream" "
|
|
reset_rebase &&
|
|
git rebase $* e w &&
|
|
test_cmp_rev e HEAD~2 &&
|
|
test_linear_range 'n o' e..
|
|
"
|
|
}
|
|
test_run_rebase success ''
|
|
test_run_rebase success -m
|
|
test_run_rebase success -i
|
|
|
|
test_run_rebase () {
|
|
result=$1
|
|
shift
|
|
expected=$1
|
|
shift
|
|
test_expect_$result "rebase $* of non-linear history is linearized in place" "
|
|
reset_rebase &&
|
|
git rebase $* d w &&
|
|
test_cmp_rev d HEAD~3 &&
|
|
test_linear_range "\'"$expected"\'" d..
|
|
"
|
|
}
|
|
#TODO: make order consistent across all flavors of rebase
|
|
test_run_rebase success 'e n o' ''
|
|
test_run_rebase success 'e n o' -m
|
|
test_run_rebase success 'n o e' -i
|
|
|
|
test_run_rebase () {
|
|
result=$1
|
|
shift
|
|
expected=$1
|
|
shift
|
|
test_expect_$result "rebase $* of non-linear history is linearized upstream" "
|
|
reset_rebase &&
|
|
git rebase $* c w &&
|
|
test_cmp_rev c HEAD~4 &&
|
|
test_linear_range "\'"$expected"\'" c..
|
|
"
|
|
}
|
|
#TODO: make order consistent across all flavors of rebase
|
|
test_run_rebase success 'd e n o' ''
|
|
test_run_rebase success 'd e n o' -m
|
|
test_run_rebase success 'd n o e' -i
|
|
|
|
test_run_rebase () {
|
|
result=$1
|
|
shift
|
|
expected=$1
|
|
shift
|
|
test_expect_$result "rebase $* of non-linear history with merges after upstream merge is linearized" "
|
|
reset_rebase &&
|
|
git rebase $* c v &&
|
|
test_cmp_rev c HEAD~4 &&
|
|
test_linear_range "\'"$expected"\'" c..
|
|
"
|
|
}
|
|
#TODO: make order consistent across all flavors of rebase
|
|
test_run_rebase success 'd e n o' ''
|
|
test_run_rebase success 'd e n o' -m
|
|
test_run_rebase success 'd n o e' -i
|
|
|
|
if ! test_have_prereq REBASE_P; then
|
|
skip_all='skipping git rebase -p tests, as asked for'
|
|
test_done
|
|
fi
|
|
|
|
test_expect_success "rebase -p is no-op in non-linear history" "
|
|
reset_rebase &&
|
|
git rebase -p d w &&
|
|
test_cmp_rev w HEAD
|
|
"
|
|
|
|
test_expect_success "rebase -p is no-op when base inside second parent" "
|
|
reset_rebase &&
|
|
git rebase -p e w &&
|
|
test_cmp_rev w HEAD
|
|
"
|
|
|
|
test_expect_failure "rebase -p --root on non-linear history is a no-op" "
|
|
reset_rebase &&
|
|
git rebase -p --root w &&
|
|
test_cmp_rev w HEAD
|
|
"
|
|
|
|
test_expect_success "rebase -p re-creates merge from side branch" "
|
|
reset_rebase &&
|
|
git rebase -p z w &&
|
|
test_cmp_rev z HEAD^ &&
|
|
test_cmp_rev w^2 HEAD^2
|
|
"
|
|
|
|
test_expect_success "rebase -p re-creates internal merge" "
|
|
reset_rebase &&
|
|
git rebase -p c w &&
|
|
test_cmp_rev c HEAD~4 &&
|
|
test_cmp_rev HEAD^2^ HEAD~3 &&
|
|
test_revision_subjects 'd n e o w' HEAD~3 HEAD~2 HEAD^2 HEAD^ HEAD
|
|
"
|
|
|
|
test_expect_success "rebase -p can re-create two branches on onto" "
|
|
reset_rebase &&
|
|
git rebase -p --onto c d w &&
|
|
test_cmp_rev c HEAD~3 &&
|
|
test_cmp_rev c HEAD^2^ &&
|
|
test_revision_subjects 'n e o w' HEAD~2 HEAD^2 HEAD^ HEAD
|
|
"
|
|
|
|
# f
|
|
# /
|
|
# a---b---c---g---h
|
|
# \
|
|
# d---gp--i
|
|
# \ \
|
|
# e-------u
|
|
#
|
|
# gp = cherry-picked g
|
|
# h = reverted g
|
|
test_expect_success 'setup of non-linear-history for patch-equivalence tests' '
|
|
git checkout e &&
|
|
test_merge u i
|
|
'
|
|
|
|
test_expect_success "rebase -p re-creates history around dropped commit matching upstream" "
|
|
reset_rebase &&
|
|
git rebase -p h u &&
|
|
test_cmp_rev h HEAD~3 &&
|
|
test_cmp_rev HEAD^2^ HEAD~2 &&
|
|
test_revision_subjects 'd i e u' HEAD~2 HEAD^2 HEAD^ HEAD
|
|
"
|
|
|
|
test_expect_success "rebase -p --onto in merged history drops patches in upstream" "
|
|
reset_rebase &&
|
|
git rebase -p --onto f h u &&
|
|
test_cmp_rev f HEAD~3 &&
|
|
test_cmp_rev HEAD^2^ HEAD~2 &&
|
|
test_revision_subjects 'd i e u' HEAD~2 HEAD^2 HEAD^ HEAD
|
|
"
|
|
|
|
test_expect_success "rebase -p --onto in merged history does not drop patches in onto" "
|
|
reset_rebase &&
|
|
git rebase -p --onto h f u &&
|
|
test_cmp_rev h HEAD~3 &&
|
|
test_cmp_rev HEAD^2~2 HEAD~2 &&
|
|
test_revision_subjects 'd gp i e u' HEAD~2 HEAD^2^ HEAD^2 HEAD^ HEAD
|
|
"
|
|
|
|
# a---b---c---g---h
|
|
# \
|
|
# d---gp--s
|
|
# \ \ /
|
|
# \ X
|
|
# \ / \
|
|
# e---t
|
|
#
|
|
# gp = cherry-picked g
|
|
# h = reverted g
|
|
test_expect_success 'setup of non-linear-history for dropping whole side' '
|
|
git checkout gp &&
|
|
test_merge s e &&
|
|
git checkout e &&
|
|
test_merge t gp
|
|
'
|
|
|
|
test_expect_failure "rebase -p drops merge commit when entire first-parent side is dropped" "
|
|
reset_rebase &&
|
|
git rebase -p h s &&
|
|
test_cmp_rev h HEAD~2 &&
|
|
test_linear_range 'd e' h..
|
|
"
|
|
|
|
test_expect_success "rebase -p drops merge commit when entire second-parent side is dropped" "
|
|
reset_rebase &&
|
|
git rebase -p h t &&
|
|
test_cmp_rev h HEAD~2 &&
|
|
test_linear_range 'd e' h..
|
|
"
|
|
|
|
# a---b---c
|
|
# \
|
|
# d---e
|
|
# \ \
|
|
# n---r
|
|
# \
|
|
# o
|
|
#
|
|
# r = tree-same with n
|
|
test_expect_success 'setup of non-linear-history for empty commits' '
|
|
git checkout n &&
|
|
git merge --no-commit e &&
|
|
git reset n . &&
|
|
git commit -m r &&
|
|
git reset --hard &&
|
|
git clean -f &&
|
|
git tag r
|
|
'
|
|
|
|
test_expect_success "rebase -p re-creates empty internal merge commit" "
|
|
reset_rebase &&
|
|
git rebase -p c r &&
|
|
test_cmp_rev c HEAD~3 &&
|
|
test_cmp_rev HEAD^2^ HEAD~2 &&
|
|
test_revision_subjects 'd e n r' HEAD~2 HEAD^2 HEAD^ HEAD
|
|
"
|
|
|
|
test_expect_success "rebase -p re-creates empty merge commit" "
|
|
reset_rebase &&
|
|
git rebase -p o r &&
|
|
test_cmp_rev e HEAD^2 &&
|
|
test_cmp_rev o HEAD^ &&
|
|
test_revision_subjects 'r' HEAD
|
|
"
|
|
|
|
test_done
|