Blame tests/worktree/refs.c

Packit ae9e2a
#include "clar_libgit2.h"
Packit ae9e2a
#include "path.h"
Packit ae9e2a
#include "refs.h"
Packit ae9e2a
#include "worktree.h"
Packit ae9e2a
#include "worktree_helpers.h"
Packit ae9e2a
Packit ae9e2a
#define COMMON_REPO "testrepo"
Packit ae9e2a
#define WORKTREE_REPO "testrepo-worktree"
Packit ae9e2a
Packit ae9e2a
static worktree_fixture fixture =
Packit ae9e2a
	WORKTREE_FIXTURE_INIT(COMMON_REPO, WORKTREE_REPO);
Packit ae9e2a
Packit ae9e2a
void test_worktree_refs__initialize(void)
Packit ae9e2a
{
Packit ae9e2a
	setup_fixture_worktree(&fixture);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_worktree_refs__cleanup(void)
Packit ae9e2a
{
Packit ae9e2a
	cleanup_fixture_worktree(&fixture);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_worktree_refs__list(void)
Packit ae9e2a
{
Packit ae9e2a
	git_strarray refs, wtrefs;
Packit ae9e2a
	unsigned i, j;
Packit ae9e2a
	int error = 0;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_reference_list(&refs, fixture.repo));
Packit ae9e2a
	cl_git_pass(git_reference_list(&wtrefs, fixture.worktree));
Packit ae9e2a
Packit ae9e2a
	if (refs.count != wtrefs.count)
Packit ae9e2a
	{
Packit ae9e2a
		error = GIT_ERROR;
Packit ae9e2a
		goto exit;
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	for (i = 0; i < refs.count; i++)
Packit ae9e2a
	{
Packit ae9e2a
		int found = 0;
Packit ae9e2a
Packit ae9e2a
		for (j = 0; j < wtrefs.count; j++)
Packit ae9e2a
		{
Packit ae9e2a
			if (!strcmp(refs.strings[i], wtrefs.strings[j]))
Packit ae9e2a
			{
Packit ae9e2a
				found = 1;
Packit ae9e2a
				break;
Packit ae9e2a
			}
Packit ae9e2a
		}
Packit ae9e2a
Packit ae9e2a
		if (!found)
Packit ae9e2a
		{
Packit ae9e2a
			error = GIT_ERROR;
Packit ae9e2a
			goto exit;
Packit ae9e2a
		}
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
exit:
Packit ae9e2a
	git_strarray_free(&refs);
Packit ae9e2a
	git_strarray_free(&wtrefs);
Packit ae9e2a
	cl_git_pass(error);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_worktree_refs__read_head(void)
Packit ae9e2a
{
Packit ae9e2a
	git_reference *head;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_head(&head, fixture.worktree));
Packit ae9e2a
Packit ae9e2a
	git_reference_free(head);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_worktree_refs__set_head_fails_when_worktree_wants_linked_repos_HEAD(void)
Packit ae9e2a
{
Packit ae9e2a
	git_reference *head;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_head(&head, fixture.repo));
Packit ae9e2a
	cl_git_fail(git_repository_set_head(fixture.worktree, git_reference_name(head)));
Packit ae9e2a
Packit ae9e2a
	git_reference_free(head);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_worktree_refs__set_head_fails_when_main_repo_wants_worktree_head(void)
Packit ae9e2a
{
Packit ae9e2a
	git_reference *head;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_head(&head, fixture.worktree));
Packit ae9e2a
	cl_git_fail(git_repository_set_head(fixture.repo, git_reference_name(head)));
Packit ae9e2a
Packit ae9e2a
	git_reference_free(head);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_worktree_refs__set_head_works_for_current_HEAD(void)
Packit ae9e2a
{
Packit ae9e2a
	git_reference *head;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_head(&head, fixture.repo));
Packit ae9e2a
	cl_git_pass(git_repository_set_head(fixture.repo, git_reference_name(head)));
Packit ae9e2a
Packit ae9e2a
	git_reference_free(head);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_worktree_refs__set_head_fails_when_already_checked_out(void)
Packit ae9e2a
{
Packit ae9e2a
	cl_git_fail(git_repository_set_head(fixture.repo, "refs/heads/testrepo-worktree"));
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_worktree_refs__delete_fails_for_checked_out_branch(void)
Packit ae9e2a
{
Packit ae9e2a
	git_reference *branch;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_branch_lookup(&branch, fixture.repo,
Packit ae9e2a
		    "testrepo-worktree", GIT_BRANCH_LOCAL));
Packit ae9e2a
	cl_git_fail(git_branch_delete(branch));
Packit ae9e2a
Packit ae9e2a
	git_reference_free(branch);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_worktree_refs__delete_succeeds_after_pruning_worktree(void)
Packit ae9e2a
{
Packit ae9e2a
	git_worktree_prune_options opts = GIT_WORKTREE_PRUNE_OPTIONS_INIT;
Packit ae9e2a
	git_reference *branch;
Packit ae9e2a
	git_worktree *worktree;
Packit ae9e2a
Packit ae9e2a
	opts.flags = GIT_WORKTREE_PRUNE_VALID;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_worktree_lookup(&worktree, fixture.repo, fixture.worktreename));
Packit ae9e2a
	cl_git_pass(git_worktree_prune(worktree, &opts));
Packit ae9e2a
	git_worktree_free(worktree);
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_branch_lookup(&branch, fixture.repo,
Packit ae9e2a
		    "testrepo-worktree", GIT_BRANCH_LOCAL));
Packit ae9e2a
	cl_git_pass(git_branch_delete(branch));
Packit ae9e2a
	git_reference_free(branch);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_worktree_refs__renaming_reference_updates_worktree_heads(void)
Packit ae9e2a
{
Packit ae9e2a
	git_reference *head, *branch, *renamed;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_branch_lookup(&branch, fixture.repo,
Packit ae9e2a
		    "testrepo-worktree", GIT_BRANCH_LOCAL));
Packit ae9e2a
	cl_git_pass(git_reference_rename(&renamed, branch, "refs/heads/renamed", 0, NULL));
Packit ae9e2a
	cl_git_pass(git_repository_head(&head, fixture.worktree));
Packit ae9e2a
Packit ae9e2a
	git_reference_free(head);
Packit ae9e2a
	git_reference_free(branch);
Packit ae9e2a
	git_reference_free(renamed);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_worktree_refs__creating_refs_uses_commondir(void)
Packit ae9e2a
{
Packit ae9e2a
	   git_reference *head, *branch, *lookup;
Packit ae9e2a
	   git_commit *commit;
Packit ae9e2a
	   git_buf refpath = GIT_BUF_INIT;
Packit ae9e2a
Packit ae9e2a
	   cl_git_pass(git_buf_joinpath(&refpath,
Packit ae9e2a
		       git_repository_commondir(fixture.worktree), "refs/heads/testbranch"));
Packit ae9e2a
	   cl_assert(!git_path_exists(refpath.ptr));
Packit ae9e2a
Packit ae9e2a
	   cl_git_pass(git_repository_head(&head, fixture.worktree));
Packit ae9e2a
	   cl_git_pass(git_commit_lookup(&commit, fixture.worktree, git_reference_target(head)));
Packit ae9e2a
	   cl_git_pass(git_branch_create(&branch, fixture.worktree, "testbranch", commit, 0));
Packit ae9e2a
	   cl_git_pass(git_branch_lookup(&lookup, fixture.worktree, "testbranch", GIT_BRANCH_LOCAL));
Packit ae9e2a
	   cl_assert(git_reference_cmp(branch, lookup) == 0);
Packit ae9e2a
	   cl_assert(git_path_exists(refpath.ptr));
Packit ae9e2a
Packit ae9e2a
	   git_reference_free(lookup);
Packit ae9e2a
	   git_reference_free(branch);
Packit ae9e2a
	   git_reference_free(head);
Packit ae9e2a
	   git_commit_free(commit);
Packit ae9e2a
	   git_buf_free(&refpath);
Packit ae9e2a
}