Blame tests/rebase/merge.c

Packit ae9e2a
#include "clar_libgit2.h"
Packit ae9e2a
#include "git2/checkout.h"
Packit ae9e2a
#include "git2/rebase.h"
Packit ae9e2a
#include "posix.h"
Packit ae9e2a
#include "signature.h"
Packit ae9e2a
Packit ae9e2a
#include <fcntl.h>
Packit ae9e2a
Packit ae9e2a
static git_repository *repo;
Packit ae9e2a
static git_signature *signature;
Packit ae9e2a
Packit ae9e2a
static void set_core_autocrlf_to(git_repository *repo, bool value)
Packit ae9e2a
{
Packit ae9e2a
	git_config *cfg;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_config(&cfg, repo));
Packit ae9e2a
	cl_git_pass(git_config_set_bool(cfg, "core.autocrlf", value));
Packit ae9e2a
Packit ae9e2a
	git_config_free(cfg);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
// Fixture setup and teardown
Packit ae9e2a
void test_rebase_merge__initialize(void)
Packit ae9e2a
{
Packit ae9e2a
	repo = cl_git_sandbox_init("rebase");
Packit ae9e2a
	cl_git_pass(git_signature_new(&signature,
Packit ae9e2a
		"Rebaser", "rebaser@rebaser.rb", 1405694510, 0));
Packit ae9e2a
Packit ae9e2a
	set_core_autocrlf_to(repo, false);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_rebase_merge__cleanup(void)
Packit ae9e2a
{
Packit ae9e2a
	git_signature_free(signature);
Packit ae9e2a
	cl_git_sandbox_cleanup();
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_rebase_merge__next(void)
Packit ae9e2a
{
Packit ae9e2a
	git_rebase *rebase;
Packit ae9e2a
	git_reference *branch_ref, *upstream_ref;
Packit ae9e2a
	git_annotated_commit *branch_head, *upstream_head;
Packit ae9e2a
	git_rebase_operation *rebase_operation;
Packit ae9e2a
	git_status_list *status_list;
Packit ae9e2a
	const git_status_entry *status_entry;
Packit ae9e2a
	git_oid pick_id, file1_id;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/beef"));
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/master"));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref));
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
Packit ae9e2a
	git_oid_fromstr(&pick_id, "da9c51a23d02d931a486f45ad18cda05cf5d2b94");
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_i(GIT_REBASE_OPERATION_PICK, rebase_operation->type);
Packit ae9e2a
	cl_assert_equal_oid(&pick_id, &rebase_operation->id);
Packit ae9e2a
	cl_assert_equal_file("da9c51a23d02d931a486f45ad18cda05cf5d2b94\n", 41, "rebase/.git/rebase-merge/current");
Packit ae9e2a
	cl_assert_equal_file("1\n", 2, "rebase/.git/rebase-merge/msgnum");
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_status_list_new(&status_list, repo, NULL));
Packit ae9e2a
	cl_assert_equal_i(1, git_status_list_entrycount(status_list));
Packit ae9e2a
	cl_assert(status_entry = git_status_byindex(status_list, 0));
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_s("beef.txt", status_entry->head_to_index->new_file.path);
Packit ae9e2a
Packit ae9e2a
	git_oid_fromstr(&file1_id, "8d95ea62e621f1d38d230d9e7d206e41096d76af");
Packit ae9e2a
	cl_assert_equal_oid(&file1_id, &status_entry->head_to_index->new_file.id);
Packit ae9e2a
Packit ae9e2a
	git_status_list_free(status_list);
Packit ae9e2a
	git_annotated_commit_free(branch_head);
Packit ae9e2a
	git_annotated_commit_free(upstream_head);
Packit ae9e2a
	git_reference_free(branch_ref);
Packit ae9e2a
	git_reference_free(upstream_ref);
Packit ae9e2a
	git_rebase_free(rebase);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_rebase_merge__next_with_conflicts(void)
Packit ae9e2a
{
Packit ae9e2a
	git_rebase *rebase;
Packit ae9e2a
	git_reference *branch_ref, *upstream_ref;
Packit ae9e2a
	git_annotated_commit *branch_head, *upstream_head;
Packit ae9e2a
	git_rebase_operation *rebase_operation;
Packit ae9e2a
	git_status_list *status_list;
Packit ae9e2a
	const git_status_entry *status_entry;
Packit ae9e2a
	git_oid pick_id, commit_id;
Packit ae9e2a
Packit ae9e2a
	const char *expected_merge =
Packit ae9e2a
"ASPARAGUS SOUP.\n"
Packit ae9e2a
"\n"
Packit ae9e2a
"<<<<<<< master\n"
Packit ae9e2a
"TAKE FOUR LARGE BUNCHES of asparagus, scrape it nicely, cut off one inch\n"
Packit ae9e2a
"OF THE TOPS, and lay them in water, chop the stalks and put them on the\n"
Packit ae9e2a
"FIRE WITH A PIECE OF BACON, a large onion cut up, and pepper and salt;\n"
Packit ae9e2a
"ADD TWO QUARTS OF WATER, boil them till the stalks are quite soft, then\n"
Packit ae9e2a
"PULP THEM THROUGH A SIEVE, and strain the water to it, which must be put\n"
Packit ae9e2a
"=======\n"
Packit ae9e2a
"Take four large bunches of asparagus, scrape it nicely, CUT OFF ONE INCH\n"
Packit ae9e2a
"of the tops, and lay them in water, chop the stalks and PUT THEM ON THE\n"
Packit ae9e2a
"fire with a piece of bacon, a large onion cut up, and pepper and salt;\n"
Packit ae9e2a
"add two quarts of water, boil them till the stalks are quite soft, then\n"
Packit ae9e2a
"pulp them through a sieve, and strain the water to it, which must be put\n"
Packit ae9e2a
">>>>>>> Conflicting modification 1 to asparagus\n"
Packit ae9e2a
"back in the pot; put into it a chicken cut up, with the tops of\n"
Packit ae9e2a
"asparagus which had been laid by, boil it until these last articles are\n"
Packit ae9e2a
"sufficiently done, thicken with flour, butter and milk, and serve it up.\n";
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/asparagus"));
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/master"));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref));
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
Packit ae9e2a
	git_oid_fromstr(&pick_id, "33f915f9e4dbd9f4b24430e48731a59b45b15500");
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_i(GIT_REBASE_OPERATION_PICK, rebase_operation->type);
Packit ae9e2a
	cl_assert_equal_oid(&pick_id, &rebase_operation->id);
Packit ae9e2a
	cl_assert_equal_file("33f915f9e4dbd9f4b24430e48731a59b45b15500\n", 41, "rebase/.git/rebase-merge/current");
Packit ae9e2a
	cl_assert_equal_file("1\n", 2, "rebase/.git/rebase-merge/msgnum");
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_status_list_new(&status_list, repo, NULL));
Packit ae9e2a
	cl_assert_equal_i(1, git_status_list_entrycount(status_list));
Packit ae9e2a
	cl_assert(status_entry = git_status_byindex(status_list, 0));
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_s("asparagus.txt", status_entry->head_to_index->new_file.path);
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_file(expected_merge, strlen(expected_merge), "rebase/asparagus.txt");
Packit ae9e2a
Packit ae9e2a
	cl_git_fail_with(GIT_EUNMERGED, git_rebase_commit(&commit_id, rebase, NULL, signature, NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	git_status_list_free(status_list);
Packit ae9e2a
	git_annotated_commit_free(branch_head);
Packit ae9e2a
	git_annotated_commit_free(upstream_head);
Packit ae9e2a
	git_reference_free(branch_ref);
Packit ae9e2a
	git_reference_free(upstream_ref);
Packit ae9e2a
	git_rebase_free(rebase);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_rebase_merge__next_stops_with_iterover(void)
Packit ae9e2a
{
Packit ae9e2a
	git_rebase *rebase;
Packit ae9e2a
	git_reference *branch_ref, *upstream_ref;
Packit ae9e2a
	git_annotated_commit *branch_head, *upstream_head;
Packit ae9e2a
	git_rebase_operation *rebase_operation;
Packit ae9e2a
	git_oid commit_id;
Packit ae9e2a
	int error;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/beef"));
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/master"));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref));
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature,
Packit ae9e2a
		NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature,
Packit ae9e2a
		NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature,
Packit ae9e2a
		NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature,
Packit ae9e2a
		NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature,
Packit ae9e2a
		NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_fail(error = git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_assert_equal_i(GIT_ITEROVER, error);
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_file("5\n", 2, "rebase/.git/rebase-merge/end");
Packit ae9e2a
	cl_assert_equal_file("5\n", 2, "rebase/.git/rebase-merge/msgnum");
Packit ae9e2a
Packit ae9e2a
	git_annotated_commit_free(branch_head);
Packit ae9e2a
	git_annotated_commit_free(upstream_head);
Packit ae9e2a
	git_reference_free(branch_ref);
Packit ae9e2a
	git_reference_free(upstream_ref);
Packit ae9e2a
	git_rebase_free(rebase);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_rebase_merge__commit(void)
Packit ae9e2a
{
Packit ae9e2a
	git_rebase *rebase;
Packit ae9e2a
	git_reference *branch_ref, *upstream_ref;
Packit ae9e2a
	git_annotated_commit *branch_head, *upstream_head;
Packit ae9e2a
	git_rebase_operation *rebase_operation;
Packit ae9e2a
	git_oid commit_id, tree_id, parent_id;
Packit ae9e2a
	git_signature *author;
Packit ae9e2a
	git_commit *commit;
Packit ae9e2a
	git_reflog *reflog;
Packit ae9e2a
	const git_reflog_entry *reflog_entry;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/beef"));
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/master"));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref));
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature,
Packit ae9e2a
		NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_commit_lookup(&commit, repo, &commit_id));
Packit ae9e2a
Packit ae9e2a
	git_oid_fromstr(&parent_id, "efad0b11c47cb2f0220cbd6f5b0f93bb99064b00");
Packit ae9e2a
	cl_assert_equal_i(1, git_commit_parentcount(commit));
Packit ae9e2a
	cl_assert_equal_oid(&parent_id, git_commit_parent_id(commit, 0));
Packit ae9e2a
Packit ae9e2a
	git_oid_fromstr(&tree_id, "4461379789c777d2a6c1f2ee0e9d6c86731b9992");
Packit ae9e2a
	cl_assert_equal_oid(&tree_id, git_commit_tree_id(commit));
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_s(NULL, git_commit_message_encoding(commit));
Packit ae9e2a
	cl_assert_equal_s("Modification 1 to beef\n", git_commit_message(commit));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_signature_new(&author,
Packit ae9e2a
		"Edward Thomson", "ethomson@edwardthomson.com", 1405621769, 0-(4*60)));
Packit ae9e2a
	cl_assert(git_signature__equal(author, git_commit_author(commit)));
Packit ae9e2a
Packit ae9e2a
	cl_assert(git_signature__equal(signature, git_commit_committer(commit)));
Packit ae9e2a
Packit ae9e2a
	/* Make sure the reflogs are updated appropriately */
Packit ae9e2a
	cl_git_pass(git_reflog_read(&reflog, repo, "HEAD"));
Packit ae9e2a
	cl_assert(reflog_entry = git_reflog_entry_byindex(reflog, 0));
Packit ae9e2a
	cl_assert_equal_oid(&parent_id, git_reflog_entry_id_old(reflog_entry));
Packit ae9e2a
	cl_assert_equal_oid(&commit_id, git_reflog_entry_id_new(reflog_entry));
Packit ae9e2a
	cl_assert_equal_s("rebase: Modification 1 to beef", git_reflog_entry_message(reflog_entry));
Packit ae9e2a
Packit ae9e2a
	git_reflog_free(reflog);
Packit ae9e2a
	git_signature_free(author);
Packit ae9e2a
	git_commit_free(commit);
Packit ae9e2a
	git_annotated_commit_free(branch_head);
Packit ae9e2a
	git_annotated_commit_free(upstream_head);
Packit ae9e2a
	git_reference_free(branch_ref);
Packit ae9e2a
	git_reference_free(upstream_ref);
Packit ae9e2a
	git_rebase_free(rebase);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_rebase_merge__commit_with_id(void)
Packit ae9e2a
{
Packit ae9e2a
	git_rebase *rebase;
Packit ae9e2a
	git_oid branch_id, upstream_id;
Packit ae9e2a
	git_annotated_commit *branch_head, *upstream_head;
Packit ae9e2a
	git_rebase_operation *rebase_operation;
Packit ae9e2a
	git_oid commit_id, tree_id, parent_id;
Packit ae9e2a
	git_signature *author;
Packit ae9e2a
	git_commit *commit;
Packit ae9e2a
	git_reflog *reflog;
Packit ae9e2a
	const git_reflog_entry *reflog_entry;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_oid_fromstr(&branch_id, "b146bd7608eac53d9bf9e1a6963543588b555c64"));
Packit ae9e2a
	cl_git_pass(git_oid_fromstr(&upstream_id, "efad0b11c47cb2f0220cbd6f5b0f93bb99064b00"));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_annotated_commit_lookup(&branch_head, repo, &branch_id));
Packit ae9e2a
	cl_git_pass(git_annotated_commit_lookup(&upstream_head, repo, &upstream_id));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature,
Packit ae9e2a
		NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_commit_lookup(&commit, repo, &commit_id));
Packit ae9e2a
Packit ae9e2a
	git_oid_fromstr(&parent_id, "efad0b11c47cb2f0220cbd6f5b0f93bb99064b00");
Packit ae9e2a
	cl_assert_equal_i(1, git_commit_parentcount(commit));
Packit ae9e2a
	cl_assert_equal_oid(&parent_id, git_commit_parent_id(commit, 0));
Packit ae9e2a
Packit ae9e2a
	git_oid_fromstr(&tree_id, "4461379789c777d2a6c1f2ee0e9d6c86731b9992");
Packit ae9e2a
	cl_assert_equal_oid(&tree_id, git_commit_tree_id(commit));
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_s(NULL, git_commit_message_encoding(commit));
Packit ae9e2a
	cl_assert_equal_s("Modification 1 to beef\n", git_commit_message(commit));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_signature_new(&author,
Packit ae9e2a
		"Edward Thomson", "ethomson@edwardthomson.com", 1405621769, 0-(4*60)));
Packit ae9e2a
	cl_assert(git_signature__equal(author, git_commit_author(commit)));
Packit ae9e2a
Packit ae9e2a
	cl_assert(git_signature__equal(signature, git_commit_committer(commit)));
Packit ae9e2a
Packit ae9e2a
	/* Make sure the reflogs are updated appropriately */
Packit ae9e2a
	cl_git_pass(git_reflog_read(&reflog, repo, "HEAD"));
Packit ae9e2a
	cl_assert(reflog_entry = git_reflog_entry_byindex(reflog, 0));
Packit ae9e2a
	cl_assert_equal_oid(&parent_id, git_reflog_entry_id_old(reflog_entry));
Packit ae9e2a
	cl_assert_equal_oid(&commit_id, git_reflog_entry_id_new(reflog_entry));
Packit ae9e2a
	cl_assert_equal_s("rebase: Modification 1 to beef", git_reflog_entry_message(reflog_entry));
Packit ae9e2a
Packit ae9e2a
	git_reflog_free(reflog);
Packit ae9e2a
	git_signature_free(author);
Packit ae9e2a
	git_commit_free(commit);
Packit ae9e2a
	git_annotated_commit_free(branch_head);
Packit ae9e2a
	git_annotated_commit_free(upstream_head);
Packit ae9e2a
	git_rebase_free(rebase);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_rebase_merge__blocked_when_dirty(void)
Packit ae9e2a
{
Packit ae9e2a
	git_rebase *rebase;
Packit ae9e2a
	git_reference *branch_ref, *upstream_ref;
Packit ae9e2a
	git_annotated_commit *branch_head, *upstream_head;
Packit ae9e2a
	git_rebase_operation *rebase_operation;
Packit ae9e2a
	git_oid commit_id;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/beef"));
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/master"));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref));
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	/* Allow untracked files */
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_git_mkfile("rebase/untracked_file.txt", "This is untracked\n");
Packit ae9e2a
	cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature,
Packit ae9e2a
		NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	/* Do not allow unstaged */
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_git_mkfile("rebase/veal.txt", "This is an unstaged change\n");
Packit ae9e2a
	cl_git_fail_with(GIT_EUNMERGED, git_rebase_commit(&commit_id, rebase, NULL, signature,
Packit ae9e2a
		NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	git_annotated_commit_free(branch_head);
Packit ae9e2a
	git_annotated_commit_free(upstream_head);
Packit ae9e2a
	git_reference_free(branch_ref);
Packit ae9e2a
	git_reference_free(upstream_ref);
Packit ae9e2a
	git_rebase_free(rebase);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_rebase_merge__commit_updates_rewritten(void)
Packit ae9e2a
{
Packit ae9e2a
	git_rebase *rebase;
Packit ae9e2a
	git_reference *branch_ref, *upstream_ref;
Packit ae9e2a
	git_annotated_commit *branch_head, *upstream_head;
Packit ae9e2a
	git_rebase_operation *rebase_operation;
Packit ae9e2a
	git_oid commit_id;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/beef"));
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/master"));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref));
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature,
Packit ae9e2a
		NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature,
Packit ae9e2a
		NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_file(
Packit ae9e2a
		"da9c51a23d02d931a486f45ad18cda05cf5d2b94 776e4c48922799f903f03f5f6e51da8b01e4cce0\n"
Packit ae9e2a
		"8d1f13f93c4995760ac07d129246ac1ff64c0be9 ba1f9b4fd5cf8151f7818be2111cc0869f1eb95a\n",
Packit ae9e2a
		164, "rebase/.git/rebase-merge/rewritten");
Packit ae9e2a
Packit ae9e2a
	git_annotated_commit_free(branch_head);
Packit ae9e2a
	git_annotated_commit_free(upstream_head);
Packit ae9e2a
	git_reference_free(branch_ref);
Packit ae9e2a
	git_reference_free(upstream_ref);
Packit ae9e2a
	git_rebase_free(rebase);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_rebase_merge__commit_drops_already_applied(void)
Packit ae9e2a
{
Packit ae9e2a
	git_rebase *rebase;
Packit ae9e2a
	git_reference *branch_ref, *upstream_ref;
Packit ae9e2a
	git_annotated_commit *branch_head, *upstream_head;
Packit ae9e2a
	git_rebase_operation *rebase_operation;
Packit ae9e2a
	git_oid commit_id;
Packit ae9e2a
	int error;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/beef"));
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/green_pea"));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref));
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_git_fail(error = git_rebase_commit(&commit_id, rebase, NULL, signature,
Packit ae9e2a
		NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_i(GIT_EAPPLIED, error);
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature,
Packit ae9e2a
		NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_file(
Packit ae9e2a
		"8d1f13f93c4995760ac07d129246ac1ff64c0be9 2ac4fb7b74c1287f6c792acad759e1ec01e18dae\n",
Packit ae9e2a
		82, "rebase/.git/rebase-merge/rewritten");
Packit ae9e2a
Packit ae9e2a
	git_annotated_commit_free(branch_head);
Packit ae9e2a
	git_annotated_commit_free(upstream_head);
Packit ae9e2a
	git_reference_free(branch_ref);
Packit ae9e2a
	git_reference_free(upstream_ref);
Packit ae9e2a
	git_rebase_free(rebase);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_rebase_merge__finish(void)
Packit ae9e2a
{
Packit ae9e2a
	git_rebase *rebase;
Packit ae9e2a
	git_reference *branch_ref, *upstream_ref, *head_ref;
Packit ae9e2a
	git_annotated_commit *branch_head, *upstream_head;
Packit ae9e2a
	git_rebase_operation *rebase_operation;
Packit ae9e2a
	git_oid commit_id;
Packit ae9e2a
	git_reflog *reflog;
Packit ae9e2a
	const git_reflog_entry *reflog_entry;
Packit ae9e2a
	int error;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/gravy"));
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/veal"));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref));
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature,
Packit ae9e2a
		NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_fail(error = git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_assert_equal_i(GIT_ITEROVER, error);
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_finish(rebase, signature));
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_i(GIT_REPOSITORY_STATE_NONE, git_repository_state(repo));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&head_ref, repo, "HEAD"));
Packit ae9e2a
	cl_assert_equal_i(GIT_REF_SYMBOLIC, git_reference_type(head_ref));
Packit ae9e2a
	cl_assert_equal_s("refs/heads/gravy", git_reference_symbolic_target(head_ref));
Packit ae9e2a
Packit ae9e2a
	/* Make sure the reflogs are updated appropriately */
Packit ae9e2a
	cl_git_pass(git_reflog_read(&reflog, repo, "HEAD"));
Packit ae9e2a
	cl_assert(reflog_entry = git_reflog_entry_byindex(reflog, 0));
Packit ae9e2a
	cl_assert_equal_oid(&commit_id, git_reflog_entry_id_old(reflog_entry));
Packit ae9e2a
	cl_assert_equal_oid(&commit_id, git_reflog_entry_id_new(reflog_entry));
Packit ae9e2a
	cl_assert_equal_s("rebase finished: returning to refs/heads/gravy", git_reflog_entry_message(reflog_entry));
Packit ae9e2a
	git_reflog_free(reflog);
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_reflog_read(&reflog, repo, "refs/heads/gravy"));
Packit ae9e2a
	cl_assert(reflog_entry = git_reflog_entry_byindex(reflog, 0));
Packit ae9e2a
	cl_assert_equal_oid(git_annotated_commit_id(branch_head), git_reflog_entry_id_old(reflog_entry));
Packit ae9e2a
	cl_assert_equal_oid(&commit_id, git_reflog_entry_id_new(reflog_entry));
Packit ae9e2a
	cl_assert_equal_s("rebase finished: refs/heads/gravy onto f87d14a4a236582a0278a916340a793714256864", git_reflog_entry_message(reflog_entry));
Packit ae9e2a
Packit ae9e2a
	git_reflog_free(reflog);
Packit ae9e2a
	git_annotated_commit_free(branch_head);
Packit ae9e2a
	git_annotated_commit_free(upstream_head);
Packit ae9e2a
	git_reference_free(head_ref);
Packit ae9e2a
	git_reference_free(branch_ref);
Packit ae9e2a
	git_reference_free(upstream_ref);
Packit ae9e2a
	git_rebase_free(rebase);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_rebase_merge__detached_finish(void)
Packit ae9e2a
{
Packit ae9e2a
	git_rebase *rebase;
Packit ae9e2a
	git_reference *branch_ref, *upstream_ref, *head_ref;
Packit ae9e2a
	git_annotated_commit *branch_head, *upstream_head;
Packit ae9e2a
	git_rebase_operation *rebase_operation;
Packit ae9e2a
	git_oid commit_id;
Packit ae9e2a
	git_reflog *reflog;
Packit ae9e2a
	const git_reflog_entry *reflog_entry;
Packit ae9e2a
	git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT;
Packit ae9e2a
	int error;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/gravy"));
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/veal"));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref));
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_set_head_detached_from_annotated(repo, branch_head));
Packit ae9e2a
	opts.checkout_strategy = GIT_CHECKOUT_FORCE;
Packit ae9e2a
	git_checkout_head(repo, &opts);
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_init(&rebase, repo, NULL, upstream_head, NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature,
Packit ae9e2a
		NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_fail(error = git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_assert_equal_i(GIT_ITEROVER, error);
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_finish(rebase, signature));
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_i(GIT_REPOSITORY_STATE_NONE, git_repository_state(repo));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&head_ref, repo, "HEAD"));
Packit ae9e2a
	cl_assert_equal_i(GIT_REF_OID, git_reference_type(head_ref));
Packit ae9e2a
Packit ae9e2a
	/* Make sure the reflogs are updated appropriately */
Packit ae9e2a
	cl_git_pass(git_reflog_read(&reflog, repo, "HEAD"));
Packit ae9e2a
	cl_assert(reflog_entry = git_reflog_entry_byindex(reflog, 0));
Packit ae9e2a
	cl_assert_equal_oid(git_annotated_commit_id(upstream_head), git_reflog_entry_id_old(reflog_entry));
Packit ae9e2a
	cl_assert_equal_oid(&commit_id, git_reflog_entry_id_new(reflog_entry));
Packit ae9e2a
Packit ae9e2a
	git_reflog_free(reflog);
Packit ae9e2a
	git_annotated_commit_free(branch_head);
Packit ae9e2a
	git_annotated_commit_free(upstream_head);
Packit ae9e2a
	git_reference_free(head_ref);
Packit ae9e2a
	git_reference_free(branch_ref);
Packit ae9e2a
	git_reference_free(upstream_ref);
Packit ae9e2a
	git_rebase_free(rebase);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_rebase_merge__finish_with_ids(void)
Packit ae9e2a
{
Packit ae9e2a
	git_rebase *rebase;
Packit ae9e2a
	git_reference *head_ref;
Packit ae9e2a
	git_oid branch_id, upstream_id;
Packit ae9e2a
	git_annotated_commit *branch_head, *upstream_head;
Packit ae9e2a
	git_rebase_operation *rebase_operation;
Packit ae9e2a
	git_oid commit_id;
Packit ae9e2a
	git_reflog *reflog;
Packit ae9e2a
	const git_reflog_entry *reflog_entry;
Packit ae9e2a
	int error;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_oid_fromstr(&branch_id, "d616d97082eb7bb2dc6f180a7cca940993b7a56f"));
Packit ae9e2a
	cl_git_pass(git_oid_fromstr(&upstream_id, "f87d14a4a236582a0278a916340a793714256864"));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_annotated_commit_lookup(&branch_head, repo, &branch_id));
Packit ae9e2a
	cl_git_pass(git_annotated_commit_lookup(&upstream_head, repo, &upstream_id));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature,
Packit ae9e2a
		NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_fail(error = git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_assert_equal_i(GIT_ITEROVER, error);
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_finish(rebase, signature));
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_i(GIT_REPOSITORY_STATE_NONE, git_repository_state(repo));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&head_ref, repo, "HEAD"));
Packit ae9e2a
	cl_assert_equal_i(GIT_REF_OID, git_reference_type(head_ref));
Packit ae9e2a
	cl_assert_equal_oid(&commit_id, git_reference_target(head_ref));
Packit ae9e2a
Packit ae9e2a
	/* reflogs are not updated as if we were operating on proper
Packit ae9e2a
	 * branches.  check that the last reflog entry is the rebase.
Packit ae9e2a
	 */
Packit ae9e2a
	cl_git_pass(git_reflog_read(&reflog, repo, "HEAD"));
Packit ae9e2a
	cl_assert(reflog_entry = git_reflog_entry_byindex(reflog, 0));
Packit ae9e2a
	cl_assert_equal_oid(&commit_id, git_reflog_entry_id_new(reflog_entry));
Packit ae9e2a
	cl_assert_equal_s("rebase: Modification 3 to gravy", git_reflog_entry_message(reflog_entry));
Packit ae9e2a
	git_reflog_free(reflog);
Packit ae9e2a
Packit ae9e2a
	git_annotated_commit_free(branch_head);
Packit ae9e2a
	git_annotated_commit_free(upstream_head);
Packit ae9e2a
	git_reference_free(head_ref);
Packit ae9e2a
	git_rebase_free(rebase);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_rebase_merge__no_common_ancestor(void)
Packit ae9e2a
{
Packit ae9e2a
	git_rebase *rebase;
Packit ae9e2a
	git_reference *branch_ref, *upstream_ref;
Packit ae9e2a
	git_annotated_commit *branch_head, *upstream_head;
Packit ae9e2a
	git_rebase_operation *rebase_operation;
Packit ae9e2a
	git_oid commit_id, expected_final_id;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/barley"));
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/master"));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref));
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature,
Packit ae9e2a
		NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature,
Packit ae9e2a
		NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature,
Packit ae9e2a
		NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature,
Packit ae9e2a
		NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature,
Packit ae9e2a
		NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_finish(rebase, signature));
Packit ae9e2a
Packit ae9e2a
	git_oid_fromstr(&expected_final_id, "71e7ee8d4fe7d8bf0d107355197e0a953dfdb7f3");
Packit ae9e2a
	cl_assert_equal_oid(&expected_final_id, &commit_id);
Packit ae9e2a
Packit ae9e2a
	git_annotated_commit_free(branch_head);
Packit ae9e2a
	git_annotated_commit_free(upstream_head);
Packit ae9e2a
	git_reference_free(branch_ref);
Packit ae9e2a
	git_reference_free(upstream_ref);
Packit ae9e2a
	git_rebase_free(rebase);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
static void test_copy_note(
Packit ae9e2a
	const git_rebase_options *opts,
Packit ae9e2a
	bool should_exist)
Packit ae9e2a
{
Packit ae9e2a
	git_rebase *rebase;
Packit ae9e2a
	git_reference *branch_ref, *upstream_ref;
Packit ae9e2a
	git_annotated_commit *branch_head, *upstream_head;
Packit ae9e2a
	git_commit *branch_commit;
Packit ae9e2a
	git_rebase_operation *rebase_operation;
Packit ae9e2a
	git_oid note_id, commit_id;
Packit ae9e2a
	git_note *note = NULL;
Packit ae9e2a
	int error;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/gravy"));
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/veal"));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref));
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_reference_peel((git_object **)&branch_commit,
Packit ae9e2a
		branch_ref, GIT_OBJ_COMMIT));
Packit ae9e2a
Packit ae9e2a
	/* Add a note to a commit */
Packit ae9e2a
	cl_git_pass(git_note_create(&note_id, repo, "refs/notes/test",
Packit ae9e2a
		git_commit_author(branch_commit), git_commit_committer(branch_commit),
Packit ae9e2a
		git_commit_id(branch_commit),
Packit ae9e2a
		"This is a commit note.", 0));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, opts));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature,
Packit ae9e2a
		NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_finish(rebase, signature));
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_i(GIT_REPOSITORY_STATE_NONE, git_repository_state(repo));
Packit ae9e2a
Packit ae9e2a
	if (should_exist) {
Packit ae9e2a
		cl_git_pass(git_note_read(&note, repo, "refs/notes/test", &commit_id));
Packit ae9e2a
		cl_assert_equal_s("This is a commit note.", git_note_message(note));
Packit ae9e2a
	} else {
Packit ae9e2a
		cl_git_fail(error =
Packit ae9e2a
			git_note_read(&note, repo, "refs/notes/test", &commit_id));
Packit ae9e2a
		cl_assert_equal_i(GIT_ENOTFOUND, error);
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	git_note_free(note);
Packit ae9e2a
	git_commit_free(branch_commit);
Packit ae9e2a
	git_annotated_commit_free(branch_head);
Packit ae9e2a
	git_annotated_commit_free(upstream_head);
Packit ae9e2a
	git_reference_free(branch_ref);
Packit ae9e2a
	git_reference_free(upstream_ref);
Packit ae9e2a
	git_rebase_free(rebase);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_rebase_merge__copy_notes_off_by_default(void)
Packit ae9e2a
{
Packit ae9e2a
	test_copy_note(NULL, 0);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_rebase_merge__copy_notes_specified_in_options(void)
Packit ae9e2a
{
Packit ae9e2a
	git_rebase_options opts = GIT_REBASE_OPTIONS_INIT;
Packit ae9e2a
	opts.rewrite_notes_ref = "refs/notes/test";
Packit ae9e2a
Packit ae9e2a
	test_copy_note(&opts, 1);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_rebase_merge__copy_notes_specified_in_config(void)
Packit ae9e2a
{
Packit ae9e2a
	git_config *config;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_config(&config, repo));
Packit ae9e2a
	cl_git_pass(git_config_set_string(config,
Packit ae9e2a
		"notes.rewriteRef", "refs/notes/test"));
Packit ae9e2a
Packit ae9e2a
	test_copy_note(NULL, 1);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_rebase_merge__copy_notes_disabled_in_config(void)
Packit ae9e2a
{
Packit ae9e2a
	git_config *config;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_config(&config, repo));
Packit ae9e2a
	cl_git_pass(git_config_set_bool(config, "notes.rewrite.rebase", 0));
Packit ae9e2a
	cl_git_pass(git_config_set_string(config,
Packit ae9e2a
		"notes.rewriteRef", "refs/notes/test"));
Packit ae9e2a
Packit ae9e2a
	test_copy_note(NULL, 0);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void rebase_checkout_progress_cb(
Packit ae9e2a
	const char *path,
Packit ae9e2a
	size_t completed_steps,
Packit ae9e2a
	size_t total_steps,
Packit ae9e2a
	void *payload)
Packit ae9e2a
{
Packit ae9e2a
	int *called = payload;
Packit ae9e2a
Packit ae9e2a
	GIT_UNUSED(path);
Packit ae9e2a
	GIT_UNUSED(completed_steps);
Packit ae9e2a
	GIT_UNUSED(total_steps);
Packit ae9e2a
Packit ae9e2a
	*called = 1;
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_rebase_merge__custom_checkout_options(void)
Packit ae9e2a
{
Packit ae9e2a
	git_rebase *rebase;
Packit ae9e2a
	git_reference *branch_ref, *upstream_ref;
Packit ae9e2a
	git_annotated_commit *branch_head, *upstream_head;
Packit ae9e2a
	git_rebase_options rebase_options = GIT_REBASE_OPTIONS_INIT;
Packit ae9e2a
	git_checkout_options checkout_options = GIT_CHECKOUT_OPTIONS_INIT;
Packit ae9e2a
	git_rebase_operation *rebase_operation;
Packit ae9e2a
	int called = 0;
Packit ae9e2a
Packit ae9e2a
	checkout_options.progress_cb = rebase_checkout_progress_cb;
Packit ae9e2a
	checkout_options.progress_payload = &called;
Packit ae9e2a
Packit ae9e2a
	memcpy(&rebase_options.checkout_options, &checkout_options,
Packit ae9e2a
		sizeof(git_checkout_options));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/beef"));
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/master"));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref));
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref));
Packit ae9e2a
Packit ae9e2a
	called = 0;
Packit ae9e2a
	cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, &rebase_options));
Packit ae9e2a
	cl_assert_equal_i(1, called);
Packit ae9e2a
Packit ae9e2a
	called = 0;
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_assert_equal_i(1, called);
Packit ae9e2a
Packit ae9e2a
	called = 0;
Packit ae9e2a
	cl_git_pass(git_rebase_abort(rebase));
Packit ae9e2a
	cl_assert_equal_i(1, called);
Packit ae9e2a
Packit ae9e2a
	git_annotated_commit_free(branch_head);
Packit ae9e2a
	git_annotated_commit_free(upstream_head);
Packit ae9e2a
	git_reference_free(branch_ref);
Packit ae9e2a
	git_reference_free(upstream_ref);
Packit ae9e2a
	git_rebase_free(rebase);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_rebase_merge__custom_merge_options(void)
Packit ae9e2a
{
Packit ae9e2a
	git_rebase *rebase;
Packit ae9e2a
	git_reference *branch_ref, *upstream_ref;
Packit ae9e2a
	git_annotated_commit *branch_head, *upstream_head;
Packit ae9e2a
	git_rebase_options rebase_options = GIT_REBASE_OPTIONS_INIT;
Packit ae9e2a
	git_rebase_operation *rebase_operation;
Packit ae9e2a
Packit ae9e2a
	rebase_options.merge_options.flags |=
Packit ae9e2a
		GIT_MERGE_FAIL_ON_CONFLICT |
Packit ae9e2a
		GIT_MERGE_SKIP_REUC;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/asparagus"));
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/master"));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref));
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, &rebase_options));
Packit ae9e2a
Packit ae9e2a
	cl_git_fail_with(GIT_EMERGECONFLICT, git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
Packit ae9e2a
	git_annotated_commit_free(branch_head);
Packit ae9e2a
	git_annotated_commit_free(upstream_head);
Packit ae9e2a
	git_reference_free(branch_ref);
Packit ae9e2a
	git_reference_free(upstream_ref);
Packit ae9e2a
	git_rebase_free(rebase);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_rebase_merge__with_directories(void)
Packit ae9e2a
{
Packit ae9e2a
	git_rebase *rebase;
Packit ae9e2a
	git_reference *branch_ref, *upstream_ref;
Packit ae9e2a
	git_annotated_commit *branch_head, *upstream_head;
Packit ae9e2a
	git_rebase_operation *rebase_operation;
Packit ae9e2a
	git_oid commit_id, tree_id;
Packit ae9e2a
	git_commit *commit;
Packit ae9e2a
Packit ae9e2a
	git_oid_fromstr(&tree_id, "a4d6d9c3d57308fd8e320cf2525bae8f1adafa57");
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/deep_gravy"));
Packit ae9e2a
	cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/veal"));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&branch_head, repo, branch_ref));
Packit ae9e2a
	cl_git_pass(git_annotated_commit_from_ref(&upstream_head, repo, upstream_ref));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_init(&rebase, repo, branch_head, upstream_head, NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature,
Packit ae9e2a
		NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
	cl_git_pass(git_rebase_commit(&commit_id, rebase, NULL, signature,
Packit ae9e2a
		NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_git_fail_with(GIT_ITEROVER, git_rebase_next(&rebase_operation, rebase));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_commit_lookup(&commit, repo, &commit_id));
Packit ae9e2a
	cl_assert_equal_oid(&tree_id, git_commit_tree_id(commit));
Packit ae9e2a
Packit ae9e2a
	git_commit_free(commit);
Packit ae9e2a
	git_annotated_commit_free(branch_head);
Packit ae9e2a
	git_annotated_commit_free(upstream_head);
Packit ae9e2a
	git_reference_free(branch_ref);
Packit ae9e2a
	git_reference_free(upstream_ref);
Packit ae9e2a
	git_rebase_free(rebase);
Packit ae9e2a
}