]> git.proxmox.com Git - libgit2.git/blame - tests/merge/trees/recursive.c
merge tests: add complex recursive example
[libgit2.git] / tests / merge / trees / recursive.c
CommitLineData
86c8d02c
ET
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
7static git_repository *repo;
8
9#define TEST_REPO_PATH "merge-recursive"
10
11void test_merge_trees_recursive__initialize(void)
12{
13 repo = cl_git_sandbox_init(TEST_REPO_PATH);
14}
15
16void test_merge_trees_recursive__cleanup(void)
17{
18 cl_git_sandbox_cleanup();
19}
20
99d9d9a4 21void test_merge_trees_recursive__one_base_commit(void)
86c8d02c
ET
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
99d9d9a4 42void test_merge_trees_recursive__one_base_commit_norecursive(void)
86c8d02c
ET
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
99d9d9a4 65void test_merge_trees_recursive__two_base_commits(void)
86c8d02c
ET
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
99d9d9a4 86void test_merge_trees_recursive__two_base_commits_norecursive(void)
86c8d02c
ET
87{
88 git_index *index;
89 git_merge_options opts = GIT_MERGE_OPTIONS_INIT;
90
86c8d02c
ET
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
cdb6c1c8
ET
102 opts.flags |= GIT_MERGE_NO_RECURSIVE;
103
86c8d02c
ET
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
99d9d9a4 111void test_merge_trees_recursive__two_levels_of_multiple_bases(void)
cdb6c1c8
ET
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
99d9d9a4 132void test_merge_trees_recursive__two_levels_of_multiple_bases_norecursive(void)
cdb6c1c8
ET
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
99d9d9a4 157void test_merge_trees_recursive__three_levels_of_multiple_bases(void)
a200bcf7
ET
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
99d9d9a4 178void test_merge_trees_recursive__three_levels_of_multiple_bases_norecursive(void)
a200bcf7
ET
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
fccad82e
ET
203void 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
224void 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
b1eef912
ET
249void 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
34a51428
ET
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 */
280void 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}