Merge branch 'jt/transfer-fsck-across-packs-fix'
[git] / t / t6427-diff3-conflict-markers.sh
1 #!/bin/sh
2
3 test_description='recursive merge diff3 style conflict markers'
4
5 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
6 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
7
8 . ./test-lib.sh
9
10 # Setup:
11 #          L1
12 #            \
13 #             ?
14 #            /
15 #          R1
16 #
17 # Where:
18 #   L1 and R1 both have a file named 'content' but have no common history
19 #
20
21 test_expect_success 'setup no merge base' '
22         test_create_repo no_merge_base &&
23         (
24                 cd no_merge_base &&
25
26                 git checkout -b L &&
27                 test_commit A content A &&
28
29                 git checkout --orphan R &&
30                 test_commit B content B
31         )
32 '
33
34 test_expect_success 'check no merge base' '
35         (
36                 cd no_merge_base &&
37
38                 git checkout L^0 &&
39
40                 test_must_fail git -c merge.conflictstyle=diff3 merge --allow-unrelated-histories -s recursive R^0 &&
41
42                 grep "|||||| empty tree" content
43         )
44 '
45
46 # Setup:
47 #          L1
48 #         /  \
49 #     main    ?
50 #         \  /
51 #          R1
52 #
53 # Where:
54 #   L1 and R1 have modified the same file ('content') in conflicting ways
55 #
56
57 test_expect_success 'setup unique merge base' '
58         test_create_repo unique_merge_base &&
59         (
60                 cd unique_merge_base &&
61
62                 test_commit base content "1
63 2
64 3
65 4
66 5
67 " &&
68
69                 git branch L &&
70                 git branch R &&
71
72                 git checkout L &&
73                 test_commit L content "1
74 2
75 3
76 4
77 5
78 7" &&
79
80                 git checkout R &&
81                 git rm content &&
82                 test_commit R renamed "1
83 2
84 3
85 4
86 5
87 six"
88         )
89 '
90
91 test_expect_success 'check unique merge base' '
92         (
93                 cd unique_merge_base &&
94
95                 git checkout L^0 &&
96                 MAIN=$(git rev-parse --short main) &&
97
98                 test_must_fail git -c merge.conflictstyle=diff3 merge -s recursive R^0 &&
99
100                 grep "|||||| $MAIN:content" renamed
101         )
102 '
103
104 # Setup:
105 #          L1---L2--L3
106 #         /  \ /      \
107 #     main    X1       ?
108 #         \  / \      /
109 #          R1---R2--R3
110 #
111 # Where:
112 #   commits L1 and R1 have modified the same file in non-conflicting ways
113 #   X1 is an auto-generated merge-base used when merging L1 and R1
114 #   commits L2 and R2 are merges of R1 and L1 into L1 and R1, respectively
115 #   commits L3 and R3 both modify 'content' in conflicting ways
116 #
117
118 test_expect_success 'setup multiple merge bases' '
119         test_create_repo multiple_merge_bases &&
120         (
121                 cd multiple_merge_bases &&
122
123                 test_commit initial content "1
124 2
125 3
126 4
127 5" &&
128
129                 git branch L &&
130                 git branch R &&
131
132                 # Create L1
133                 git checkout L &&
134                 test_commit L1 content "0
135 1
136 2
137 3
138 4
139 5" &&
140
141                 # Create R1
142                 git checkout R &&
143                 test_commit R1 content "1
144 2
145 3
146 4
147 5
148 6" &&
149
150                 # Create L2
151                 git checkout L &&
152                 git merge R1 &&
153
154                 # Create R2
155                 git checkout R &&
156                 git merge L1 &&
157
158                 # Create L3
159                 git checkout L &&
160                 test_commit L3 content "0
161 1
162 2
163 3
164 4
165 5
166 A" &&
167
168                 # Create R3
169                 git checkout R &&
170                 git rm content &&
171                 test_commit R3 renamed "0
172 2
173 3
174 4
175 5
176 six"
177         )
178 '
179
180 test_expect_success 'check multiple merge bases' '
181         (
182                 cd multiple_merge_bases &&
183
184                 git checkout L^0 &&
185
186                 test_must_fail git -c merge.conflictstyle=diff3 merge -s recursive R^0 &&
187
188                 grep "|||||| merged common ancestors:content" renamed
189         )
190 '
191
192 test_expect_success 'rebase --merge describes parent of commit being picked' '
193         test_create_repo rebase &&
194         (
195                 cd rebase &&
196                 test_commit base file &&
197                 test_commit main file &&
198                 git checkout -b side HEAD^ &&
199                 test_commit side file &&
200                 test_must_fail git -c merge.conflictstyle=diff3 rebase --merge main &&
201                 grep "||||||| parent of" file
202         )
203 '
204
205 test_expect_success 'rebase --apply describes fake ancestor base' '
206         (
207                 cd rebase &&
208                 git rebase --abort &&
209                 test_must_fail git -c merge.conflictstyle=diff3 rebase --apply main &&
210                 grep "||||||| constructed merge base" file
211         )
212 '
213
214 test_done