Blame tests/worktree/worktree.c

Packit Service 20376f
#include "clar_libgit2.h"
Packit Service 20376f
#include "worktree_helpers.h"
Packit Service 20376f
#include "submodule/submodule_helpers.h"
Packit Service 20376f
Packit Service 20376f
#include "checkout.h"
Packit Service 20376f
#include "repository.h"
Packit Service 20376f
#include "worktree.h"
Packit Service 20376f
Packit Service 20376f
#define COMMON_REPO "testrepo"
Packit Service 20376f
#define WORKTREE_REPO "testrepo-worktree"
Packit Service 20376f
Packit Service 20376f
static worktree_fixture fixture =
Packit Service 20376f
	WORKTREE_FIXTURE_INIT(COMMON_REPO, WORKTREE_REPO);
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__initialize(void)
Packit Service 20376f
{
Packit Service 20376f
	setup_fixture_worktree(&fixture);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__cleanup(void)
Packit Service 20376f
{
Packit Service 20376f
	cleanup_fixture_worktree(&fixture);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__list(void)
Packit Service 20376f
{
Packit Service 20376f
	git_strarray wts;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_worktree_list(&wts, fixture.repo));
Packit Service 20376f
	cl_assert_equal_i(wts.count, 1);
Packit Service 20376f
	cl_assert_equal_s(wts.strings[0], "testrepo-worktree");
Packit Service 20376f
Packit Service 20376f
	git_strarray_free(&wts);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__list_with_invalid_worktree_dirs(void)
Packit Service 20376f
{
Packit Service 20376f
	const char *filesets[3][2] = {
Packit Service 20376f
		{ "gitdir", "commondir" },
Packit Service 20376f
		{ "gitdir", "HEAD" },
Packit Service 20376f
		{ "HEAD", "commondir" },
Packit Service 20376f
	};
Packit Service 20376f
	git_buf path = GIT_BUF_INIT;
Packit Service 20376f
	git_strarray wts;
Packit Service 20376f
	unsigned i, j, len;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_buf_printf(&path, "%s/worktrees/invalid",
Packit Service 20376f
		    fixture.repo->commondir));
Packit Service 20376f
	cl_git_pass(p_mkdir(path.ptr, 0755));
Packit Service 20376f
Packit Service 20376f
	len = path.size;
Packit Service 20376f
Packit Service 20376f
	for (i = 0; i < ARRAY_SIZE(filesets); i++) {
Packit Service 20376f
Packit Service 20376f
		for (j = 0; j < ARRAY_SIZE(filesets[i]); j++) {
Packit Service 20376f
			git_buf_truncate(&path, len);
Packit Service 20376f
			cl_git_pass(git_buf_joinpath(&path, path.ptr, filesets[i][j]));
Packit Service 20376f
			cl_git_pass(p_close(p_creat(path.ptr, 0644)));
Packit Service 20376f
		}
Packit Service 20376f
Packit Service 20376f
		cl_git_pass(git_worktree_list(&wts, fixture.worktree));
Packit Service 20376f
		cl_assert_equal_i(wts.count, 1);
Packit Service 20376f
		cl_assert_equal_s(wts.strings[0], "testrepo-worktree");
Packit Service 20376f
		git_strarray_free(&wts);
Packit Service 20376f
Packit Service 20376f
		for (j = 0; j < ARRAY_SIZE(filesets[i]); j++) {
Packit Service 20376f
			git_buf_truncate(&path, len);
Packit Service 20376f
			cl_git_pass(git_buf_joinpath(&path, path.ptr, filesets[i][j]));
Packit Service 20376f
			p_unlink(path.ptr);
Packit Service 20376f
		}
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	git_buf_free(&path);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__list_in_worktree_repo(void)
Packit Service 20376f
{
Packit Service 20376f
	git_strarray wts;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_worktree_list(&wts, fixture.worktree));
Packit Service 20376f
	cl_assert_equal_i(wts.count, 1);
Packit Service 20376f
	cl_assert_equal_s(wts.strings[0], "testrepo-worktree");
Packit Service 20376f
Packit Service 20376f
	git_strarray_free(&wts);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__list_bare(void)
Packit Service 20376f
{
Packit Service 20376f
	git_repository *repo;
Packit Service 20376f
	git_strarray wts;
Packit Service 20376f
Packit Service 20376f
	repo = cl_git_sandbox_init("testrepo.git");
Packit Service 20376f
	cl_git_pass(git_worktree_list(&wts, repo));
Packit Service 20376f
	cl_assert_equal_i(wts.count, 0);
Packit Service 20376f
Packit Service 20376f
	git_repository_free(repo);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__list_without_worktrees(void)
Packit Service 20376f
{
Packit Service 20376f
	git_repository *repo;
Packit Service 20376f
	git_strarray wts;
Packit Service 20376f
Packit Service 20376f
	repo = cl_git_sandbox_init("testrepo2");
Packit Service 20376f
	cl_git_pass(git_worktree_list(&wts, repo));
Packit Service 20376f
	cl_assert_equal_i(wts.count, 0);
Packit Service 20376f
Packit Service 20376f
	git_repository_free(repo);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__lookup(void)
Packit Service 20376f
{
Packit Service 20376f
	git_worktree *wt;
Packit Service 20376f
	git_buf gitdir_path = GIT_BUF_INIT;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_buf_joinpath(&gitdir_path, fixture.repo->commondir, "worktrees/testrepo-worktree/"));
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_s(wt->gitdir_path, gitdir_path.ptr);
Packit Service 20376f
	cl_assert_equal_s(wt->parent_path, fixture.repo->workdir);
Packit Service 20376f
	cl_assert_equal_s(wt->gitlink_path, fixture.worktree->gitlink);
Packit Service 20376f
	cl_assert_equal_s(wt->commondir_path, fixture.repo->gitdir);
Packit Service 20376f
	cl_assert_equal_s(wt->commondir_path, fixture.repo->commondir);
Packit Service 20376f
Packit Service 20376f
	git_buf_free(&gitdir_path);
Packit Service 20376f
	git_worktree_free(wt);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__lookup_nonexistent_worktree(void)
Packit Service 20376f
{
Packit Service 20376f
	git_worktree *wt;
Packit Service 20376f
Packit Service 20376f
	cl_git_fail(git_worktree_lookup(&wt, fixture.repo, "nonexistent"));
Packit Service 20376f
	cl_assert_equal_p(wt, NULL);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__open(void)
Packit Service 20376f
{
Packit Service 20376f
	git_worktree *wt;
Packit Service 20376f
	git_repository *repo;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_open_from_worktree(&repo, wt));
Packit Service 20376f
	cl_assert_equal_s(git_repository_workdir(repo),
Packit Service 20376f
		git_repository_workdir(fixture.worktree));
Packit Service 20376f
Packit Service 20376f
	git_repository_free(repo);
Packit Service 20376f
	git_worktree_free(wt);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__open_invalid_commondir(void)
Packit Service 20376f
{
Packit Service 20376f
	git_worktree *wt;
Packit Service 20376f
	git_repository *repo;
Packit Service 20376f
	git_buf buf = GIT_BUF_INIT, path = GIT_BUF_INIT;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_buf_sets(&buf, "/path/to/nonexistent/commondir"));
Packit Service 20376f
	cl_git_pass(git_buf_printf(&path,
Packit Service 20376f
		    "%s/worktrees/testrepo-worktree/commondir",
Packit Service 20376f
		    fixture.repo->commondir));
Packit Service 20376f
	cl_git_pass(git_futils_writebuffer(&buf, path.ptr, O_RDWR, 0644));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
Packit Service 20376f
	cl_git_fail(git_repository_open_from_worktree(&repo, wt));
Packit Service 20376f
Packit Service 20376f
	git_buf_free(&buf;;
Packit Service 20376f
	git_buf_free(&path);
Packit Service 20376f
	git_worktree_free(wt);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__open_invalid_gitdir(void)
Packit Service 20376f
{
Packit Service 20376f
	git_worktree *wt;
Packit Service 20376f
	git_repository *repo;
Packit Service 20376f
	git_buf buf = GIT_BUF_INIT, path = GIT_BUF_INIT;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_buf_sets(&buf, "/path/to/nonexistent/gitdir"));
Packit Service 20376f
	cl_git_pass(git_buf_printf(&path,
Packit Service 20376f
		    "%s/worktrees/testrepo-worktree/gitdir",
Packit Service 20376f
		    fixture.repo->commondir));
Packit Service 20376f
	cl_git_pass(git_futils_writebuffer(&buf, path.ptr, O_RDWR, 0644));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
Packit Service 20376f
	cl_git_fail(git_repository_open_from_worktree(&repo, wt));
Packit Service 20376f
Packit Service 20376f
	git_buf_free(&buf;;
Packit Service 20376f
	git_buf_free(&path);
Packit Service 20376f
	git_worktree_free(wt);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__open_invalid_parent(void)
Packit Service 20376f
{
Packit Service 20376f
	git_worktree *wt;
Packit Service 20376f
	git_repository *repo;
Packit Service 20376f
	git_buf buf = GIT_BUF_INIT;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_buf_sets(&buf, "/path/to/nonexistent/gitdir"));
Packit Service 20376f
	cl_git_pass(git_futils_writebuffer(&buf,
Packit Service 20376f
		    fixture.worktree->gitlink, O_RDWR, 0644));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
Packit Service 20376f
	cl_git_fail(git_repository_open_from_worktree(&repo, wt));
Packit Service 20376f
Packit Service 20376f
	git_buf_free(&buf;;
Packit Service 20376f
	git_worktree_free(wt);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__init(void)
Packit Service 20376f
{
Packit Service 20376f
	git_worktree *wt;
Packit Service 20376f
	git_repository *repo;
Packit Service 20376f
	git_reference *branch;
Packit Service 20376f
	git_buf path = GIT_BUF_INIT;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_buf_joinpath(&path, fixture.repo->workdir, "../worktree-new"));
Packit Service 20376f
	cl_git_pass(git_worktree_add(&wt, fixture.repo, "worktree-new", path.ptr, NULL));
Packit Service 20376f
Packit Service 20376f
	/* Open and verify created repo */
Packit Service 20376f
	cl_git_pass(git_repository_open(&repo, path.ptr));
Packit Service 20376f
	cl_assert(git__suffixcmp(git_repository_workdir(repo), "worktree-new/") == 0);
Packit Service 20376f
	cl_git_pass(git_branch_lookup(&branch, repo, "worktree-new", GIT_BRANCH_LOCAL));
Packit Service 20376f
Packit Service 20376f
	git_buf_free(&path);
Packit Service 20376f
	git_worktree_free(wt);
Packit Service 20376f
	git_reference_free(branch);
Packit Service 20376f
	git_repository_free(repo);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__add_locked(void)
Packit Service 20376f
{
Packit Service 20376f
	git_worktree *wt;
Packit Service 20376f
	git_repository *repo;
Packit Service 20376f
	git_reference *branch;
Packit Service 20376f
	git_buf path = GIT_BUF_INIT;
Packit Service 20376f
	git_worktree_add_options opts = GIT_WORKTREE_ADD_OPTIONS_INIT;
Packit Service 20376f
Packit Service 20376f
	opts.lock = 1;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_buf_joinpath(&path, fixture.repo->workdir, "../worktree-locked"));
Packit Service 20376f
	cl_git_pass(git_worktree_add(&wt, fixture.repo, "worktree-locked", path.ptr, &opts));
Packit Service 20376f
Packit Service 20376f
	/* Open and verify created repo */
Packit Service 20376f
	cl_assert(git_worktree_is_locked(NULL, wt));
Packit Service 20376f
	cl_git_pass(git_repository_open(&repo, path.ptr));
Packit Service 20376f
	cl_assert(git__suffixcmp(git_repository_workdir(repo), "worktree-locked/") == 0);
Packit Service 20376f
	cl_git_pass(git_branch_lookup(&branch, repo, "worktree-locked", GIT_BRANCH_LOCAL));
Packit Service 20376f
Packit Service 20376f
	git_buf_free(&path);
Packit Service 20376f
	git_worktree_free(wt);
Packit Service 20376f
	git_reference_free(branch);
Packit Service 20376f
	git_repository_free(repo);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__init_existing_branch(void)
Packit Service 20376f
{
Packit Service 20376f
	git_reference *head, *branch;
Packit Service 20376f
	git_commit *commit;
Packit Service 20376f
	git_worktree *wt;
Packit Service 20376f
	git_buf path = GIT_BUF_INIT;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_head(&head, fixture.repo));
Packit Service 20376f
	cl_git_pass(git_commit_lookup(&commit, fixture.repo, &head->target.oid));
Packit Service 20376f
	cl_git_pass(git_branch_create(&branch, fixture.repo, "worktree-new", commit, false));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_buf_joinpath(&path, fixture.repo->workdir, "../worktree-new"));
Packit Service 20376f
	cl_git_fail(git_worktree_add(&wt, fixture.repo, "worktree-new", path.ptr, NULL));
Packit Service 20376f
Packit Service 20376f
	git_buf_free(&path);
Packit Service 20376f
	git_commit_free(commit);
Packit Service 20376f
	git_reference_free(head);
Packit Service 20376f
	git_reference_free(branch);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__init_existing_worktree(void)
Packit Service 20376f
{
Packit Service 20376f
	git_worktree *wt;
Packit Service 20376f
	git_buf path = GIT_BUF_INIT;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_buf_joinpath(&path, fixture.repo->workdir, "../worktree-new"));
Packit Service 20376f
	cl_git_fail(git_worktree_add(&wt, fixture.repo, "testrepo-worktree", path.ptr, NULL));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
Packit Service 20376f
	cl_assert_equal_s(wt->gitlink_path, fixture.worktree->gitlink);
Packit Service 20376f
Packit Service 20376f
	git_buf_free(&path);
Packit Service 20376f
	git_worktree_free(wt);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__init_existing_path(void)
Packit Service 20376f
{
Packit Service 20376f
	const char *wtfiles[] = { "HEAD", "commondir", "gitdir", "index" };
Packit Service 20376f
	git_worktree *wt;
Packit Service 20376f
	git_buf path = GIT_BUF_INIT;
Packit Service 20376f
	unsigned i;
Packit Service 20376f
Packit Service 20376f
	/* Delete files to verify they have not been created by
Packit Service 20376f
	 * the init call */
Packit Service 20376f
	for (i = 0; i < ARRAY_SIZE(wtfiles); i++) {
Packit Service 20376f
		cl_git_pass(git_buf_joinpath(&path,
Packit Service 20376f
			    fixture.worktree->gitdir, wtfiles[i]));
Packit Service 20376f
		cl_git_pass(p_unlink(path.ptr));
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_buf_joinpath(&path, fixture.repo->workdir, "../testrepo-worktree"));
Packit Service 20376f
	cl_git_fail(git_worktree_add(&wt, fixture.repo, "worktree-new", path.ptr, NULL));
Packit Service 20376f
Packit Service 20376f
	/* Verify files have not been re-created */
Packit Service 20376f
	for (i = 0; i < ARRAY_SIZE(wtfiles); i++) {
Packit Service 20376f
		cl_git_pass(git_buf_joinpath(&path,
Packit Service 20376f
			    fixture.worktree->gitdir, wtfiles[i]));
Packit Service 20376f
		cl_assert(!git_path_exists(path.ptr));
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	git_buf_free(&path);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__init_submodule(void)
Packit Service 20376f
{
Packit Service 20376f
	git_repository *repo, *sm, *wt;
Packit Service 20376f
	git_worktree *worktree;
Packit Service 20376f
	git_buf path = GIT_BUF_INIT;
Packit Service 20376f
Packit Service 20376f
	cleanup_fixture_worktree(&fixture);
Packit Service 20376f
	repo = setup_fixture_submod2();
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_buf_joinpath(&path, repo->workdir, "sm_unchanged"));
Packit Service 20376f
	cl_git_pass(git_repository_open(&sm, path.ptr));
Packit Service 20376f
	cl_git_pass(git_buf_joinpath(&path, repo->workdir, "../worktree/"));
Packit Service 20376f
	cl_git_pass(git_worktree_add(&worktree, sm, "repo-worktree", path.ptr, NULL));
Packit Service 20376f
	cl_git_pass(git_repository_open_from_worktree(&wt, worktree));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_path_prettify_dir(&path, path.ptr, NULL));
Packit Service 20376f
	cl_assert_equal_s(path.ptr, wt->workdir);
Packit Service 20376f
	cl_git_pass(git_path_prettify_dir(&path, sm->commondir, NULL));
Packit Service 20376f
	cl_assert_equal_s(sm->commondir, wt->commondir);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_buf_joinpath(&path, sm->gitdir, "worktrees/repo-worktree/"));
Packit Service 20376f
	cl_assert_equal_s(path.ptr, wt->gitdir);
Packit Service 20376f
Packit Service 20376f
	git_buf_free(&path);
Packit Service 20376f
	git_worktree_free(worktree);
Packit Service 20376f
	git_repository_free(sm);
Packit Service 20376f
	git_repository_free(wt);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__validate(void)
Packit Service 20376f
{
Packit Service 20376f
	git_worktree *wt;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
Packit Service 20376f
	cl_git_pass(git_worktree_validate(wt));
Packit Service 20376f
Packit Service 20376f
	git_worktree_free(wt);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__validate_invalid_commondir(void)
Packit Service 20376f
{
Packit Service 20376f
	git_worktree *wt;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
Packit Service 20376f
	git__free(wt->commondir_path);
Packit Service 20376f
	wt->commondir_path = "/path/to/invalid/commondir";
Packit Service 20376f
Packit Service 20376f
	cl_git_fail(git_worktree_validate(wt));
Packit Service 20376f
Packit Service 20376f
	wt->commondir_path = NULL;
Packit Service 20376f
	git_worktree_free(wt);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__validate_invalid_gitdir(void)
Packit Service 20376f
{
Packit Service 20376f
	git_worktree *wt;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
Packit Service 20376f
	git__free(wt->gitdir_path);
Packit Service 20376f
	wt->gitdir_path = "/path/to/invalid/gitdir";
Packit Service 20376f
	cl_git_fail(git_worktree_validate(wt));
Packit Service 20376f
Packit Service 20376f
	wt->gitdir_path = NULL;
Packit Service 20376f
	git_worktree_free(wt);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__validate_invalid_parent(void)
Packit Service 20376f
{
Packit Service 20376f
	git_worktree *wt;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
Packit Service 20376f
	git__free(wt->parent_path);
Packit Service 20376f
	wt->parent_path = "/path/to/invalid/parent";
Packit Service 20376f
	cl_git_fail(git_worktree_validate(wt));
Packit Service 20376f
Packit Service 20376f
	wt->parent_path = NULL;
Packit Service 20376f
	git_worktree_free(wt);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__lock_with_reason(void)
Packit Service 20376f
{
Packit Service 20376f
	git_worktree *wt;
Packit Service 20376f
	git_buf reason = GIT_BUF_INIT;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
Packit Service 20376f
Packit Service 20376f
	cl_assert(!git_worktree_is_locked(NULL, wt));
Packit Service 20376f
	cl_git_pass(git_worktree_lock(wt, "because"));
Packit Service 20376f
	cl_assert(git_worktree_is_locked(&reason, wt) > 0);
Packit Service 20376f
	cl_assert_equal_s(reason.ptr, "because");
Packit Service 20376f
	cl_assert(wt->locked);
Packit Service 20376f
Packit Service 20376f
	git_buf_free(&reason);
Packit Service 20376f
	git_worktree_free(wt);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__lock_without_reason(void)
Packit Service 20376f
{
Packit Service 20376f
	git_worktree *wt;
Packit Service 20376f
	git_buf reason = GIT_BUF_INIT;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
Packit Service 20376f
Packit Service 20376f
	cl_assert(!git_worktree_is_locked(NULL, wt));
Packit Service 20376f
	cl_git_pass(git_worktree_lock(wt, NULL));
Packit Service 20376f
	cl_assert(git_worktree_is_locked(&reason, wt) > 0);
Packit Service 20376f
	cl_assert_equal_i(reason.size, 0);
Packit Service 20376f
	cl_assert(wt->locked);
Packit Service 20376f
Packit Service 20376f
	git_buf_free(&reason);
Packit Service 20376f
	git_worktree_free(wt);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__unlock_unlocked_worktree(void)
Packit Service 20376f
{
Packit Service 20376f
	git_worktree *wt;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
Packit Service 20376f
	cl_assert(!git_worktree_is_locked(NULL, wt));
Packit Service 20376f
	cl_assert(git_worktree_unlock(wt) == 0);
Packit Service 20376f
	cl_assert(!wt->locked);
Packit Service 20376f
Packit Service 20376f
	git_worktree_free(wt);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__unlock_locked_worktree(void)
Packit Service 20376f
{
Packit Service 20376f
	git_worktree *wt;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
Packit Service 20376f
	cl_git_pass(git_worktree_lock(wt, NULL));
Packit Service 20376f
	cl_assert(git_worktree_is_locked(NULL, wt));
Packit Service 20376f
	cl_git_pass(git_worktree_unlock(wt));
Packit Service 20376f
	cl_assert(!wt->locked);
Packit Service 20376f
Packit Service 20376f
	git_worktree_free(wt);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__prune_without_opts_fails(void)
Packit Service 20376f
{
Packit Service 20376f
	git_worktree *wt;
Packit Service 20376f
	git_repository *repo;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
Packit Service 20376f
	cl_git_fail(git_worktree_prune(wt, NULL));
Packit Service 20376f
Packit Service 20376f
	/* Assert the repository is still valid */
Packit Service 20376f
	cl_git_pass(git_repository_open_from_worktree(&repo, wt));
Packit Service 20376f
Packit Service 20376f
	git_worktree_free(wt);
Packit Service 20376f
	git_repository_free(repo);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__prune_valid(void)
Packit Service 20376f
{
Packit Service 20376f
	git_worktree_prune_options opts = GIT_WORKTREE_PRUNE_OPTIONS_INIT;
Packit Service 20376f
	git_worktree *wt;
Packit Service 20376f
	git_repository *repo;
Packit Service 20376f
Packit Service 20376f
	opts.flags = GIT_WORKTREE_PRUNE_VALID;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
Packit Service 20376f
	cl_git_pass(git_worktree_prune(wt, &opts));
Packit Service 20376f
Packit Service 20376f
	/* Assert the repository is not valid anymore */
Packit Service 20376f
	cl_git_fail(git_repository_open_from_worktree(&repo, wt));
Packit Service 20376f
Packit Service 20376f
	git_worktree_free(wt);
Packit Service 20376f
	git_repository_free(repo);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__prune_locked(void)
Packit Service 20376f
{
Packit Service 20376f
	git_worktree_prune_options opts = GIT_WORKTREE_PRUNE_OPTIONS_INIT;
Packit Service 20376f
	git_worktree *wt;
Packit Service 20376f
	git_repository *repo;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
Packit Service 20376f
	cl_git_pass(git_worktree_lock(wt, NULL));
Packit Service 20376f
Packit Service 20376f
	opts.flags = GIT_WORKTREE_PRUNE_VALID;
Packit Service 20376f
	cl_git_fail(git_worktree_prune(wt, &opts));
Packit Service 20376f
	/* Assert the repository is still valid */
Packit Service 20376f
	cl_git_pass(git_repository_open_from_worktree(&repo, wt));
Packit Service 20376f
Packit Service 20376f
	opts.flags = GIT_WORKTREE_PRUNE_VALID|GIT_WORKTREE_PRUNE_LOCKED;
Packit Service 20376f
	cl_git_pass(git_worktree_prune(wt, &opts));
Packit Service 20376f
Packit Service 20376f
	git_worktree_free(wt);
Packit Service 20376f
	git_repository_free(repo);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__prune_gitdir_only(void)
Packit Service 20376f
{
Packit Service 20376f
	git_worktree_prune_options opts = GIT_WORKTREE_PRUNE_OPTIONS_INIT;
Packit Service 20376f
	git_worktree *wt;
Packit Service 20376f
Packit Service 20376f
	opts.flags = GIT_WORKTREE_PRUNE_VALID;
Packit Service 20376f
	cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
Packit Service 20376f
	cl_git_pass(git_worktree_prune(wt, &opts));
Packit Service 20376f
Packit Service 20376f
	cl_assert(!git_path_exists(wt->gitdir_path));
Packit Service 20376f
	cl_assert(git_path_exists(wt->gitlink_path));
Packit Service 20376f
Packit Service 20376f
	git_worktree_free(wt);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__prune_worktree(void)
Packit Service 20376f
{
Packit Service 20376f
	git_worktree_prune_options opts = GIT_WORKTREE_PRUNE_OPTIONS_INIT;
Packit Service 20376f
	git_worktree *wt;
Packit Service 20376f
Packit Service 20376f
	opts.flags = GIT_WORKTREE_PRUNE_VALID|GIT_WORKTREE_PRUNE_WORKING_TREE;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
Packit Service 20376f
	cl_git_pass(git_worktree_prune(wt, &opts));
Packit Service 20376f
Packit Service 20376f
	cl_assert(!git_path_exists(wt->gitdir_path));
Packit Service 20376f
	cl_assert(!git_path_exists(wt->gitlink_path));
Packit Service 20376f
Packit Service 20376f
	git_worktree_free(wt);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
static int read_head_ref(git_repository *repo, const char *path, void *payload)
Packit Service 20376f
{
Packit Service 20376f
	git_vector *refs = (git_vector *) payload;
Packit Service 20376f
	git_reference *head;
Packit Service 20376f
Packit Service 20376f
	GIT_UNUSED(repo);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_reference__read_head(&head, repo, path));
Packit Service 20376f
Packit Service 20376f
	git_vector_insert(refs, head);
Packit Service 20376f
Packit Service 20376f
	return 0;
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_worktree_worktree__foreach_head_gives_same_results_in_wt_and_repo(void)
Packit Service 20376f
{
Packit Service 20376f
	git_vector repo_refs = GIT_VECTOR_INIT, worktree_refs = GIT_VECTOR_INIT;
Packit Service 20376f
	git_reference *heads[2];
Packit Service 20376f
	size_t i;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_reference_lookup(&heads[0], fixture.repo, GIT_HEAD_FILE));
Packit Service 20376f
	cl_git_pass(git_reference_lookup(&heads[1], fixture.worktree, GIT_HEAD_FILE));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_foreach_head(fixture.repo, read_head_ref, &repo_refs));
Packit Service 20376f
	cl_git_pass(git_repository_foreach_head(fixture.worktree, read_head_ref, &worktree_refs));
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(repo_refs.length, ARRAY_SIZE(heads));
Packit Service 20376f
	cl_assert_equal_i(worktree_refs.length, ARRAY_SIZE(heads));
Packit Service 20376f
Packit Service 20376f
	for (i = 0; i < ARRAY_SIZE(heads); i++) {
Packit Service 20376f
		cl_assert_equal_s(heads[i]->name, ((git_reference *) repo_refs.contents[i])->name);
Packit Service 20376f
		cl_assert_equal_s(heads[i]->name, ((git_reference *) repo_refs.contents[i])->name);
Packit Service 20376f
		cl_assert_equal_s(heads[i]->name, ((git_reference *) worktree_refs.contents[i])->name);
Packit Service 20376f
Packit Service 20376f
		git_reference_free(heads[i]);
Packit Service 20376f
		git_reference_free(repo_refs.contents[i]);
Packit Service 20376f
		git_reference_free(worktree_refs.contents[i]);
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	git_vector_free(&repo_refs);
Packit Service 20376f
	git_vector_free(&worktree_refs);
Packit Service 20376f
}