164 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			164 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/bin/sh
 | |
| 
 | |
| test_description='git merge
 | |
| 
 | |
| Testing octopus merge when reducing parents to independent branches.'
 | |
| 
 | |
| . ./test-lib.sh
 | |
| 
 | |
| # 0 - 1
 | |
| #   \ 2
 | |
| #   \ 3
 | |
| #   \ 4 - 5
 | |
| #
 | |
| # So 1, 2, 3 and 5 should be kept, 4 should be avoided.
 | |
| 
 | |
| test_expect_success 'setup' '
 | |
| 	echo c0 > c0.c &&
 | |
| 	git add c0.c &&
 | |
| 	git commit -m c0 &&
 | |
| 	git tag c0 &&
 | |
| 	echo c1 > c1.c &&
 | |
| 	git add c1.c &&
 | |
| 	git commit -m c1 &&
 | |
| 	git tag c1 &&
 | |
| 	git reset --hard c0 &&
 | |
| 	echo c2 > c2.c &&
 | |
| 	git add c2.c &&
 | |
| 	git commit -m c2 &&
 | |
| 	git tag c2 &&
 | |
| 	git reset --hard c0 &&
 | |
| 	echo c3 > c3.c &&
 | |
| 	git add c3.c &&
 | |
| 	git commit -m c3 &&
 | |
| 	git tag c3 &&
 | |
| 	git reset --hard c0 &&
 | |
| 	echo c4 > c4.c &&
 | |
| 	git add c4.c &&
 | |
| 	git commit -m c4 &&
 | |
| 	git tag c4 &&
 | |
| 	echo c5 > c5.c &&
 | |
| 	git add c5.c &&
 | |
| 	git commit -m c5 &&
 | |
| 	git tag c5
 | |
| '
 | |
| 
 | |
| test_expect_success 'merge c1 with c2, c3, c4, c5' '
 | |
| 	git reset --hard c1 &&
 | |
| 	git merge c2 c3 c4 c5 &&
 | |
| 	test "$(git rev-parse c1)" != "$(git rev-parse HEAD)" &&
 | |
| 	test "$(git rev-parse c1)" = "$(git rev-parse HEAD^1)" &&
 | |
| 	test "$(git rev-parse c2)" = "$(git rev-parse HEAD^2)" &&
 | |
| 	test "$(git rev-parse c3)" = "$(git rev-parse HEAD^3)" &&
 | |
| 	test "$(git rev-parse c5)" = "$(git rev-parse HEAD^4)" &&
 | |
| 	git diff --exit-code &&
 | |
| 	test -f c0.c &&
 | |
| 	test -f c1.c &&
 | |
| 	test -f c2.c &&
 | |
| 	test -f c3.c &&
 | |
| 	test -f c4.c &&
 | |
| 	test -f c5.c &&
 | |
| 	git show --format=%s -s >actual &&
 | |
| 	! grep c1 actual &&
 | |
| 	grep c2 actual &&
 | |
| 	grep c3 actual &&
 | |
| 	! grep c4 actual &&
 | |
| 	grep c5 actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'pull c2, c3, c4, c5 into c1' '
 | |
| 	git reset --hard c1 &&
 | |
| 	git pull . c2 c3 c4 c5 &&
 | |
| 	test "$(git rev-parse c1)" != "$(git rev-parse HEAD)" &&
 | |
| 	test "$(git rev-parse c1)" = "$(git rev-parse HEAD^1)" &&
 | |
| 	test "$(git rev-parse c2)" = "$(git rev-parse HEAD^2)" &&
 | |
| 	test "$(git rev-parse c3)" = "$(git rev-parse HEAD^3)" &&
 | |
| 	test "$(git rev-parse c5)" = "$(git rev-parse HEAD^4)" &&
 | |
| 	git diff --exit-code &&
 | |
| 	test -f c0.c &&
 | |
| 	test -f c1.c &&
 | |
| 	test -f c2.c &&
 | |
| 	test -f c3.c &&
 | |
| 	test -f c4.c &&
 | |
| 	test -f c5.c &&
 | |
| 	git show --format=%s -s >actual &&
 | |
| 	! grep c1 actual &&
 | |
| 	grep c2 actual &&
 | |
| 	grep c3 actual &&
 | |
| 	! grep c4 actual &&
 | |
| 	grep c5 actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'setup' '
 | |
| 	for i in A B C D E
 | |
| 	do
 | |
| 		echo $i > $i.c &&
 | |
| 		git add $i.c &&
 | |
| 		git commit -m $i &&
 | |
| 		git tag $i
 | |
| 	done &&
 | |
| 	git reset --hard A &&
 | |
| 	for i in F G H I
 | |
| 	do
 | |
| 		echo $i > $i.c &&
 | |
| 		git add $i.c &&
 | |
| 		git commit -m $i &&
 | |
| 		git tag $i
 | |
| 	done
 | |
| '
 | |
| 
 | |
| test_expect_success 'merge E and I' '
 | |
| 	git reset --hard A &&
 | |
| 	git merge E I
 | |
| '
 | |
| 
 | |
| test_expect_success 'verify merge result' '
 | |
| 	test $(git rev-parse HEAD^1) = $(git rev-parse E) &&
 | |
| 	test $(git rev-parse HEAD^2) = $(git rev-parse I)
 | |
| '
 | |
| 
 | |
| test_expect_success 'add conflicts' '
 | |
| 	git reset --hard E &&
 | |
| 	echo foo > file.c &&
 | |
| 	git add file.c &&
 | |
| 	git commit -m E2 &&
 | |
| 	git tag E2 &&
 | |
| 	git reset --hard I &&
 | |
| 	echo bar >file.c &&
 | |
| 	git add file.c &&
 | |
| 	git commit -m I2 &&
 | |
| 	git tag I2
 | |
| '
 | |
| 
 | |
| test_expect_success 'merge E2 and I2, causing a conflict and resolve it' '
 | |
| 	git reset --hard A &&
 | |
| 	test_must_fail git merge E2 I2 &&
 | |
| 	echo baz > file.c &&
 | |
| 	git add file.c &&
 | |
| 	git commit -m "resolve conflict"
 | |
| '
 | |
| 
 | |
| test_expect_success 'verify merge result' '
 | |
| 	test $(git rev-parse HEAD^1) = $(git rev-parse E2) &&
 | |
| 	test $(git rev-parse HEAD^2) = $(git rev-parse I2)
 | |
| '
 | |
| 
 | |
| test_expect_success 'fast-forward to redundant refs' '
 | |
| 	git reset --hard c0 &&
 | |
| 	git merge c4 c5
 | |
| '
 | |
| 
 | |
| test_expect_success 'verify merge result' '
 | |
| 	test $(git rev-parse HEAD) = $(git rev-parse c5)
 | |
| '
 | |
| 
 | |
| test_expect_success 'merge up-to-date redundant refs' '
 | |
| 	git reset --hard c5 &&
 | |
| 	git merge c0 c4
 | |
| '
 | |
| 
 | |
| test_expect_success 'verify merge result' '
 | |
| 	test $(git rev-parse HEAD) = $(git rev-parse c5)
 | |
| '
 | |
| 
 | |
| test_done
 |