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_equal_oid(&reuc
->oid
[0], &ancestor_oid
);
57 cl_assert_equal_oid(&reuc
->oid
[1], &our_oid
);
58 cl_assert_equal_oid(&reuc
->oid
[2], &their_oid
);
60 cl_git_pass(git_index_write(repo_index
));
63 void test_index_reuc__add_no_ancestor(void)
65 git_oid ancestor_oid
, our_oid
, their_oid
;
66 const git_index_reuc_entry
*reuc
;
68 memset(&ancestor_oid
, 0x0, sizeof(git_oid
));
69 git_oid_fromstr(&our_oid
, ONE_OUR_OID
);
70 git_oid_fromstr(&their_oid
, ONE_THEIR_OID
);
72 cl_git_pass(git_index_reuc_add(repo_index
, "newfile.txt",
75 0100644, &their_oid
));
77 cl_assert(reuc
= git_index_reuc_get_bypath(repo_index
, "newfile.txt"));
79 cl_assert_equal_s("newfile.txt", reuc
->path
);
80 cl_assert(reuc
->mode
[0] == 0);
81 cl_assert(reuc
->mode
[1] == 0100644);
82 cl_assert(reuc
->mode
[2] == 0100644);
83 cl_assert_equal_oid(&reuc
->oid
[0], &ancestor_oid
);
84 cl_assert_equal_oid(&reuc
->oid
[1], &our_oid
);
85 cl_assert_equal_oid(&reuc
->oid
[2], &their_oid
);
87 cl_git_pass(git_index_write(repo_index
));
90 void test_index_reuc__read_bypath(void)
92 const git_index_reuc_entry
*reuc
;
95 cl_assert_equal_i(2, git_index_reuc_entrycount(repo_index
));
97 cl_assert(reuc
= git_index_reuc_get_bypath(repo_index
, "two.txt"));
99 cl_assert_equal_s("two.txt", reuc
->path
);
100 cl_assert(reuc
->mode
[0] == 0100644);
101 cl_assert(reuc
->mode
[1] == 0100644);
102 cl_assert(reuc
->mode
[2] == 0100644);
103 git_oid_fromstr(&oid
, TWO_ANCESTOR_OID
);
104 cl_assert_equal_oid(&reuc
->oid
[0], &oid
);
105 git_oid_fromstr(&oid
, TWO_OUR_OID
);
106 cl_assert_equal_oid(&reuc
->oid
[1], &oid
);
107 git_oid_fromstr(&oid
, TWO_THEIR_OID
);
108 cl_assert_equal_oid(&reuc
->oid
[2], &oid
);
110 cl_assert(reuc
= git_index_reuc_get_bypath(repo_index
, "one.txt"));
112 cl_assert_equal_s("one.txt", reuc
->path
);
113 cl_assert(reuc
->mode
[0] == 0100644);
114 cl_assert(reuc
->mode
[1] == 0100644);
115 cl_assert(reuc
->mode
[2] == 0100644);
116 git_oid_fromstr(&oid
, ONE_ANCESTOR_OID
);
117 cl_assert_equal_oid(&reuc
->oid
[0], &oid
);
118 git_oid_fromstr(&oid
, ONE_OUR_OID
);
119 cl_assert_equal_oid(&reuc
->oid
[1], &oid
);
120 git_oid_fromstr(&oid
, ONE_THEIR_OID
);
121 cl_assert_equal_oid(&reuc
->oid
[2], &oid
);
124 void test_index_reuc__ignore_case(void)
126 const git_index_reuc_entry
*reuc
;
130 index_caps
= git_index_caps(repo_index
);
132 index_caps
&= ~GIT_INDEX_CAPABILITY_IGNORE_CASE
;
133 cl_git_pass(git_index_set_caps(repo_index
, index_caps
));
135 cl_assert(!git_index_reuc_get_bypath(repo_index
, "TWO.txt"));
137 index_caps
|= GIT_INDEX_CAPABILITY_IGNORE_CASE
;
138 cl_git_pass(git_index_set_caps(repo_index
, index_caps
));
140 cl_assert_equal_i(2, git_index_reuc_entrycount(repo_index
));
142 cl_assert(reuc
= git_index_reuc_get_bypath(repo_index
, "TWO.txt"));
144 cl_assert_equal_s("two.txt", reuc
->path
);
145 cl_assert(reuc
->mode
[0] == 0100644);
146 cl_assert(reuc
->mode
[1] == 0100644);
147 cl_assert(reuc
->mode
[2] == 0100644);
148 git_oid_fromstr(&oid
, TWO_ANCESTOR_OID
);
149 cl_assert_equal_oid(&reuc
->oid
[0], &oid
);
150 git_oid_fromstr(&oid
, TWO_OUR_OID
);
151 cl_assert_equal_oid(&reuc
->oid
[1], &oid
);
152 git_oid_fromstr(&oid
, TWO_THEIR_OID
);
153 cl_assert_equal_oid(&reuc
->oid
[2], &oid
);
156 void test_index_reuc__read_byindex(void)
158 const git_index_reuc_entry
*reuc
;
161 cl_assert_equal_i(2, git_index_reuc_entrycount(repo_index
));
163 cl_assert(reuc
= git_index_reuc_get_byindex(repo_index
, 0));
165 cl_assert_equal_s("one.txt", reuc
->path
);
166 cl_assert(reuc
->mode
[0] == 0100644);
167 cl_assert(reuc
->mode
[1] == 0100644);
168 cl_assert(reuc
->mode
[2] == 0100644);
169 git_oid_fromstr(&oid
, ONE_ANCESTOR_OID
);
170 cl_assert_equal_oid(&reuc
->oid
[0], &oid
);
171 git_oid_fromstr(&oid
, ONE_OUR_OID
);
172 cl_assert_equal_oid(&reuc
->oid
[1], &oid
);
173 git_oid_fromstr(&oid
, ONE_THEIR_OID
);
174 cl_assert_equal_oid(&reuc
->oid
[2], &oid
);
176 cl_assert(reuc
= git_index_reuc_get_byindex(repo_index
, 1));
178 cl_assert_equal_s("two.txt", reuc
->path
);
179 cl_assert(reuc
->mode
[0] == 0100644);
180 cl_assert(reuc
->mode
[1] == 0100644);
181 cl_assert(reuc
->mode
[2] == 0100644);
182 git_oid_fromstr(&oid
, TWO_ANCESTOR_OID
);
183 cl_assert_equal_oid(&reuc
->oid
[0], &oid
);
184 git_oid_fromstr(&oid
, TWO_OUR_OID
);
185 cl_assert_equal_oid(&reuc
->oid
[1], &oid
);
186 git_oid_fromstr(&oid
, TWO_THEIR_OID
);
187 cl_assert_equal_oid(&reuc
->oid
[2], &oid
);
190 void test_index_reuc__updates_existing(void)
192 const git_index_reuc_entry
*reuc
;
193 git_oid ancestor_oid
, our_oid
, their_oid
, oid
;
196 git_index_clear(repo_index
);
198 index_caps
= git_index_caps(repo_index
);
200 index_caps
|= GIT_INDEX_CAPABILITY_IGNORE_CASE
;
201 cl_git_pass(git_index_set_caps(repo_index
, index_caps
));
203 git_oid_fromstr(&ancestor_oid
, TWO_ANCESTOR_OID
);
204 git_oid_fromstr(&our_oid
, TWO_OUR_OID
);
205 git_oid_fromstr(&their_oid
, TWO_THEIR_OID
);
207 cl_git_pass(git_index_reuc_add(repo_index
, "two.txt",
208 0100644, &ancestor_oid
,
210 0100644, &their_oid
));
212 cl_git_pass(git_index_reuc_add(repo_index
, "TWO.txt",
215 0100644, &ancestor_oid
));
217 cl_assert_equal_i(1, git_index_reuc_entrycount(repo_index
));
219 cl_assert(reuc
= git_index_reuc_get_byindex(repo_index
, 0));
221 cl_assert_equal_s("TWO.txt", reuc
->path
);
222 git_oid_fromstr(&oid
, TWO_OUR_OID
);
223 cl_assert_equal_oid(&reuc
->oid
[0], &oid
);
224 git_oid_fromstr(&oid
, TWO_THEIR_OID
);
225 cl_assert_equal_oid(&reuc
->oid
[1], &oid
);
226 git_oid_fromstr(&oid
, TWO_ANCESTOR_OID
);
227 cl_assert_equal_oid(&reuc
->oid
[2], &oid
);
230 void test_index_reuc__remove(void)
233 const git_index_reuc_entry
*reuc
;
235 cl_assert_equal_i(2, git_index_reuc_entrycount(repo_index
));
237 cl_git_pass(git_index_reuc_remove(repo_index
, 0));
238 cl_git_fail(git_index_reuc_remove(repo_index
, 1));
240 cl_assert_equal_i(1, git_index_reuc_entrycount(repo_index
));
242 cl_assert(reuc
= git_index_reuc_get_byindex(repo_index
, 0));
244 cl_assert_equal_s("two.txt", reuc
->path
);
245 cl_assert(reuc
->mode
[0] == 0100644);
246 cl_assert(reuc
->mode
[1] == 0100644);
247 cl_assert(reuc
->mode
[2] == 0100644);
248 git_oid_fromstr(&oid
, TWO_ANCESTOR_OID
);
249 cl_assert_equal_oid(&reuc
->oid
[0], &oid
);
250 git_oid_fromstr(&oid
, TWO_OUR_OID
);
251 cl_assert_equal_oid(&reuc
->oid
[1], &oid
);
252 git_oid_fromstr(&oid
, TWO_THEIR_OID
);
253 cl_assert_equal_oid(&reuc
->oid
[2], &oid
);
256 void test_index_reuc__write(void)
258 git_oid ancestor_oid
, our_oid
, their_oid
;
259 const git_index_reuc_entry
*reuc
;
261 git_index_clear(repo_index
);
263 /* Write out of order to ensure sorting is correct */
264 git_oid_fromstr(&ancestor_oid
, TWO_ANCESTOR_OID
);
265 git_oid_fromstr(&our_oid
, TWO_OUR_OID
);
266 git_oid_fromstr(&their_oid
, TWO_THEIR_OID
);
268 cl_git_pass(git_index_reuc_add(repo_index
, "two.txt",
269 0100644, &ancestor_oid
,
271 0100644, &their_oid
));
273 git_oid_fromstr(&ancestor_oid
, ONE_ANCESTOR_OID
);
274 git_oid_fromstr(&our_oid
, ONE_OUR_OID
);
275 git_oid_fromstr(&their_oid
, ONE_THEIR_OID
);
277 cl_git_pass(git_index_reuc_add(repo_index
, "one.txt",
278 0100644, &ancestor_oid
,
280 0100644, &their_oid
));
282 cl_git_pass(git_index_write(repo_index
));
283 cl_assert_equal_i(2, git_index_reuc_entrycount(repo_index
));
285 /* ensure sort order was round-tripped correct */
286 cl_assert(reuc
= git_index_reuc_get_byindex(repo_index
, 0));
287 cl_assert_equal_s("one.txt", reuc
->path
);
289 cl_assert(reuc
= git_index_reuc_get_byindex(repo_index
, 1));
290 cl_assert_equal_s("two.txt", reuc
->path
);
293 static int reuc_entry_exists(void)
295 return (git_index_reuc_get_bypath(repo_index
, "newfile.txt") != NULL
);
298 void test_index_reuc__cleaned_on_reset_hard(void)
302 cl_git_pass(git_revparse_single(&target
, repo
, "3a34580"));
304 test_index_reuc__add();
305 cl_git_pass(git_reset(repo
, target
, GIT_RESET_HARD
, NULL
));
306 cl_assert(reuc_entry_exists() == false);
308 git_object_free(target
);
311 void test_index_reuc__cleaned_on_reset_mixed(void)
315 cl_git_pass(git_revparse_single(&target
, repo
, "3a34580"));
317 test_index_reuc__add();
318 cl_git_pass(git_reset(repo
, target
, GIT_RESET_MIXED
, NULL
));
319 cl_assert(reuc_entry_exists() == false);
321 git_object_free(target
);
324 void test_index_reuc__retained_on_reset_soft(void)
328 cl_git_pass(git_revparse_single(&target
, repo
, "3a34580"));
330 cl_git_pass(git_reset(repo
, target
, GIT_RESET_HARD
, NULL
));
332 test_index_reuc__add();
333 cl_git_pass(git_reset(repo
, target
, GIT_RESET_SOFT
, NULL
));
334 cl_assert(reuc_entry_exists() == true);
336 git_object_free(target
);
339 void test_index_reuc__cleaned_on_checkout_tree(void)
343 git_checkout_options opts
= GIT_CHECKOUT_OPTIONS_INIT
;
345 opts
.checkout_strategy
= GIT_CHECKOUT_FORCE
;
347 test_index_reuc__add();
348 cl_git_pass(git_reference_name_to_id(&oid
, repo
, "refs/heads/master"));
349 cl_git_pass(git_object_lookup(&obj
, repo
, &oid
, GIT_OBJECT_ANY
));
350 cl_git_pass(git_checkout_tree(repo
, obj
, &opts
));
351 cl_assert(reuc_entry_exists() == false);
353 git_object_free(obj
);
356 void test_index_reuc__cleaned_on_checkout_head(void)
358 git_checkout_options opts
= GIT_CHECKOUT_OPTIONS_INIT
;
360 opts
.checkout_strategy
= GIT_CHECKOUT_FORCE
;
362 test_index_reuc__add();
363 cl_git_pass(git_checkout_head(repo
, &opts
));
364 cl_assert(reuc_entry_exists() == false);
367 void test_index_reuc__retained_on_checkout_index(void)
369 git_checkout_options opts
= GIT_CHECKOUT_OPTIONS_INIT
;
371 opts
.checkout_strategy
= GIT_CHECKOUT_FORCE
;
373 test_index_reuc__add();
374 cl_git_pass(git_checkout_index(repo
, repo_index
, &opts
));
375 cl_assert(reuc_entry_exists() == true);