1#!/bin/sh
2
3test_description='merge-recursive backend test'
4
5. ./test-lib.sh
6
7#         A      <- create some files
8#        / \
9#       B   C    <- cause rename/delete conflicts between B and C
10#      /     \
11#     |\     /|
12#     | D   E |
13#     |  \ /  |
14#     |   X   |
15#     |  / \  |
16#     | /   \ |
17#     |/     \|
18#     F       G  <- merge E into B, D into C
19#      \     /
20#       \   /
21#        \ /
22#         H      <- recursive merge crashes
23#
24
25# initialize
26test_expect_success 'setup repo with criss-cross history' '
27	mkdir data &&
28
29	# create a bunch of files
30	n=1 &&
31	while test $n -le 10
32	do
33		echo $n > data/$n &&
34		n=$(($n+1)) ||
35		return 1
36	done &&
37
38	# check them in
39	git add data &&
40	git commit -m A &&
41	git branch A &&
42
43	# a file in one branch
44	git checkout -b B A &&
45	git rm data/9 &&
46	git add data &&
47	git commit -m B &&
48
49	# with a branch off of it
50	git branch D &&
51
52	# put some commits on D
53	git checkout D &&
54	echo testD > data/testD &&
55	git add data &&
56	git commit -m D &&
57
58	# back up to the top, create another branch and cause
59	# a rename conflict with the file we deleted earlier
60	git checkout -b C A &&
61	git mv data/9 data/new-9 &&
62	git add data &&
63	git commit -m C &&
64
65	# with a branch off of it
66	git branch E &&
67
68	# put a commit on E
69	git checkout E &&
70	echo testE > data/testE &&
71	git add data &&
72	git commit -m E &&
73
74	# now, merge E into B
75	git checkout B &&
76	test_must_fail git merge E &&
77	# force-resolve
78	git add data &&
79	git commit -m F &&
80	git branch F &&
81
82	# and merge D into C
83	git checkout C &&
84	test_must_fail git merge D &&
85	# force-resolve
86	git add data &&
87	git commit -m G &&
88	git branch G
89'
90
91test_expect_success 'recursive merge between F and G does not cause segfault' '
92	git merge F
93'
94
95test_done
96