260 lines
		
	
	
	
		
			5.7 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			260 lines
		
	
	
	
		
			5.7 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..
 | 
						|
	"
 | 
						|
}
 | 
						|
test_run_rebase success 'n o e' ''
 | 
						|
test_run_rebase success 'n o e' -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..
 | 
						|
	"
 | 
						|
}
 | 
						|
test_run_rebase success 'd n o e' ''
 | 
						|
test_run_rebase success 'd n o e' -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..
 | 
						|
	"
 | 
						|
}
 | 
						|
test_run_rebase success 'd n o e' ''
 | 
						|
test_run_rebase success 'd n o e' -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
 |