| #!/bin/sh | 
 | # | 
 | # Copyright(C) 2008 Stephen Habermann & Andreas Ericsson | 
 | # | 
 | test_description='git rebase -p should preserve merges | 
 |  | 
 | Run "git rebase -p" and check that merges are properly carried along | 
 | ' | 
 | . ./test-lib.sh | 
 |  | 
 | GIT_AUTHOR_EMAIL=bogus_email_address | 
 | export GIT_AUTHOR_EMAIL | 
 |  | 
 | # Clone 1 (trivial merge): | 
 | # | 
 | # A1--A2  <-- origin/master | 
 | #  \   \ | 
 | #   B1--M  <-- topic | 
 | #    \ | 
 | #     B2  <-- origin/topic | 
 | # | 
 | # Clone 2 (conflicting merge): | 
 | # | 
 | # A1--A2--B3   <-- origin/master | 
 | #  \       \ | 
 | #   B1------M  <-- topic | 
 | #    \ | 
 | #     B2       <-- origin/topic | 
 | # | 
 | # Clone 3 (no-ff merge): | 
 | # | 
 | # A1--A2--B3   <-- origin/master | 
 | #  \ | 
 | #   B1------M  <-- topic | 
 | #    \     / | 
 | #     \--A3    <-- topic2 | 
 | #      \ | 
 | #       B2     <-- origin/topic | 
 | # | 
 | # Clone 4 (merge using second parent as base): | 
 | # | 
 | # A1--A2--B3   <-- origin/master | 
 | #  \ | 
 | #   B1--A3--M  <-- topic | 
 | #    \     / | 
 | #     \--A4    <-- topic2 | 
 | #      \ | 
 | #       B2     <-- origin/topic | 
 |  | 
 | test_expect_success 'setup for merge-preserving rebase' \ | 
 | 	'echo First > A && | 
 | 	git add A && | 
 | 	git commit -m "Add A1" && | 
 | 	git checkout -b topic && | 
 | 	echo Second > B && | 
 | 	git add B && | 
 | 	git commit -m "Add B1" && | 
 | 	git checkout -f master && | 
 | 	echo Third >> A && | 
 | 	git commit -a -m "Modify A2" && | 
 |  | 
 | 	git clone ./. clone1 && | 
 | 	(cd clone1 && | 
 | 	git checkout -b topic origin/topic && | 
 | 	git merge origin/master | 
 | 	) && | 
 |  | 
 | 	git clone ./. clone4 && | 
 | 	( | 
 | 		cd clone4 && | 
 | 		git checkout -b topic origin/topic && | 
 | 		git merge origin/master | 
 | 	) && | 
 |  | 
 | 	echo Fifth > B && | 
 | 	git add B && | 
 | 	git commit -m "Add different B" && | 
 |  | 
 | 	git clone ./. clone2 && | 
 | 	( | 
 | 		cd clone2 && | 
 | 		git checkout -b topic origin/topic && | 
 | 		test_must_fail git merge origin/master && | 
 | 		echo Resolved >B && | 
 | 		git add B && | 
 | 		git commit -m "Merge origin/master into topic" | 
 | 	) && | 
 |  | 
 | 	git clone ./. clone3 && | 
 | 	( | 
 | 		cd clone3 && | 
 | 		git checkout -b topic2 origin/topic && | 
 | 		echo Sixth > A && | 
 | 		git commit -a -m "Modify A3" && | 
 | 		git checkout -b topic origin/topic && | 
 | 		git merge --no-ff topic2 | 
 | 	) && | 
 |  | 
 | 	git checkout topic && | 
 | 	echo Fourth >> B && | 
 | 	git commit -a -m "Modify B2" | 
 | ' | 
 |  | 
 | test_expect_success 'rebase -p fakes interactive rebase' ' | 
 | 	( | 
 | 	cd clone1 && | 
 | 	git fetch && | 
 | 	git rebase -p origin/topic && | 
 | 	test 1 = $(git rev-list --all --pretty=oneline | grep "Modify A" | wc -l) && | 
 | 	test 1 = $(git rev-list --all --pretty=oneline | grep "Merge remote-tracking branch " | wc -l) | 
 | 	) | 
 | ' | 
 |  | 
 | test_expect_success '--continue works after a conflict' ' | 
 | 	( | 
 | 	cd clone2 && | 
 | 	git fetch && | 
 | 	test_must_fail git rebase -p origin/topic && | 
 | 	test 2 = $(git ls-files B | wc -l) && | 
 | 	echo Resolved again > B && | 
 | 	test_must_fail git rebase --continue && | 
 | 	grep "^@@@ " .git/rebase-merge/patch && | 
 | 	git add B && | 
 | 	git rebase --continue && | 
 | 	test 1 = $(git rev-list --all --pretty=oneline | grep "Modify A" | wc -l) && | 
 | 	test 1 = $(git rev-list --all --pretty=oneline | grep "Add different" | wc -l) && | 
 | 	test 1 = $(git rev-list --all --pretty=oneline | grep "Merge origin" | wc -l) | 
 | 	) | 
 | ' | 
 |  | 
 | test_expect_success 'rebase -p preserves no-ff merges' ' | 
 | 	( | 
 | 	cd clone3 && | 
 | 	git fetch && | 
 | 	git rebase -p origin/topic && | 
 | 	test 3 = $(git rev-list --all --pretty=oneline | grep "Modify A" | wc -l) && | 
 | 	test 1 = $(git rev-list --all --pretty=oneline | grep "Merge branch" | wc -l) | 
 | 	) | 
 | ' | 
 |  | 
 | test_expect_success 'rebase -p works when base inside second parent' ' | 
 | 	( | 
 | 	cd clone4 && | 
 | 	git fetch && | 
 | 	git rebase -p HEAD^2 && | 
 | 	test 1 = $(git rev-list --all --pretty=oneline | grep "Modify A" | wc -l) && | 
 | 	test 1 = $(git rev-list --all --pretty=oneline | grep "Modify B" | wc -l) && | 
 | 	test 1 = $(git rev-list --all --pretty=oneline | grep "Merge remote-tracking branch " | wc -l) | 
 | 	) | 
 | ' | 
 |  | 
 | test_done |