Example #1
0
static int merge_trivial(const char *ours, const char *theirs, bool automerge)
{
	git_buf branch_buf = GIT_BUF_INIT;
	git_checkout_opts checkout_opts = GIT_CHECKOUT_OPTS_INIT;
	git_reference *our_ref, *their_ref;
	git_merge_head *their_heads[1];
	git_merge_opts opts = GIT_MERGE_OPTS_INIT;
	git_merge_result *result;

	checkout_opts.checkout_strategy = GIT_CHECKOUT_FORCE;

	opts.merge_tree_opts.automerge_flags |= automerge ? 0 : GIT_MERGE_AUTOMERGE_NONE;

	git_buf_printf(&branch_buf, "%s%s", GIT_REFS_HEADS_DIR, ours);
	cl_git_pass(git_reference_symbolic_create(&our_ref, repo, "HEAD", branch_buf.ptr, 1));

	cl_git_pass(git_checkout_head(repo, &checkout_opts));

	git_buf_clear(&branch_buf);
	git_buf_printf(&branch_buf, "%s%s", GIT_REFS_HEADS_DIR, theirs);
	cl_git_pass(git_reference_lookup(&their_ref, repo, branch_buf.ptr));
	cl_git_pass(git_merge_head_from_ref(&their_heads[0], repo, their_ref));

	cl_git_pass(git_merge(&result, repo, (const git_merge_head **)their_heads, 1, &opts));

	git_buf_free(&branch_buf);
	git_reference_free(our_ref);
	git_reference_free(their_ref);
	git_merge_head_free(their_heads[0]);
	git_merge_result_free(result);

	return 0;
}
Example #2
0
void test_merge_workdir_submodules__take_changed(void)
{
	git_reference *our_ref, *their_ref;
	git_commit *our_commit;
	git_merge_head *their_head;
	git_index *index;

	struct merge_index_entry merge_index_entries[] = {
		{ 0100644, "caff6b7d44973f53e3e0cf31d0d695188b19aec6", 0, ".gitmodules" },
		{ 0100644, "b438ff23300b2e0f80b84a6f30140dfa91e71423", 0, "file1.txt" },
		{ 0100644, "f27fbafdfa6693f8f7a5128506fe3e338dbfcad2", 0, "file2.txt" },
		{ 0160000, "297aa6cd028b3336c7802c7a6f49143da4e1602d", 0, "submodule" },
	};

	cl_git_pass(git_reference_lookup(&our_ref, repo, "refs/heads/" SUBMODULE_MAIN_BRANCH));
	cl_git_pass(git_commit_lookup(&our_commit, repo, git_reference_target(our_ref)));
	cl_git_pass(git_reset(repo, (git_object *)our_commit, GIT_RESET_HARD, NULL, NULL));

	cl_git_pass(git_reference_lookup(&their_ref, repo, "refs/heads/" SUBMODULE_OTHER2_BRANCH));
	cl_git_pass(git_merge_head_from_ref(&their_head, repo, their_ref));

	cl_git_pass(git_merge(repo, (const git_merge_head **)&their_head, 1, NULL, NULL));

	cl_git_pass(git_repository_index(&index, repo));
	cl_assert(merge_test_index(index, merge_index_entries, 4));

	git_index_free(index);
	git_merge_head_free(their_head);
	git_commit_free(our_commit);
	git_reference_free(their_ref);
	git_reference_free(our_ref);
}
Example #3
0
void test_merge_workdir_submodules__automerge(void)
{
	git_reference *our_ref, *their_ref;
	git_commit *our_commit;
	git_merge_head *their_head;
	git_index *index;

	struct merge_index_entry merge_index_entries[] = {
		{ 0100644, "caff6b7d44973f53e3e0cf31d0d695188b19aec6", 0, ".gitmodules" },
		{ 0100644, "950a663a6a7b2609eed1ed1ba9f41eb1a3192a9f", 0, "file1.txt" },
		{ 0100644, "343e660b9cb4bee5f407c2e33fcb9df24d9407a4", 0, "file2.txt" },
		{ 0160000, "d3d806a4bef96889117fd7ebac0e3cb5ec152932", 1, "submodule" },
		{ 0160000, "297aa6cd028b3336c7802c7a6f49143da4e1602d", 2, "submodule" },
		{ 0160000, "ae39c77c70cb6bad18bb471912460c4e1ba0f586", 3, "submodule" },
	};

	cl_git_pass(git_reference_lookup(&our_ref, repo, "refs/heads/" SUBMODULE_MAIN_BRANCH));
	cl_git_pass(git_commit_lookup(&our_commit, repo, git_reference_target(our_ref)));
	cl_git_pass(git_reset(repo, (git_object *)our_commit, GIT_RESET_HARD, NULL, NULL));

	cl_git_pass(git_reference_lookup(&their_ref, repo, "refs/heads/" SUBMODULE_OTHER_BRANCH));
	cl_git_pass(git_merge_head_from_ref(&their_head, repo, their_ref));

	cl_git_pass(git_merge(repo, (const git_merge_head **)&their_head, 1, NULL, NULL));

	cl_git_pass(git_repository_index(&index, repo));
	cl_assert(merge_test_index(index, merge_index_entries, 6));

	git_index_free(index);
	git_merge_head_free(their_head);
	git_commit_free(our_commit);
	git_reference_free(their_ref);
	git_reference_free(our_ref);
}
Example #4
0
void test_merge_workdir_fastforward__uptodate(void)
{
    git_reference *their_ref;
    git_merge_head *their_heads[1];
    git_merge_result *result;

    cl_git_pass(git_reference_lookup(&their_ref, repo, GIT_HEAD_FILE));
    cl_git_pass(git_merge_head_from_ref(&their_heads[0], repo, their_ref));

    cl_git_pass(git_merge(&result, repo, (const git_merge_head **)their_heads, 1, NULL));

    cl_assert(git_merge_result_is_uptodate(result));

    git_merge_head_free(their_heads[0]);
    git_reference_free(their_ref);
    git_merge_result_free(result);
}
Example #5
0
void test_merge_workdir_fastforward__fastforward_only(void)
{
    git_merge_result *result;
    git_merge_opts opts = GIT_MERGE_OPTS_INIT;
    git_reference *their_ref;
    git_merge_head *their_head;
    int error;

    opts.merge_flags = GIT_MERGE_FASTFORWARD_ONLY;

    cl_git_pass(git_reference_lookup(&their_ref, repo, GIT_REFS_HEADS_DIR THEIRS_NOFASTFORWARD_BRANCH));
    cl_git_pass(git_merge_head_from_ref(&their_head, repo, their_ref));

    cl_git_fail((error = git_merge(&result, repo, (const git_merge_head **)&their_head, 1, &opts)));
    cl_assert(error == GIT_ENONFASTFORWARD);

    git_merge_head_free(their_head);
    git_reference_free(their_ref);
}
Example #6
0
static git_merge_result *merge_fastforward_branch(int flags)
{
    git_reference *their_ref;
    git_merge_head *their_heads[1];
    git_merge_result *result;
    git_merge_opts opts = GIT_MERGE_OPTS_INIT;

    opts.merge_flags = flags;

    cl_git_pass(git_reference_lookup(&their_ref, repo, GIT_REFS_HEADS_DIR THEIRS_FASTFORWARD_BRANCH));
    cl_git_pass(git_merge_head_from_ref(&their_heads[0], repo, their_ref));

    cl_git_pass(git_merge(&result, repo, (const git_merge_head **)their_heads, 1, &opts));

    git_merge_head_free(their_heads[0]);
    git_reference_free(their_ref);

    return result;
}
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;
}