#include "clar_libgit2.h" #include "merge_helpers.h" int merge_branches(git_merge_result **result, git_repository *repo, const char *ours_branch, const char *theirs_branch, git_merge_opts *opts) { git_reference *head_ref, *theirs_ref; git_merge_head *theirs_head; git_checkout_opts head_checkout_opts = GIT_CHECKOUT_OPTS_INIT; head_checkout_opts.checkout_strategy = GIT_CHECKOUT_FORCE; cl_git_pass(git_reference_symbolic_create(&head_ref, repo, "HEAD", ours_branch, 1)); cl_git_pass(git_checkout_head(repo, &head_checkout_opts)); cl_git_pass(git_reference_lookup(&theirs_ref, repo, theirs_branch)); cl_git_pass(git_merge_head_from_ref(&theirs_head, repo, theirs_ref)); cl_git_pass(git_merge(result, repo, (const git_merge_head **)&theirs_head, 1, opts)); git_reference_free(head_ref); git_reference_free(theirs_ref); git_merge_head_free(theirs_head); return 0; } int merge_test_index(git_index *index, const struct merge_index_entry expected[], size_t expected_len) { size_t i; const git_index_entry *index_entry; bool test_oid; git_oid expected_oid; if (git_index_entrycount(index) != expected_len) return 0; for (i = 0; i < expected_len; i++) { if ((index_entry = git_index_get_byindex(index, i)) == NULL) return 0; if (strlen(expected[i].oid_str) != 0) { cl_git_pass(git_oid_fromstr(&expected_oid, expected[i].oid_str)); test_oid = 1; } else test_oid = 0; if (index_entry->mode != expected[i].mode || (test_oid && git_oid_cmp(&index_entry->oid, &expected_oid) != 0) || git_index_entry_stage(index_entry) != expected[i].stage || strcmp(index_entry->path, expected[i].path) != 0) return 0; } return 1; } int merge_test_reuc(git_index *index, const struct merge_reuc_entry expected[], size_t expected_len) { size_t i; const git_index_reuc_entry *reuc_entry; git_oid expected_oid; if (git_index_reuc_entrycount(index) != expected_len) return 0; for (i = 0; i < expected_len; i++) { if ((reuc_entry = git_index_reuc_get_byindex(index, i)) == NULL) return 0; if (strcmp(reuc_entry->path, expected[i].path) != 0 || reuc_entry->mode[0] != expected[i].ancestor_mode || reuc_entry->mode[1] != expected[i].our_mode || reuc_entry->mode[2] != expected[i].their_mode) return 0; if (expected[i].ancestor_mode > 0) { cl_git_pass(git_oid_fromstr(&expected_oid, expected[i].ancestor_oid_str)); if (git_oid_cmp(&reuc_entry->oid[0], &expected_oid) != 0) return 0; } if (expected[i].our_mode > 0) { cl_git_pass(git_oid_fromstr(&expected_oid, expected[i].our_oid_str)); if (git_oid_cmp(&reuc_entry->oid[1], &expected_oid) != 0) return 0; } if (expected[i].their_mode > 0) { cl_git_pass(git_oid_fromstr(&expected_oid, expected[i].their_oid_str)); if (git_oid_cmp(&reuc_entry->oid[2], &expected_oid) != 0) return 0; } } return 1; }