git/t/t6431-merge-criscross.sh

#!/bin/sh

test_description='merge-recursive backend test'

TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh

#         A      <- create some files
#        / \
#       B   C    <- cause rename/delete conflicts between B and C
#      /     \
#     |\     /|
#     | D   E |
#     |  \ /  |
#     |   X   |
#     |  / \  |
#     | /   \ |
#     |/     \|
#     F       G  <- merge E into B, D into C
#      \     /
#       \   /
#        \ /
#         H      <- recursive merge crashes
#

# initialize
test_expect_success 'setup repo with criss-cross history' '
	mkdir data &&

	# create a bunch of files
	n=1 &&
	while test $n -le 10
	do
		echo $n > data/$n &&
		n=$(($n+1)) ||
		return 1
	done &&

	# check them in
	git add data &&
	git commit -m A &&
	git branch A &&

	# a file in one branch
	git checkout -b B A &&
	git rm data/9 &&
	git add data &&
	git commit -m B &&

	# with a branch off of it
	git branch D &&

	# put some commits on D
	git checkout D &&
	echo testD > data/testD &&
	git add data &&
	git commit -m D &&

	# back up to the top, create another branch and cause
	# a rename conflict with the file we deleted earlier
	git checkout -b C A &&
	git mv data/9 data/new-9 &&
	git add data &&
	git commit -m C &&

	# with a branch off of it
	git branch E &&

	# put a commit on E
	git checkout E &&
	echo testE > data/testE &&
	git add data &&
	git commit -m E &&

	# now, merge E into B
	git checkout B &&
	test_must_fail git merge E &&
	# force-resolve
	git add data &&
	git commit -m F &&
	git branch F &&

	# and merge D into C
	git checkout C &&
	test_must_fail git merge D &&
	# force-resolve
	git add data &&
	git commit -m G &&
	git branch G
'

test_expect_success 'recursive merge between F and G does not cause segfault' '
	git merge F
'

test_done