]>
git.proxmox.com Git - libgit2.git/blob - tests/index/reuc.c
1 #include "clar_libgit2.h"
3 #include "git2/sys/index.h"
4 #include "git2/repository.h"
5 #include "../reset/reset_helpers.h"
7 static git_repository
*repo
;
8 static git_index
*repo_index
;
10 #define TEST_REPO_PATH "mergedrepo"
11 #define TEST_INDEX_PATH TEST_REPO_PATH "/.git/index"
13 #define ONE_ANCESTOR_OID "478871385b9cd03908c5383acfd568bef023c6b3"
14 #define ONE_OUR_OID "4458b8bc9e72b6c8755ae456f60e9844d0538d8c"
15 #define ONE_THEIR_OID "8b72416545c7e761b64cecad4f1686eae4078aa8"
17 #define TWO_ANCESTOR_OID "9d81f82fccc7dcd7de7a1ffead1815294c2e092c"
18 #define TWO_OUR_OID "8f3c06cff9a83757cec40c80bc9bf31a2582bde9"
19 #define TWO_THEIR_OID "887b153b165d32409c70163e0f734c090f12f673"
21 // Fixture setup and teardown
22 void test_index_reuc__initialize(void)
24 repo
= cl_git_sandbox_init("mergedrepo");
25 git_repository_index(&repo_index
, repo
);
28 void test_index_reuc__cleanup(void)
30 git_index_free(repo_index
);
33 cl_git_sandbox_cleanup();
36 void test_index_reuc__add(void)
38 git_oid ancestor_oid
, our_oid
, their_oid
;
39 const git_index_reuc_entry
*reuc
;
41 git_oid_fromstr(&ancestor_oid
, ONE_ANCESTOR_OID
);
42 git_oid_fromstr(&our_oid
, ONE_OUR_OID
);
43 git_oid_fromstr(&their_oid
, ONE_THEIR_OID
);
45 cl_git_pass(git_index_reuc_add(repo_index
, "newfile.txt",
46 0100644, &ancestor_oid
,
48 0100644, &their_oid
));
50 cl_assert(reuc
= git_index_reuc_get_bypath(repo_index
, "newfile.txt"));
52 cl_assert_equal_s("newfile.txt", reuc
->path
);
53 cl_assert(reuc
->mode
[0] == 0100644);
54 cl_assert(reuc
->mode
[1] == 0100644);
55 cl_assert(reuc
->mode
[2] == 0100644);
56 cl_assert(git_oid_cmp(&reuc
->oid
[0], &ancestor_oid
) == 0);
57 cl_assert(git_oid_cmp(&reuc
->oid
[1], &our_oid
) == 0);
58 cl_assert(git_oid_cmp(&reuc
->oid
[2], &their_oid
) == 0);
61 void test_index_reuc__add_no_ancestor(void)
63 git_oid ancestor_oid
, our_oid
, their_oid
;
64 const git_index_reuc_entry
*reuc
;
66 memset(&ancestor_oid
, 0x0, sizeof(git_oid
));
67 git_oid_fromstr(&our_oid
, ONE_OUR_OID
);
68 git_oid_fromstr(&their_oid
, ONE_THEIR_OID
);
70 cl_git_pass(git_index_reuc_add(repo_index
, "newfile.txt",
73 0100644, &their_oid
));
75 cl_assert(reuc
= git_index_reuc_get_bypath(repo_index
, "newfile.txt"));
77 cl_assert_equal_s("newfile.txt", reuc
->path
);
78 cl_assert(reuc
->mode
[0] == 0);
79 cl_assert(reuc
->mode
[1] == 0100644);
80 cl_assert(reuc
->mode
[2] == 0100644);
81 cl_assert(git_oid_cmp(&reuc
->oid
[0], &ancestor_oid
) == 0);
82 cl_assert(git_oid_cmp(&reuc
->oid
[1], &our_oid
) == 0);
83 cl_assert(git_oid_cmp(&reuc
->oid
[2], &their_oid
) == 0);
86 void test_index_reuc__read_bypath(void)
88 const git_index_reuc_entry
*reuc
;
91 cl_assert_equal_i(2, git_index_reuc_entrycount(repo_index
));
93 cl_assert(reuc
= git_index_reuc_get_bypath(repo_index
, "two.txt"));
95 cl_assert_equal_s("two.txt", reuc
->path
);
96 cl_assert(reuc
->mode
[0] == 0100644);
97 cl_assert(reuc
->mode
[1] == 0100644);
98 cl_assert(reuc
->mode
[2] == 0100644);
99 git_oid_fromstr(&oid
, TWO_ANCESTOR_OID
);
100 cl_assert(git_oid_cmp(&reuc
->oid
[0], &oid
) == 0);
101 git_oid_fromstr(&oid
, TWO_OUR_OID
);
102 cl_assert(git_oid_cmp(&reuc
->oid
[1], &oid
) == 0);
103 git_oid_fromstr(&oid
, TWO_THEIR_OID
);
104 cl_assert(git_oid_cmp(&reuc
->oid
[2], &oid
) == 0);
106 cl_assert(reuc
= git_index_reuc_get_bypath(repo_index
, "one.txt"));
108 cl_assert_equal_s("one.txt", reuc
->path
);
109 cl_assert(reuc
->mode
[0] == 0100644);
110 cl_assert(reuc
->mode
[1] == 0100644);
111 cl_assert(reuc
->mode
[2] == 0100644);
112 git_oid_fromstr(&oid
, ONE_ANCESTOR_OID
);
113 cl_assert(git_oid_cmp(&reuc
->oid
[0], &oid
) == 0);
114 git_oid_fromstr(&oid
, ONE_OUR_OID
);
115 cl_assert(git_oid_cmp(&reuc
->oid
[1], &oid
) == 0);
116 git_oid_fromstr(&oid
, ONE_THEIR_OID
);
117 cl_assert(git_oid_cmp(&reuc
->oid
[2], &oid
) == 0);
120 void test_index_reuc__ignore_case(void)
122 const git_index_reuc_entry
*reuc
;
126 index_caps
= git_index_caps(repo_index
);
128 index_caps
&= ~GIT_INDEXCAP_IGNORE_CASE
;
129 cl_git_pass(git_index_set_caps(repo_index
, index_caps
));
131 cl_assert(!git_index_reuc_get_bypath(repo_index
, "TWO.txt"));
133 index_caps
|= GIT_INDEXCAP_IGNORE_CASE
;
134 cl_git_pass(git_index_set_caps(repo_index
, index_caps
));
136 cl_assert_equal_i(2, git_index_reuc_entrycount(repo_index
));
138 cl_assert(reuc
= git_index_reuc_get_bypath(repo_index
, "TWO.txt"));
140 cl_assert_equal_s("two.txt", reuc
->path
);
141 cl_assert(reuc
->mode
[0] == 0100644);
142 cl_assert(reuc
->mode
[1] == 0100644);
143 cl_assert(reuc
->mode
[2] == 0100644);
144 git_oid_fromstr(&oid
, TWO_ANCESTOR_OID
);
145 cl_assert(git_oid_cmp(&reuc
->oid
[0], &oid
) == 0);
146 git_oid_fromstr(&oid
, TWO_OUR_OID
);
147 cl_assert(git_oid_cmp(&reuc
->oid
[1], &oid
) == 0);
148 git_oid_fromstr(&oid
, TWO_THEIR_OID
);
149 cl_assert(git_oid_cmp(&reuc
->oid
[2], &oid
) == 0);
152 void test_index_reuc__read_byindex(void)
154 const git_index_reuc_entry
*reuc
;
157 cl_assert_equal_i(2, git_index_reuc_entrycount(repo_index
));
159 cl_assert(reuc
= git_index_reuc_get_byindex(repo_index
, 0));
161 cl_assert_equal_s("one.txt", reuc
->path
);
162 cl_assert(reuc
->mode
[0] == 0100644);
163 cl_assert(reuc
->mode
[1] == 0100644);
164 cl_assert(reuc
->mode
[2] == 0100644);
165 git_oid_fromstr(&oid
, ONE_ANCESTOR_OID
);
166 cl_assert(git_oid_cmp(&reuc
->oid
[0], &oid
) == 0);
167 git_oid_fromstr(&oid
, ONE_OUR_OID
);
168 cl_assert(git_oid_cmp(&reuc
->oid
[1], &oid
) == 0);
169 git_oid_fromstr(&oid
, ONE_THEIR_OID
);
170 cl_assert(git_oid_cmp(&reuc
->oid
[2], &oid
) == 0);
172 cl_assert(reuc
= git_index_reuc_get_byindex(repo_index
, 1));
174 cl_assert_equal_s("two.txt", reuc
->path
);
175 cl_assert(reuc
->mode
[0] == 0100644);
176 cl_assert(reuc
->mode
[1] == 0100644);
177 cl_assert(reuc
->mode
[2] == 0100644);
178 git_oid_fromstr(&oid
, TWO_ANCESTOR_OID
);
179 cl_assert(git_oid_cmp(&reuc
->oid
[0], &oid
) == 0);
180 git_oid_fromstr(&oid
, TWO_OUR_OID
);
181 cl_assert(git_oid_cmp(&reuc
->oid
[1], &oid
) == 0);
182 git_oid_fromstr(&oid
, TWO_THEIR_OID
);
183 cl_assert(git_oid_cmp(&reuc
->oid
[2], &oid
) == 0);
186 void test_index_reuc__updates_existing(void)
188 const git_index_reuc_entry
*reuc
;
189 git_oid ancestor_oid
, our_oid
, their_oid
, oid
;
192 git_index_clear(repo_index
);
194 index_caps
= git_index_caps(repo_index
);
196 index_caps
|= GIT_INDEXCAP_IGNORE_CASE
;
197 cl_git_pass(git_index_set_caps(repo_index
, index_caps
));
199 git_oid_fromstr(&ancestor_oid
, TWO_ANCESTOR_OID
);
200 git_oid_fromstr(&our_oid
, TWO_OUR_OID
);
201 git_oid_fromstr(&their_oid
, TWO_THEIR_OID
);
203 cl_git_pass(git_index_reuc_add(repo_index
, "two.txt",
204 0100644, &ancestor_oid
,
206 0100644, &their_oid
));
208 cl_git_pass(git_index_reuc_add(repo_index
, "TWO.txt",
211 0100644, &ancestor_oid
));
213 cl_assert_equal_i(1, git_index_reuc_entrycount(repo_index
));
215 cl_assert(reuc
= git_index_reuc_get_byindex(repo_index
, 0));
217 cl_assert_equal_s("TWO.txt", reuc
->path
);
218 git_oid_fromstr(&oid
, TWO_OUR_OID
);
219 cl_assert(git_oid_cmp(&reuc
->oid
[0], &oid
) == 0);
220 git_oid_fromstr(&oid
, TWO_THEIR_OID
);
221 cl_assert(git_oid_cmp(&reuc
->oid
[1], &oid
) == 0);
222 git_oid_fromstr(&oid
, TWO_ANCESTOR_OID
);
223 cl_assert(git_oid_cmp(&reuc
->oid
[2], &oid
) == 0);
226 void test_index_reuc__remove(void)
229 const git_index_reuc_entry
*reuc
;
231 cl_assert_equal_i(2, git_index_reuc_entrycount(repo_index
));
233 cl_git_pass(git_index_reuc_remove(repo_index
, 0));
234 cl_git_fail(git_index_reuc_remove(repo_index
, 1));
236 cl_assert_equal_i(1, git_index_reuc_entrycount(repo_index
));
238 cl_assert(reuc
= git_index_reuc_get_byindex(repo_index
, 0));
240 cl_assert_equal_s("two.txt", reuc
->path
);
241 cl_assert(reuc
->mode
[0] == 0100644);
242 cl_assert(reuc
->mode
[1] == 0100644);
243 cl_assert(reuc
->mode
[2] == 0100644);
244 git_oid_fromstr(&oid
, TWO_ANCESTOR_OID
);
245 cl_assert(git_oid_cmp(&reuc
->oid
[0], &oid
) == 0);
246 git_oid_fromstr(&oid
, TWO_OUR_OID
);
247 cl_assert(git_oid_cmp(&reuc
->oid
[1], &oid
) == 0);
248 git_oid_fromstr(&oid
, TWO_THEIR_OID
);
249 cl_assert(git_oid_cmp(&reuc
->oid
[2], &oid
) == 0);
252 void test_index_reuc__write(void)
254 git_oid ancestor_oid
, our_oid
, their_oid
;
255 const git_index_reuc_entry
*reuc
;
257 git_index_clear(repo_index
);
259 /* Write out of order to ensure sorting is correct */
260 git_oid_fromstr(&ancestor_oid
, TWO_ANCESTOR_OID
);
261 git_oid_fromstr(&our_oid
, TWO_OUR_OID
);
262 git_oid_fromstr(&their_oid
, TWO_THEIR_OID
);
264 cl_git_pass(git_index_reuc_add(repo_index
, "two.txt",
265 0100644, &ancestor_oid
,
267 0100644, &their_oid
));
269 git_oid_fromstr(&ancestor_oid
, ONE_ANCESTOR_OID
);
270 git_oid_fromstr(&our_oid
, ONE_OUR_OID
);
271 git_oid_fromstr(&their_oid
, ONE_THEIR_OID
);
273 cl_git_pass(git_index_reuc_add(repo_index
, "one.txt",
274 0100644, &ancestor_oid
,
276 0100644, &their_oid
));
278 cl_git_pass(git_index_write(repo_index
));
279 cl_assert_equal_i(2, git_index_reuc_entrycount(repo_index
));
281 /* ensure sort order was round-tripped correct */
282 cl_assert(reuc
= git_index_reuc_get_byindex(repo_index
, 0));
283 cl_assert_equal_s("one.txt", reuc
->path
);
285 cl_assert(reuc
= git_index_reuc_get_byindex(repo_index
, 1));
286 cl_assert_equal_s("two.txt", reuc
->path
);
289 static int reuc_entry_exists(void)
291 return (git_index_reuc_get_bypath(repo_index
, "newfile.txt") != NULL
);
294 void test_index_reuc__cleaned_on_reset_hard(void)
298 cl_git_pass(git_revparse_single(&target
, repo
, "3a34580"));
300 test_index_reuc__add();
301 cl_git_pass(git_reset(repo
, target
, GIT_RESET_HARD
));
302 cl_assert(reuc_entry_exists() == false);
304 git_object_free(target
);
307 void test_index_reuc__cleaned_on_reset_mixed(void)
311 cl_git_pass(git_revparse_single(&target
, repo
, "3a34580"));
313 test_index_reuc__add();
314 cl_git_pass(git_reset(repo
, target
, GIT_RESET_MIXED
));
315 cl_assert(reuc_entry_exists() == false);
317 git_object_free(target
);
320 void test_index_reuc__retained_on_reset_soft(void)
324 cl_git_pass(git_revparse_single(&target
, repo
, "3a34580"));
326 git_reset(repo
, target
, GIT_RESET_HARD
);
328 test_index_reuc__add();
329 cl_git_pass(git_reset(repo
, target
, GIT_RESET_SOFT
));
330 cl_assert(reuc_entry_exists() == true);
332 git_object_free(target
);
335 void test_index_reuc__cleaned_on_checkout_tree(void)
339 git_checkout_opts opts
= GIT_CHECKOUT_OPTS_INIT
;
341 opts
.checkout_strategy
= GIT_CHECKOUT_SAFE
| GIT_CHECKOUT_UPDATE_ONLY
;
343 test_index_reuc__add();
344 git_reference_name_to_id(&oid
, repo
, "refs/heads/master");
345 git_object_lookup(&obj
, repo
, &oid
, GIT_OBJ_ANY
);
346 git_checkout_tree(repo
, obj
, &opts
);
347 cl_assert(reuc_entry_exists() == false);
349 git_object_free(obj
);
352 void test_index_reuc__cleaned_on_checkout_head(void)
354 git_checkout_opts opts
= GIT_CHECKOUT_OPTS_INIT
;
356 opts
.checkout_strategy
= GIT_CHECKOUT_SAFE
| GIT_CHECKOUT_UPDATE_ONLY
;
358 test_index_reuc__add();
359 git_checkout_head(repo
, &opts
);
360 cl_assert(reuc_entry_exists() == false);
363 void test_index_reuc__retained_on_checkout_index(void)
365 git_checkout_opts opts
= GIT_CHECKOUT_OPTS_INIT
;
367 opts
.checkout_strategy
= GIT_CHECKOUT_SAFE
| GIT_CHECKOUT_UPDATE_ONLY
;
369 test_index_reuc__add();
370 git_checkout_index(repo
, repo_index
, &opts
);
371 cl_assert(reuc_entry_exists() == true);