summaryrefslogtreecommitdiffstats
path: root/t/t6431-merge-criscross.sh
blob: 3824756a02ec31c228e2eeda92fc13a33b1e4b75 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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