about summary refs log tree commit diff
path: root/t/t3031-merge-criscross.sh
diff options
context:
space:
mode:
Diffstat (limited to 't/t3031-merge-criscross.sh')
-rwxr-xr-xt/t3031-merge-criscross.sh95
1 files changed, 95 insertions, 0 deletions
diff --git a/t/t3031-merge-criscross.sh b/t/t3031-merge-criscross.sh
new file mode 100755
index 000000000000..3824756a02ec
--- /dev/null
+++ b/t/t3031-merge-criscross.sh
@@ -0,0 +1,95 @@
+#!/bin/sh
+
+test_description='merge-recursive backend test'
+
+. ./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