summaryrefslogtreecommitdiffstats
path: root/t/t6404-recursive-merge.sh
blob: 36215518b6eb1a746ded0f9b475a7d3029b807a6 (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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#!/bin/sh

test_description='Test merge without common ancestors'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME

TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh

# This scenario is based on a real-world repository of Shawn Pearce.

# 1 - A - D - F
#   \   X   /
#     B   X
#       X   \
# 2 - C - E - G

GIT_COMMITTER_DATE="2006-12-12 23:28:00 +0100"
export GIT_COMMITTER_DATE

test_expect_success 'setup tests' '
	GIT_TEST_COMMIT_GRAPH=0 &&
	export GIT_TEST_COMMIT_GRAPH &&
	echo 1 >a1 &&
	git add a1 &&
	GIT_AUTHOR_DATE="2006-12-12 23:00:00" git commit -m 1 a1 &&

	git checkout -b A main &&
	echo A >a1 &&
	GIT_AUTHOR_DATE="2006-12-12 23:00:01" git commit -m A a1 &&

	git checkout -b B main &&
	echo B >a1 &&
	GIT_AUTHOR_DATE="2006-12-12 23:00:02" git commit -m B a1 &&

	git checkout -b D A &&
	git rev-parse B >.git/MERGE_HEAD &&
	echo D >a1 &&
	git update-index a1 &&
	GIT_AUTHOR_DATE="2006-12-12 23:00:03" git commit -m D &&

	git symbolic-ref HEAD refs/heads/other &&
	echo 2 >a1 &&
	GIT_AUTHOR_DATE="2006-12-12 23:00:04" git commit -m 2 a1 &&

	git checkout -b C &&
	echo C >a1 &&
	GIT_AUTHOR_DATE="2006-12-12 23:00:05" git commit -m C a1 &&

	git checkout -b E C &&
	git rev-parse B >.git/MERGE_HEAD &&
	echo E >a1 &&
	git update-index a1 &&
	GIT_AUTHOR_DATE="2006-12-12 23:00:06" git commit -m E &&

	git checkout -b G E &&
	git rev-parse A >.git/MERGE_HEAD &&
	echo G >a1 &&
	git update-index a1 &&
	GIT_AUTHOR_DATE="2006-12-12 23:00:07" git commit -m G &&

	git checkout -b F D &&
	git rev-parse C >.git/MERGE_HEAD &&
	echo F >a1 &&
	git update-index a1 &&
	GIT_AUTHOR_DATE="2006-12-12 23:00:08" git commit -m F &&

	test_oid_cache <<-EOF
	idxstage1 sha1:ec3fe2a791706733f2d8fa7ad45d9a9672031f5e
	idxstage1 sha256:b3c8488929903aaebdeb22270cb6d36e5b8724b01ae0d4da24632f158c99676f
	EOF
'

test_expect_success 'combined merge conflicts' '
	test_must_fail git merge -m final G
'

test_expect_success 'result contains a conflict' '
	cat >expect <<-\EOF &&
	<<<<<<< HEAD
	F
	=======
	G
	>>>>>>> G
	EOF

	test_cmp expect a1
'

test_expect_success 'virtual trees were processed' '
	# TODO: fragile test, relies on ambigious merge-base resolution
	git ls-files --stage >out &&

	cat >expect <<-EOF &&
	100644 $(test_oid idxstage1) 1	a1
	100644 $(git rev-parse F:a1) 2	a1
	100644 $(git rev-parse G:a1) 3	a1
	EOF

	test_cmp expect out
'

test_expect_success 'refuse to merge binary files' '
	git reset --hard &&
	printf "\0" >binary-file &&
	git add binary-file &&
	git commit -m binary &&
	git checkout G &&
	printf "\0\0" >binary-file &&
	git add binary-file &&
	git commit -m binary2 &&
	if test "$GIT_TEST_MERGE_ALGORITHM" = ort
	then
		test_must_fail git merge F >merge_output
	else
		test_must_fail git merge F 2>merge_output
	fi &&
	grep "Cannot merge binary files: binary-file (HEAD vs. F)" merge_output
'

test_expect_success 'mark rename/delete as unmerged' '

	git reset --hard &&
	git checkout -b delete &&
	git rm a1 &&
	test_tick &&
	git commit -m delete &&
	git checkout -b rename HEAD^ &&
	git mv a1 a2 &&
	test_tick &&
	git commit -m rename &&
	test_must_fail git merge delete &&
	if test "$GIT_TEST_MERGE_ALGORITHM" = ort
	then
		test 2 = $(git ls-files --unmerged | wc -l)
	else
		test 1 = $(git ls-files --unmerged | wc -l)
	fi &&
	git rev-parse --verify :2:a2 &&
	test_must_fail git rev-parse --verify :3:a2 &&
	git checkout -f delete &&
	test_must_fail git merge rename &&
	if test "$GIT_TEST_MERGE_ALGORITHM" = ort
	then
		test 2 = $(git ls-files --unmerged | wc -l)
	else
		test 1 = $(git ls-files --unmerged | wc -l)
	fi &&
	test_must_fail git rev-parse --verify :2:a2 &&
	git rev-parse --verify :3:a2
'

test_done