]> git.proxmox.com Git - libgit2.git/blob - tests/revert/workdir.c
9acf20d6facef2bd864aad7f51b8fe6d155f20fb
[libgit2.git] / tests / revert / workdir.c
1 #include "clar.h"
2 #include "clar_libgit2.h"
3
4 #include "buffer.h"
5 #include "fileops.h"
6 #include "git2/revert.h"
7
8 #include "../merge/merge_helpers.h"
9
10 #define TEST_REPO_PATH "revert"
11
12 static git_repository *repo;
13 static git_index *repo_index;
14
15 /* Fixture setup and teardown */
16 void test_revert_workdir__initialize(void)
17 {
18 git_config *cfg;
19
20 repo = cl_git_sandbox_init(TEST_REPO_PATH);
21 git_repository_index(&repo_index, repo);
22
23 /* Ensure that the user's merge.conflictstyle doesn't interfere */
24 cl_git_pass(git_repository_config(&cfg, repo));
25 cl_git_pass(git_config_set_string(cfg, "merge.conflictstyle", "merge"));
26 git_config_free(cfg);
27 }
28
29 void test_revert_workdir__cleanup(void)
30 {
31 git_index_free(repo_index);
32 cl_git_sandbox_cleanup();
33 }
34
35 /* git reset --hard 72333f47d4e83616630ff3b0ffe4c0faebcc3c45
36 * git revert --no-commit d1d403d22cbe24592d725f442835cf46fe60c8ac */
37 void test_revert_workdir__automerge(void)
38 {
39 git_commit *head, *commit;
40 git_oid head_oid, revert_oid;
41
42 struct merge_index_entry merge_index_entries[] = {
43 { 0100644, "caf99de3a49827117bb66721010eac461b06a80c", 0, "file1.txt" },
44 { 0100644, "0ab09ea6d4c3634bdf6c221626d8b6f7dd890767", 0, "file2.txt" },
45 { 0100644, "f4e107c230d08a60fb419d19869f1f282b272d9c", 0, "file3.txt" },
46 { 0100644, "0f5bfcf58c558d865da6be0281d7795993646cee", 0, "file6.txt" },
47 };
48
49 git_oid_fromstr(&head_oid, "72333f47d4e83616630ff3b0ffe4c0faebcc3c45");
50 cl_git_pass(git_commit_lookup(&head, repo, &head_oid));
51 cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL));
52
53 git_oid_fromstr(&revert_oid, "d1d403d22cbe24592d725f442835cf46fe60c8ac");
54 cl_git_pass(git_commit_lookup(&commit, repo, &revert_oid));
55 cl_git_pass(git_revert(repo, commit, NULL));
56
57 cl_assert(merge_test_index(repo_index, merge_index_entries, 4));
58
59 git_commit_free(commit);
60 git_commit_free(head);
61 }
62
63 /* git revert --no-commit 72333f47d4e83616630ff3b0ffe4c0faebcc3c45 */
64 void test_revert_workdir__conflicts(void)
65 {
66 git_reference *head_ref;
67 git_commit *head, *commit;
68 git_oid revert_oid;
69 git_buf conflicting_buf = GIT_BUF_INIT, mergemsg_buf = GIT_BUF_INIT;
70
71 struct merge_index_entry merge_index_entries[] = {
72 { 0100644, "7731926a337c4eaba1e2187d90ebfa0a93659382", 1, "file1.txt" },
73 { 0100644, "4b8fcff56437e60f58e9a6bc630dd242ebf6ea2c", 2, "file1.txt" },
74 { 0100644, "3a3ef367eaf3fe79effbfb0a56b269c04c2b59fe", 3, "file1.txt" },
75 { 0100644, "0ab09ea6d4c3634bdf6c221626d8b6f7dd890767", 0, "file2.txt" },
76 { 0100644, "f4e107c230d08a60fb419d19869f1f282b272d9c", 0, "file3.txt" },
77 { 0100644, "0f5bfcf58c558d865da6be0281d7795993646cee", 0, "file6.txt" },
78 };
79
80 git_oid_fromstr(&revert_oid, "72333f47d4e83616630ff3b0ffe4c0faebcc3c45");
81
82 cl_git_pass(git_repository_head(&head_ref, repo));
83 cl_git_pass(git_reference_peel((git_object **)&head, head_ref, GIT_OBJECT_COMMIT));
84 cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL));
85
86 cl_git_pass(git_commit_lookup(&commit, repo, &revert_oid));
87 cl_git_pass(git_revert(repo, commit, NULL));
88
89 cl_assert(merge_test_index(repo_index, merge_index_entries, 6));
90
91 cl_git_pass(git_futils_readbuffer(&conflicting_buf,
92 TEST_REPO_PATH "/file1.txt"));
93 cl_assert(strcmp(conflicting_buf.ptr, "!File one!\n" \
94 "!File one!\n" \
95 "File one!\n" \
96 "File one\n" \
97 "File one\n" \
98 "File one\n" \
99 "File one\n" \
100 "File one\n" \
101 "File one\n" \
102 "File one\n" \
103 "<<<<<<< HEAD\n" \
104 "File one!\n" \
105 "!File one!\n" \
106 "!File one!\n" \
107 "!File one!\n" \
108 "=======\n" \
109 "File one\n" \
110 "File one\n" \
111 "File one\n" \
112 "File one\n" \
113 ">>>>>>> parent of 72333f4... automergeable changes\n") == 0);
114
115 cl_assert(git_path_exists(TEST_REPO_PATH "/.git/MERGE_MSG"));
116 cl_git_pass(git_futils_readbuffer(&mergemsg_buf,
117 TEST_REPO_PATH "/.git/MERGE_MSG"));
118 cl_assert(strcmp(mergemsg_buf.ptr,
119 "Revert \"automergeable changes\"\n" \
120 "\n" \
121 "This reverts commit 72333f47d4e83616630ff3b0ffe4c0faebcc3c45.\n"
122 "\n" \
123 "Conflicts:\n" \
124 "\tfile1.txt\n") == 0);
125
126 git_commit_free(commit);
127 git_commit_free(head);
128 git_reference_free(head_ref);
129 git_buf_dispose(&mergemsg_buf);
130 git_buf_dispose(&conflicting_buf);
131 }
132
133 /* git reset --hard 39467716290f6df775a91cdb9a4eb39295018145
134 * git revert --no-commit ebb03002cee5d66c7732dd06241119fe72ab96a5
135 */
136 void test_revert_workdir__orphan(void)
137 {
138 git_commit *head, *commit;
139 git_oid head_oid, revert_oid;
140
141 struct merge_index_entry merge_index_entries[] = {
142 { 0100644, "296a6d3be1dff05c5d1f631d2459389fa7b619eb", 0, "file-mainline.txt" },
143 };
144
145 git_oid_fromstr(&head_oid, "39467716290f6df775a91cdb9a4eb39295018145");
146 cl_git_pass(git_commit_lookup(&head, repo, &head_oid));
147 cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL));
148
149 git_oid_fromstr(&revert_oid, "ebb03002cee5d66c7732dd06241119fe72ab96a5");
150 cl_git_pass(git_commit_lookup(&commit, repo, &revert_oid));
151 cl_git_pass(git_revert(repo, commit, NULL));
152
153 cl_assert(merge_test_index(repo_index, merge_index_entries, 1));
154
155 git_commit_free(commit);
156 git_commit_free(head);
157 }
158
159 /*
160 * revert the same commit twice (when the first reverts cleanly):
161 *
162 * git revert 2d440f2
163 * git revert 2d440f2
164 */
165 void test_revert_workdir__again(void)
166 {
167 git_reference *head_ref;
168 git_commit *orig_head;
169 git_tree *reverted_tree;
170 git_oid reverted_tree_oid, reverted_commit_oid;
171 git_signature *signature;
172
173 struct merge_index_entry merge_index_entries[] = {
174 { 0100644, "7731926a337c4eaba1e2187d90ebfa0a93659382", 0, "file1.txt" },
175 { 0100644, "0ab09ea6d4c3634bdf6c221626d8b6f7dd890767", 0, "file2.txt" },
176 { 0100644, "f4e107c230d08a60fb419d19869f1f282b272d9c", 0, "file3.txt" },
177 { 0100644, "0f5bfcf58c558d865da6be0281d7795993646cee", 0, "file6.txt" },
178 };
179
180 cl_git_pass(git_repository_head(&head_ref, repo));
181 cl_git_pass(git_reference_peel((git_object **)&orig_head, head_ref, GIT_OBJECT_COMMIT));
182 cl_git_pass(git_reset(repo, (git_object *)orig_head, GIT_RESET_HARD, NULL));
183
184 cl_git_pass(git_revert(repo, orig_head, NULL));
185
186 cl_assert(merge_test_index(repo_index, merge_index_entries, 4));
187
188 cl_git_pass(git_index_write_tree(&reverted_tree_oid, repo_index));
189 cl_git_pass(git_tree_lookup(&reverted_tree, repo, &reverted_tree_oid));
190
191 cl_git_pass(git_signature_new(&signature, "Reverter", "reverter@example.org", time(NULL), 0));
192 cl_git_pass(git_commit_create(&reverted_commit_oid, repo, "HEAD", signature, signature, NULL, "Reverted!", reverted_tree, 1, (const git_commit **)&orig_head));
193
194 cl_git_pass(git_revert(repo, orig_head, NULL));
195 cl_assert(merge_test_index(repo_index, merge_index_entries, 4));
196
197 git_signature_free(signature);
198 git_tree_free(reverted_tree);
199 git_commit_free(orig_head);
200 git_reference_free(head_ref);
201 }
202
203 /* git reset --hard 72333f47d4e83616630ff3b0ffe4c0faebcc3c45
204 * git revert --no-commit d1d403d22cbe24592d725f442835cf46fe60c8ac */
205 void test_revert_workdir__again_after_automerge(void)
206 {
207 git_commit *head, *commit;
208 git_tree *reverted_tree;
209 git_oid head_oid, revert_oid, reverted_tree_oid, reverted_commit_oid;
210 git_signature *signature;
211
212 struct merge_index_entry merge_index_entries[] = {
213 { 0100644, "caf99de3a49827117bb66721010eac461b06a80c", 0, "file1.txt" },
214 { 0100644, "0ab09ea6d4c3634bdf6c221626d8b6f7dd890767", 0, "file2.txt" },
215 { 0100644, "f4e107c230d08a60fb419d19869f1f282b272d9c", 0, "file3.txt" },
216 { 0100644, "0f5bfcf58c558d865da6be0281d7795993646cee", 0, "file6.txt" },
217 };
218
219 struct merge_index_entry second_revert_entries[] = {
220 { 0100644, "3a3ef367eaf3fe79effbfb0a56b269c04c2b59fe", 1, "file1.txt" },
221 { 0100644, "caf99de3a49827117bb66721010eac461b06a80c", 2, "file1.txt" },
222 { 0100644, "747726e021bc5f44b86de60e3032fd6f9f1b8383", 3, "file1.txt" },
223 { 0100644, "0ab09ea6d4c3634bdf6c221626d8b6f7dd890767", 0, "file2.txt" },
224 { 0100644, "f4e107c230d08a60fb419d19869f1f282b272d9c", 0, "file3.txt" },
225 { 0100644, "0f5bfcf58c558d865da6be0281d7795993646cee", 0, "file6.txt" },
226 };
227
228 git_oid_fromstr(&head_oid, "72333f47d4e83616630ff3b0ffe4c0faebcc3c45");
229 cl_git_pass(git_commit_lookup(&head, repo, &head_oid));
230 cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL));
231
232 git_oid_fromstr(&revert_oid, "d1d403d22cbe24592d725f442835cf46fe60c8ac");
233 cl_git_pass(git_commit_lookup(&commit, repo, &revert_oid));
234 cl_git_pass(git_revert(repo, commit, NULL));
235
236 cl_assert(merge_test_index(repo_index, merge_index_entries, 4));
237
238 cl_git_pass(git_index_write_tree(&reverted_tree_oid, repo_index));
239 cl_git_pass(git_tree_lookup(&reverted_tree, repo, &reverted_tree_oid));
240
241 cl_git_pass(git_signature_new(&signature, "Reverter", "reverter@example.org", time(NULL), 0));
242 cl_git_pass(git_commit_create(&reverted_commit_oid, repo, "HEAD", signature, signature, NULL, "Reverted!", reverted_tree, 1, (const git_commit **)&head));
243
244 cl_git_pass(git_revert(repo, commit, NULL));
245 cl_assert(merge_test_index(repo_index, second_revert_entries, 6));
246
247 git_signature_free(signature);
248 git_tree_free(reverted_tree);
249 git_commit_free(commit);
250 git_commit_free(head);
251 }
252
253 /*
254 * revert the same commit twice (when the first reverts cleanly):
255 *
256 * git revert 2d440f2
257 * git revert 2d440f2
258 */
259 void test_revert_workdir__again_after_edit(void)
260 {
261 git_reference *head_ref;
262 git_commit *orig_head, *commit;
263 git_tree *reverted_tree;
264 git_oid orig_head_oid, revert_oid, reverted_tree_oid, reverted_commit_oid;
265 git_signature *signature;
266
267 struct merge_index_entry merge_index_entries[] = {
268 { 0100644, "3721552e06c4bdc7d478e0674e6304888545d5fd", 0, "file1.txt" },
269 { 0100644, "0ab09ea6d4c3634bdf6c221626d8b6f7dd890767", 0, "file2.txt" },
270 { 0100644, "f4e107c230d08a60fb419d19869f1f282b272d9c", 0, "file3.txt" },
271 { 0100644, "0f5bfcf58c558d865da6be0281d7795993646cee", 0, "file6.txt" },
272 };
273
274 cl_git_pass(git_repository_head(&head_ref, repo));
275
276 cl_git_pass(git_oid_fromstr(&orig_head_oid, "399fb3aba3d9d13f7d40a9254ce4402067ef3149"));
277 cl_git_pass(git_commit_lookup(&orig_head, repo, &orig_head_oid));
278 cl_git_pass(git_reset(repo, (git_object *)orig_head, GIT_RESET_HARD, NULL));
279
280 cl_git_pass(git_oid_fromstr(&revert_oid, "2d440f2b3147d3dc7ad1085813478d6d869d5a4d"));
281 cl_git_pass(git_commit_lookup(&commit, repo, &revert_oid));
282
283 cl_git_pass(git_revert(repo, commit, NULL));
284
285 cl_assert(merge_test_index(repo_index, merge_index_entries, 4));
286
287 cl_git_pass(git_index_write_tree(&reverted_tree_oid, repo_index));
288 cl_git_pass(git_tree_lookup(&reverted_tree, repo, &reverted_tree_oid));
289
290 cl_git_pass(git_signature_new(&signature, "Reverter", "reverter@example.org", time(NULL), 0));
291 cl_git_pass(git_commit_create(&reverted_commit_oid, repo, "HEAD", signature, signature, NULL, "Reverted!", reverted_tree, 1, (const git_commit **)&orig_head));
292
293 cl_git_pass(git_revert(repo, commit, NULL));
294 cl_assert(merge_test_index(repo_index, merge_index_entries, 4));
295
296 git_signature_free(signature);
297 git_tree_free(reverted_tree);
298 git_commit_free(commit);
299 git_commit_free(orig_head);
300 git_reference_free(head_ref);
301 }
302
303 /*
304 * revert the same commit twice (when the first reverts cleanly):
305 *
306 * git reset --hard 75ec9929465623f17ff3ad68c0438ea56faba815
307 * git revert 97e52d5e81f541080cd6b92829fb85bc4d81d90b
308 */
309 void test_revert_workdir__again_after_edit_two(void)
310 {
311 git_buf diff_buf = GIT_BUF_INIT;
312 git_config *config;
313 git_oid head_commit_oid, revert_commit_oid;
314 git_commit *head_commit, *revert_commit;
315
316 struct merge_index_entry merge_index_entries[] = {
317 { 0100644, "a8c86221b400b836010567cc3593db6e96c1a83a", 1, "file.txt" },
318 { 0100644, "46ff0854663aeb2182b9838c8da68e33ac23bc1e", 2, "file.txt" },
319 { 0100644, "21a96a98ed84d45866e1de6e266fd3a61a4ae9dc", 3, "file.txt" },
320 };
321
322 cl_git_pass(git_repository_config(&config, repo));
323 cl_git_pass(git_config_set_bool(config, "core.autocrlf", 0));
324
325 cl_git_pass(git_oid_fromstr(&head_commit_oid, "75ec9929465623f17ff3ad68c0438ea56faba815"));
326 cl_git_pass(git_commit_lookup(&head_commit, repo, &head_commit_oid));
327 cl_git_pass(git_reset(repo, (git_object *)head_commit, GIT_RESET_HARD, NULL));
328
329 cl_git_pass(git_oid_fromstr(&revert_commit_oid, "97e52d5e81f541080cd6b92829fb85bc4d81d90b"));
330 cl_git_pass(git_commit_lookup(&revert_commit, repo, &revert_commit_oid));
331
332 cl_git_pass(git_revert(repo, revert_commit, NULL));
333
334 cl_assert(merge_test_index(repo_index, merge_index_entries, 3));
335
336 cl_git_pass(git_futils_readbuffer(&diff_buf, "revert/file.txt"));
337 cl_assert_equal_s(
338 "a\n" \
339 "<<<<<<< HEAD\n" \
340 "=======\n" \
341 "a\n" \
342 ">>>>>>> parent of 97e52d5... Revert me\n" \
343 "a\n" \
344 "a\n" \
345 "a\n" \
346 "a\n" \
347 "ab",
348 diff_buf.ptr);
349
350 git_commit_free(revert_commit);
351 git_commit_free(head_commit);
352 git_config_free(config);
353 git_buf_dispose(&diff_buf);
354 }
355
356 /* git reset --hard 72333f47d4e83616630ff3b0ffe4c0faebcc3c45
357 * git revert --no-commit d1d403d22cbe24592d725f442835cf46fe60c8ac */
358 void test_revert_workdir__conflict_use_ours(void)
359 {
360 git_commit *head, *commit;
361 git_oid head_oid, revert_oid;
362 git_revert_options opts = GIT_REVERT_OPTIONS_INIT;
363
364 struct merge_index_entry merge_index_entries[] = {
365 { 0100644, "caf99de3a49827117bb66721010eac461b06a80c", 0, "file1.txt" },
366 { 0100644, "0ab09ea6d4c3634bdf6c221626d8b6f7dd890767", 0, "file2.txt" },
367 { 0100644, "f4e107c230d08a60fb419d19869f1f282b272d9c", 0, "file3.txt" },
368 { 0100644, "0f5bfcf58c558d865da6be0281d7795993646cee", 0, "file6.txt" },
369 };
370
371 struct merge_index_entry merge_filesystem_entries[] = {
372 { 0100644, "caf99de3a49827117bb66721010eac461b06a80c", 0, "file1.txt" },
373 { 0100644, "0ab09ea6d4c3634bdf6c221626d8b6f7dd890767", 0, "file2.txt" },
374 { 0100644, "f4e107c230d08a60fb419d19869f1f282b272d9c", 0, "file3.txt" },
375 { 0100644, "0f5bfcf58c558d865da6be0281d7795993646cee", 0, "file6.txt" },
376 };
377
378 opts.checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_USE_OURS;
379
380 git_oid_fromstr(&head_oid, "72333f47d4e83616630ff3b0ffe4c0faebcc3c45");
381 cl_git_pass(git_commit_lookup(&head, repo, &head_oid));
382 cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL));
383
384 git_oid_fromstr(&revert_oid, "d1d403d22cbe24592d725f442835cf46fe60c8ac");
385 cl_git_pass(git_commit_lookup(&commit, repo, &revert_oid));
386 cl_git_pass(git_revert(repo, commit, &opts));
387
388 cl_assert(merge_test_index(repo_index, merge_index_entries, 4));
389 cl_assert(merge_test_workdir(repo, merge_filesystem_entries, 4));
390
391 git_commit_free(commit);
392 git_commit_free(head);
393 }
394
395 /* git reset --hard cef56612d71a6af8d8015691e4865f7fece905b5
396 * git revert --no-commit 55568c8de5322ff9a95d72747a239cdb64a19965
397 */
398 void test_revert_workdir__rename_1_of_2(void)
399 {
400 git_commit *head, *commit;
401 git_oid head_oid, revert_oid;
402 git_revert_options opts = GIT_REVERT_OPTIONS_INIT;
403
404 struct merge_index_entry merge_index_entries[] = {
405 { 0100644, "747726e021bc5f44b86de60e3032fd6f9f1b8383", 0, "file1.txt" },
406 { 0100644, "0ab09ea6d4c3634bdf6c221626d8b6f7dd890767", 0, "file2.txt" },
407 { 0100644, "f4e107c230d08a60fb419d19869f1f282b272d9c", 0, "file3.txt" },
408 { 0100644, "55acf326a69f0aab7a974ec53ffa55a50bcac14e", 3, "file4.txt" },
409 { 0100644, "55acf326a69f0aab7a974ec53ffa55a50bcac14e", 1, "file5.txt" },
410 { 0100644, "0f5bfcf58c558d865da6be0281d7795993646cee", 2, "file6.txt" },
411 };
412
413 opts.merge_opts.flags |= GIT_MERGE_FIND_RENAMES;
414 opts.merge_opts.rename_threshold = 50;
415
416 git_oid_fromstr(&head_oid, "cef56612d71a6af8d8015691e4865f7fece905b5");
417 cl_git_pass(git_commit_lookup(&head, repo, &head_oid));
418 cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL));
419
420 git_oid_fromstr(&revert_oid, "55568c8de5322ff9a95d72747a239cdb64a19965");
421 cl_git_pass(git_commit_lookup(&commit, repo, &revert_oid));
422 cl_git_pass(git_revert(repo, commit, &opts));
423
424 cl_assert(merge_test_index(repo_index, merge_index_entries, 6));
425
426 git_commit_free(commit);
427 git_commit_free(head);
428 }
429
430 /* git reset --hard 55568c8de5322ff9a95d72747a239cdb64a19965
431 * git revert --no-commit HEAD~1 */
432 void test_revert_workdir__rename(void)
433 {
434 git_commit *head, *commit;
435 git_oid head_oid, revert_oid;
436 git_revert_options opts = GIT_REVERT_OPTIONS_INIT;
437
438 struct merge_index_entry merge_index_entries[] = {
439 { 0100644, "55acf326a69f0aab7a974ec53ffa55a50bcac14e", 1, "file4.txt" },
440 { 0100644, "55acf326a69f0aab7a974ec53ffa55a50bcac14e", 2, "file5.txt" },
441 };
442
443 struct merge_name_entry merge_name_entries[] = {
444 { "file4.txt", "file5.txt", "" },
445 };
446
447 opts.merge_opts.flags |= GIT_MERGE_FIND_RENAMES;
448 opts.merge_opts.rename_threshold = 50;
449
450 git_oid_fromstr(&head_oid, "55568c8de5322ff9a95d72747a239cdb64a19965");
451 cl_git_pass(git_commit_lookup(&head, repo, &head_oid));
452 cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL));
453
454 git_oid_fromstr(&revert_oid, "0aa8c7e40d342fff78d60b29a4ba8e993ed79c51");
455 cl_git_pass(git_commit_lookup(&commit, repo, &revert_oid));
456 cl_git_pass(git_revert(repo, commit, &opts));
457
458 cl_assert(merge_test_index(repo_index, merge_index_entries, 2));
459 cl_assert(merge_test_names(repo_index, merge_name_entries, 1));
460
461 git_commit_free(commit);
462 git_commit_free(head);
463 }
464
465 /* git revert --no-commit HEAD */
466 void test_revert_workdir__head(void)
467 {
468 git_reference *head;
469 git_commit *commit;
470
471 struct merge_index_entry merge_index_entries[] = {
472 { 0100644, "7731926a337c4eaba1e2187d90ebfa0a93659382", 0, "file1.txt" },
473 { 0100644, "0ab09ea6d4c3634bdf6c221626d8b6f7dd890767", 0, "file2.txt" },
474 { 0100644, "f4e107c230d08a60fb419d19869f1f282b272d9c", 0, "file3.txt" },
475 { 0100644, "0f5bfcf58c558d865da6be0281d7795993646cee", 0, "file6.txt" },
476 };
477
478 /* HEAD is 2d440f2b3147d3dc7ad1085813478d6d869d5a4d */
479 cl_git_pass(git_repository_head(&head, repo));
480 cl_git_pass(git_reference_peel((git_object **)&commit, head, GIT_OBJECT_COMMIT));
481 cl_git_pass(git_reset(repo, (git_object *)commit, GIT_RESET_HARD, NULL));
482 cl_git_pass(git_revert(repo, commit, NULL));
483
484 cl_assert(merge_test_index(repo_index, merge_index_entries, 4));
485 cl_assert(merge_test_workdir(repo, merge_index_entries, 4));
486
487 git_reference_free(head);
488 git_commit_free(commit);
489 }
490
491 void test_revert_workdir__nonmerge_fails_mainline_specified(void)
492 {
493 git_reference *head;
494 git_commit *commit;
495 git_revert_options opts = GIT_REVERT_OPTIONS_INIT;
496
497 cl_git_pass(git_repository_head(&head, repo));
498 cl_git_pass(git_reference_peel((git_object **)&commit, head, GIT_OBJECT_COMMIT));
499
500 opts.mainline = 1;
501 cl_must_fail(git_revert(repo, commit, &opts));
502 cl_assert(!git_path_exists(TEST_REPO_PATH "/.git/MERGE_MSG"));
503 cl_assert(!git_path_exists(TEST_REPO_PATH "/.git/REVERT_HEAD"));
504
505 git_reference_free(head);
506 git_commit_free(commit);
507 }
508
509 /* git reset --hard 5acdc74af27172ec491d213ee36cea7eb9ef2579
510 * git revert HEAD */
511 void test_revert_workdir__merge_fails_without_mainline_specified(void)
512 {
513 git_commit *head;
514 git_oid head_oid;
515
516 git_oid_fromstr(&head_oid, "5acdc74af27172ec491d213ee36cea7eb9ef2579");
517 cl_git_pass(git_commit_lookup(&head, repo, &head_oid));
518 cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL));
519
520 cl_must_fail(git_revert(repo, head, NULL));
521 cl_assert(!git_path_exists(TEST_REPO_PATH "/.git/MERGE_MSG"));
522 cl_assert(!git_path_exists(TEST_REPO_PATH "/.git/REVERT_HEAD"));
523
524 git_commit_free(head);
525 }
526
527 /* git reset --hard 5acdc74af27172ec491d213ee36cea7eb9ef2579
528 * git revert HEAD -m1 --no-commit */
529 void test_revert_workdir__merge_first_parent(void)
530 {
531 git_commit *head;
532 git_oid head_oid;
533 git_revert_options opts = GIT_REVERT_OPTIONS_INIT;
534
535 struct merge_index_entry merge_index_entries[] = {
536 { 0100644, "296a6d3be1dff05c5d1f631d2459389fa7b619eb", 0, "file-mainline.txt" },
537 { 0100644, "0cdb66192ee192f70f891f05a47636057420e871", 0, "file1.txt" },
538 { 0100644, "73ec36fa120f8066963a0bc9105bb273dbd903d7", 0, "file2.txt" },
539 };
540
541 opts.mainline = 1;
542
543 git_oid_fromstr(&head_oid, "5acdc74af27172ec491d213ee36cea7eb9ef2579");
544 cl_git_pass(git_commit_lookup(&head, repo, &head_oid));
545 cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL));
546
547 cl_git_pass(git_revert(repo, head, &opts));
548
549 cl_assert(merge_test_index(repo_index, merge_index_entries, 3));
550
551 git_commit_free(head);
552 }
553
554 void test_revert_workdir__merge_second_parent(void)
555 {
556 git_commit *head;
557 git_oid head_oid;
558 git_revert_options opts = GIT_REVERT_OPTIONS_INIT;
559
560 struct merge_index_entry merge_index_entries[] = {
561 { 0100644, "33c6fd981c49a2abf2971482089350bfc5cda8ea", 0, "file-branch.txt" },
562 { 0100644, "0cdb66192ee192f70f891f05a47636057420e871", 0, "file1.txt" },
563 { 0100644, "73ec36fa120f8066963a0bc9105bb273dbd903d7", 0, "file2.txt" },
564 };
565
566 opts.mainline = 2;
567
568 git_oid_fromstr(&head_oid, "5acdc74af27172ec491d213ee36cea7eb9ef2579");
569 cl_git_pass(git_commit_lookup(&head, repo, &head_oid));
570 cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL));
571
572 cl_git_pass(git_revert(repo, head, &opts));
573
574 cl_assert(merge_test_index(repo_index, merge_index_entries, 3));
575
576 git_commit_free(head);
577 }