]> git.proxmox.com Git - libgit2.git/blob - tests/merge/trees/recursive.c
New upstream version 1.4.3+dfsg.1
[libgit2.git] / tests / merge / trees / recursive.c
1 #include "clar_libgit2.h"
2 #include "git2/repository.h"
3 #include "git2/merge.h"
4 #include "merge.h"
5 #include "../merge_helpers.h"
6
7 static git_repository *repo;
8
9 #define TEST_REPO_PATH "merge-recursive"
10
11 void test_merge_trees_recursive__initialize(void)
12 {
13 repo = cl_git_sandbox_init(TEST_REPO_PATH);
14 }
15
16 void test_merge_trees_recursive__cleanup(void)
17 {
18 cl_git_sandbox_cleanup();
19 }
20
21 void test_merge_trees_recursive__one_base_commit(void)
22 {
23 git_index *index;
24 git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
25
26 struct merge_index_entry merge_index_entries[] = {
27 { 0100644, "dea7215f259b2cced87d1bda6c72f8b4ce37a2ff", 0, "asparagus.txt" },
28 { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
29 { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
30 { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
31 { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
32 { 0100644, "94d2c01087f48213bd157222d54edfefd77c9bba", 0, "veal.txt" },
33 };
34
35 cl_git_pass(merge_commits_from_branches(&index, repo, "branchA-1", "branchA-2", &opts));
36
37 cl_assert(merge_test_index(index, merge_index_entries, 6));
38
39 git_index_free(index);
40 }
41
42 void test_merge_trees_recursive__one_base_commit_norecursive(void)
43 {
44 git_index *index;
45 git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
46
47 struct merge_index_entry merge_index_entries[] = {
48 { 0100644, "dea7215f259b2cced87d1bda6c72f8b4ce37a2ff", 0, "asparagus.txt" },
49 { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
50 { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
51 { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
52 { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
53 { 0100644, "94d2c01087f48213bd157222d54edfefd77c9bba", 0, "veal.txt" },
54 };
55
56 opts.flags |= GIT_MERGE_NO_RECURSIVE;
57
58 cl_git_pass(merge_commits_from_branches(&index, repo, "branchA-1", "branchA-2", &opts));
59
60 cl_assert(merge_test_index(index, merge_index_entries, 6));
61
62 git_index_free(index);
63 }
64
65 void test_merge_trees_recursive__two_base_commits(void)
66 {
67 git_index *index;
68 git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
69
70 struct merge_index_entry merge_index_entries[] = {
71 { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
72 { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
73 { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
74 { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
75 { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
76 { 0100644, "666ffdfcf1eaa5641fa31064bf2607327e843c09", 0, "veal.txt" },
77 };
78
79 cl_git_pass(merge_commits_from_branches(&index, repo, "branchB-1", "branchB-2", &opts));
80
81 cl_assert(merge_test_index(index, merge_index_entries, 6));
82
83 git_index_free(index);
84 }
85
86 void test_merge_trees_recursive__two_base_commits_norecursive(void)
87 {
88 git_index *index;
89 git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
90
91 struct merge_index_entry merge_index_entries[] = {
92 { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
93 { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
94 { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
95 { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
96 { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
97 { 0100644, "cb49ad76147f5f9439cbd6133708b76142660660", 1, "veal.txt" },
98 { 0100644, "b2a81ead9e722af0099fccfb478cea88eea749a2", 2, "veal.txt" },
99 { 0100644, "4e21d2d63357bde5027d1625f5ec6b430cdeb143", 3, "veal.txt" },
100 };
101
102 opts.flags |= GIT_MERGE_NO_RECURSIVE;
103
104 cl_git_pass(merge_commits_from_branches(&index, repo, "branchB-1", "branchB-2", &opts));
105
106 cl_assert(merge_test_index(index, merge_index_entries, 8));
107
108 git_index_free(index);
109 }
110
111 void test_merge_trees_recursive__two_levels_of_multiple_bases(void)
112 {
113 git_index *index;
114 git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
115
116 struct merge_index_entry merge_index_entries[] = {
117 { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
118 { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
119 { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
120 { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
121 { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
122 { 0100644, "15faa0c9991f2d65686e844651faa2ff9827887b", 0, "veal.txt" },
123 };
124
125 cl_git_pass(merge_commits_from_branches(&index, repo, "branchC-1", "branchC-2", &opts));
126
127 cl_assert(merge_test_index(index, merge_index_entries, 6));
128
129 git_index_free(index);
130 }
131
132 void test_merge_trees_recursive__two_levels_of_multiple_bases_norecursive(void)
133 {
134 git_index *index;
135 git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
136
137 struct merge_index_entry merge_index_entries[] = {
138 { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
139 { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
140 { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
141 { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
142 { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
143 { 0100644, "b2a81ead9e722af0099fccfb478cea88eea749a2", 1, "veal.txt" },
144 { 0100644, "898d12687fb35be271c27c795a6b32c8b51da79e", 2, "veal.txt" },
145 { 0100644, "68a2e1ee61a23a4728fe6b35580fbbbf729df370", 3, "veal.txt" },
146 };
147
148 opts.flags |= GIT_MERGE_NO_RECURSIVE;
149
150 cl_git_pass(merge_commits_from_branches(&index, repo, "branchC-1", "branchC-2", &opts));
151
152 cl_assert(merge_test_index(index, merge_index_entries, 8));
153
154 git_index_free(index);
155 }
156
157 void test_merge_trees_recursive__three_levels_of_multiple_bases(void)
158 {
159 git_index *index;
160 git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
161
162 struct merge_index_entry merge_index_entries[] = {
163 { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
164 { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
165 { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
166 { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
167 { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
168 { 0100644, "d55e5dc038c52f1a36548625bcb666cbc06db9e6", 0, "veal.txt" },
169 };
170
171 cl_git_pass(merge_commits_from_branches(&index, repo, "branchD-2", "branchD-1", &opts));
172
173 cl_assert(merge_test_index(index, merge_index_entries, 6));
174
175 git_index_free(index);
176 }
177
178 void test_merge_trees_recursive__three_levels_of_multiple_bases_norecursive(void)
179 {
180 git_index *index;
181 git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
182
183 struct merge_index_entry merge_index_entries[] = {
184 { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
185 { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
186 { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
187 { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
188 { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
189 { 0100644, "898d12687fb35be271c27c795a6b32c8b51da79e", 1, "veal.txt" },
190 { 0100644, "f1b44c04989a3a1c14b036cfadfa328d53a7bc5e", 2, "veal.txt" },
191 { 0100644, "5e8747f5200fac0f945a07daf6163ca9cb1a8da9", 3, "veal.txt" },
192 };
193
194 opts.flags |= GIT_MERGE_NO_RECURSIVE;
195
196 cl_git_pass(merge_commits_from_branches(&index, repo, "branchD-2", "branchD-1", &opts));
197
198 cl_assert(merge_test_index(index, merge_index_entries, 8));
199
200 git_index_free(index);
201 }
202
203 void test_merge_trees_recursive__three_base_commits(void)
204 {
205 git_index *index;
206 git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
207
208 struct merge_index_entry merge_index_entries[] = {
209 { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
210 { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
211 { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
212 { 0100644, "c4f7269b07c76d02755d75ccaf05c0b4c36cdc6c", 0, "gravy.txt" },
213 { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
214 { 0100644, "a7b066537e6be7109abfe4ff97b675d4e077da20", 0, "veal.txt" },
215 };
216
217 cl_git_pass(merge_commits_from_branches(&index, repo, "branchE-1", "branchE-2", &opts));
218
219 cl_assert(merge_test_index(index, merge_index_entries, 6));
220
221 git_index_free(index);
222 }
223
224 void test_merge_trees_recursive__three_base_commits_norecursive(void)
225 {
226 git_index *index;
227 git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
228
229 struct merge_index_entry merge_index_entries[] = {
230 { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
231 { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
232 { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
233 { 0100644, "9e12bce04446d097ae1782967a5888c2e2a0d35b", 1, "gravy.txt" },
234 { 0100644, "d8dd349b78f19a4ebe3357bacb8138f00bf5ed41", 2, "gravy.txt" },
235 { 0100644, "e50fbbd701458757bdfe9815f58ed717c588d1b5", 3, "gravy.txt" },
236 { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
237 { 0100644, "a7b066537e6be7109abfe4ff97b675d4e077da20", 0, "veal.txt" },
238 };
239
240 opts.flags |= GIT_MERGE_NO_RECURSIVE;
241
242 cl_git_pass(merge_commits_from_branches(&index, repo, "branchE-1", "branchE-2", &opts));
243
244 cl_assert(merge_test_index(index, merge_index_entries, 8));
245
246 git_index_free(index);
247 }
248
249 void test_merge_trees_recursive__conflict(void)
250 {
251 git_index *index;
252 git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
253
254 struct merge_index_entry merge_index_entries[] = {
255 { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
256 { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
257 { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
258 { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
259 { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
260 { 0100644, "fa567f568ed72157c0c617438d077695b99d9aac", 1, "veal.txt" },
261 { 0100644, "21950d5e4e4d1a871b4dfcf72ecb6b9c162c434e", 2, "veal.txt" },
262 { 0100644, "3855170cef875708da06ab9ad7fc6a73b531cda1", 3, "veal.txt" },
263 };
264
265 cl_git_pass(merge_commits_from_branches(&index, repo, "branchF-1", "branchF-2", &opts));
266
267 cl_assert(merge_test_index(index, merge_index_entries, 8));
268
269 git_index_free(index);
270 }
271
272 /*
273 * Branch G-1 and G-2 have three common ancestors (815b5a1, ad2ace9, 483065d).
274 * The merge-base of the first two has two common ancestors (723181f, a34e5a1)
275 * which themselves have two common ancestors (8f35f30, 3a3f5a6), which
276 * finally has a common ancestor of 7c7bf85. This virtual merge base will
277 * be computed and merged with 483065d which also has a common ancestor of
278 * 7c7bf85.
279 */
280 void test_merge_trees_recursive__oh_so_many_levels_of_recursion(void)
281 {
282 git_index *index;
283 git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
284
285 struct merge_index_entry merge_index_entries[] = {
286 { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
287 { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
288 { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
289 { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
290 { 0100644, "7c7e08f9559d9e1551b91e1cf68f1d0066109add", 0, "oyster.txt" },
291 { 0100644, "898d12687fb35be271c27c795a6b32c8b51da79e", 0, "veal.txt" },
292 };
293
294 cl_git_pass(merge_commits_from_branches(&index, repo, "branchG-1", "branchG-2", &opts));
295
296 cl_assert(merge_test_index(index, merge_index_entries, 6));
297
298 git_index_free(index);
299 }
300
301 /* Branch H-1 and H-2 have two common ancestors (aa9e263, 6ef31d3). The two
302 * ancestors themselves conflict.
303 */
304 void test_merge_trees_recursive__conflicting_merge_base(void)
305 {
306 git_index *index;
307 git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
308
309 struct merge_index_entry merge_index_entries[] = {
310 { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
311 { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
312 { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
313 { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
314 { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
315 { 0100644, "cfc01b0976122eae42a82064440bbf534eddd7a0", 1, "veal.txt" },
316 { 0100644, "d604c75019c282144bdbbf3fd3462ba74b240efc", 2, "veal.txt" },
317 { 0100644, "37a5054a9f9b4628e3924c5cb8f2147c6e2a3efc", 3, "veal.txt" },
318 };
319
320 cl_git_pass(merge_commits_from_branches(&index, repo, "branchH-1", "branchH-2", &opts));
321
322 cl_assert(merge_test_index(index, merge_index_entries, 8));
323
324 git_index_free(index);
325 }
326
327 /* Branch H-1 and H-2 have two common ancestors (aa9e263, 6ef31d3). The two
328 * ancestors themselves conflict. The generated common ancestor file will
329 * have diff3 style conflicts inside it.
330 */
331 void test_merge_trees_recursive__conflicting_merge_base_with_diff3(void)
332 {
333 git_index *index;
334 git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
335
336 struct merge_index_entry merge_index_entries[] = {
337 { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
338 { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
339 { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
340 { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
341 { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
342 { 0100644, "0b01d2f70a1c6b9ab60c382f3f9cdc8173da6736", 1, "veal.txt" },
343 { 0100644, "37a5054a9f9b4628e3924c5cb8f2147c6e2a3efc", 2, "veal.txt" },
344 { 0100644, "d604c75019c282144bdbbf3fd3462ba74b240efc", 3, "veal.txt" },
345 };
346
347 opts.file_flags |= GIT_MERGE_FILE_STYLE_DIFF3;
348
349 cl_git_pass(merge_commits_from_branches(&index, repo, "branchH-2", "branchH-1", &opts));
350
351 cl_assert(merge_test_index(index, merge_index_entries, 8));
352
353 git_index_free(index);
354 }
355
356 /* Branch I-1 and I-2 have two common ancestors (aa9e263, 6ef31d3). The two
357 * ancestors themselves conflict, but when each was merged, the conflicts were
358 * resolved identically, thus merging I-1 into I-2 does not conflict.
359 */
360 void test_merge_trees_recursive__conflicting_merge_base_since_resolved(void)
361 {
362 git_index *index;
363 git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
364
365 struct merge_index_entry merge_index_entries[] = {
366 { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
367 { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
368 { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
369 { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
370 { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
371 { 0100644, "a02d4fd126e0cc8fb46ee48cf38bad36d44f2dbc", 0, "veal.txt" },
372 };
373
374 cl_git_pass(merge_commits_from_branches(&index, repo, "branchI-1", "branchI-2", &opts));
375
376 cl_assert(merge_test_index(index, merge_index_entries, 6));
377
378 git_index_free(index);
379 }
380
381 /* There are multiple levels of criss-cross merges, and multiple recursive
382 * merges would create a common ancestor that allows the merge to complete
383 * successfully. Test that we can build a single virtual base, then stop,
384 * which will produce a conflicting merge.
385 */
386 void test_merge_trees_recursive__recursionlimit(void)
387 {
388 git_index *index;
389 git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
390
391 struct merge_index_entry merge_index_entries[] = {
392 { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
393 { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
394 { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
395 { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
396 { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
397 { 0100644, "53217e8ac3f52bccf7603b8fff0ed0f4817f9bb7", 1, "veal.txt" },
398 { 0100644, "898d12687fb35be271c27c795a6b32c8b51da79e", 2, "veal.txt" },
399 { 0100644, "68a2e1ee61a23a4728fe6b35580fbbbf729df370", 3, "veal.txt" },
400 };
401
402 opts.recursion_limit = 1;
403
404 cl_git_pass(merge_commits_from_branches(&index, repo, "branchC-1", "branchC-2", &opts));
405
406 cl_assert(merge_test_index(index, merge_index_entries, 8));
407
408 git_index_free(index);
409 }
410
411 /* There are multiple levels of criss-cross merges. This ensures
412 * that the virtual merge base parents are compared in the same
413 * order as git. If the base parents are created in the order as
414 * git does, then the file `targetfile.txt` is automerged. If not,
415 * `targetfile.txt` will be in conflict due to the virtual merge
416 * base.
417 */
418 void test_merge_trees_recursive__merge_base_for_virtual_commit(void)
419 {
420 git_index *index;
421 git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
422
423 struct merge_index_entry merge_index_entries[] = {
424 { 0100644, "1bde1883de4977ea3e664b315da951d1f614c3b1", 0, "targetfile.txt" },
425 { 0100644, "b7de2b52ba055688061355fad1599a5d214ce8f8", 1, "version.txt" },
426 { 0100644, "358efd6f589384fa8baf92234db9c7899a53916e", 2, "version.txt" },
427 { 0100644, "a664873b1c0b9a1ed300f8644dde536fdaa3a34f", 3, "version.txt" },
428 };
429
430 cl_git_pass(merge_commits_from_branches(&index, repo, "branchJ-1", "branchJ-2", &opts));
431
432 cl_assert(merge_test_index(index, merge_index_entries, 4));
433
434 git_index_free(index);
435 }
436
437 /* This test is the same as above, but the graph is constructed such
438 * that the 1st-recursion merge bases of the two heads are
439 * in a different order.
440 */
441 void test_merge_trees_recursive__merge_base_for_virtual_commit_2(void)
442 {
443 git_index *index;
444 git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
445
446 struct merge_index_entry merge_index_entries[] = {
447 { 0100644, "4a06b258fed8a4d15967ec4253ae7366b70f727d", 0, "targetfile.txt" },
448 { 0100644, "b6bd0f9952f396e757d3f91e08c59a7e91707201", 1, "version.txt" },
449 { 0100644, "f0856993e005c0d8ed2dc7cdc222cc1d89fb3c77", 2, "version.txt" },
450 { 0100644, "2cba583804a4a6fad1baf97c959be447238d1489", 3, "version.txt" },
451 };
452
453 cl_git_pass(merge_commits_from_branches(&index, repo, "branchK-1", "branchK-2", &opts));
454
455 cl_assert(merge_test_index(index, merge_index_entries, 4));
456
457 git_index_free(index);
458 }