mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-06 13:25:18 +00:00

References for a repository are usually created inside of its gitdir. When using worktrees, though, these references are not to be created inside the worktree gitdir, but instead inside the gitdir of its parent repository, which is the commondir. Like this, branches will still be available after the worktree itself has been deleted. The filesystem refdb currently still creates new references inside of the gitdir. Fix this and have it create references in commondir.
157 lines
3.9 KiB
C
157 lines
3.9 KiB
C
#include "clar_libgit2.h"
|
|
#include "path.h"
|
|
#include "refs.h"
|
|
#include "worktree.h"
|
|
#include "worktree_helpers.h"
|
|
|
|
#define COMMON_REPO "testrepo"
|
|
#define WORKTREE_REPO "testrepo-worktree"
|
|
|
|
static worktree_fixture fixture =
|
|
WORKTREE_FIXTURE_INIT(COMMON_REPO, WORKTREE_REPO);
|
|
|
|
void test_worktree_refs__initialize(void)
|
|
{
|
|
setup_fixture_worktree(&fixture);
|
|
}
|
|
|
|
void test_worktree_refs__cleanup(void)
|
|
{
|
|
cleanup_fixture_worktree(&fixture);
|
|
}
|
|
|
|
void test_worktree_refs__list(void)
|
|
{
|
|
git_strarray refs, wtrefs;
|
|
unsigned i, j;
|
|
int error = 0;
|
|
|
|
cl_git_pass(git_reference_list(&refs, fixture.repo));
|
|
cl_git_pass(git_reference_list(&wtrefs, fixture.worktree));
|
|
|
|
if (refs.count != wtrefs.count)
|
|
{
|
|
error = GIT_ERROR;
|
|
goto exit;
|
|
}
|
|
|
|
for (i = 0; i < refs.count; i++)
|
|
{
|
|
int found = 0;
|
|
|
|
for (j = 0; j < wtrefs.count; j++)
|
|
{
|
|
if (!strcmp(refs.strings[i], wtrefs.strings[j]))
|
|
{
|
|
found = 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!found)
|
|
{
|
|
error = GIT_ERROR;
|
|
goto exit;
|
|
}
|
|
}
|
|
|
|
exit:
|
|
git_strarray_free(&refs);
|
|
git_strarray_free(&wtrefs);
|
|
cl_git_pass(error);
|
|
}
|
|
|
|
void test_worktree_refs__read_head(void)
|
|
{
|
|
git_reference *head;
|
|
|
|
cl_git_pass(git_repository_head(&head, fixture.worktree));
|
|
|
|
git_reference_free(head);
|
|
}
|
|
|
|
void test_worktree_refs__set_head_fails_when_worktree_wants_linked_repos_HEAD(void)
|
|
{
|
|
git_reference *head;
|
|
|
|
cl_git_pass(git_repository_head(&head, fixture.repo));
|
|
cl_git_fail(git_repository_set_head(fixture.worktree, git_reference_name(head)));
|
|
|
|
git_reference_free(head);
|
|
}
|
|
|
|
void test_worktree_refs__set_head_fails_when_main_repo_wants_worktree_head(void)
|
|
{
|
|
git_reference *head;
|
|
|
|
cl_git_pass(git_repository_head(&head, fixture.worktree));
|
|
cl_git_fail(git_repository_set_head(fixture.repo, git_reference_name(head)));
|
|
|
|
git_reference_free(head);
|
|
}
|
|
|
|
void test_worktree_refs__set_head_works_for_current_HEAD(void)
|
|
{
|
|
git_reference *head;
|
|
|
|
cl_git_pass(git_repository_head(&head, fixture.repo));
|
|
cl_git_pass(git_repository_set_head(fixture.repo, git_reference_name(head)));
|
|
|
|
git_reference_free(head);
|
|
}
|
|
|
|
void test_worktree_refs__set_head_fails_when_already_checked_out(void)
|
|
{
|
|
cl_git_fail(git_repository_set_head(fixture.repo, "refs/heads/testrepo-worktree"));
|
|
}
|
|
|
|
void test_worktree_refs__delete_fails_for_checked_out_branch(void)
|
|
{
|
|
git_reference *branch;
|
|
|
|
cl_git_pass(git_branch_lookup(&branch, fixture.repo,
|
|
"testrepo-worktree", GIT_BRANCH_LOCAL));
|
|
cl_git_fail(git_branch_delete(branch));
|
|
|
|
git_reference_free(branch);
|
|
}
|
|
|
|
void test_worktree_refs__delete_succeeds_after_pruning_worktree(void)
|
|
{
|
|
git_reference *branch;
|
|
git_worktree *worktree;
|
|
|
|
cl_git_pass(git_worktree_lookup(&worktree, fixture.repo, fixture.worktreename));
|
|
cl_git_pass(git_worktree_prune(worktree, GIT_WORKTREE_PRUNE_VALID));
|
|
git_worktree_free(worktree);
|
|
|
|
cl_git_pass(git_branch_lookup(&branch, fixture.repo,
|
|
"testrepo-worktree", GIT_BRANCH_LOCAL));
|
|
cl_git_pass(git_branch_delete(branch));
|
|
git_reference_free(branch);
|
|
}
|
|
|
|
void test_worktree_refs__creating_refs_uses_commondir(void)
|
|
{
|
|
git_reference *head, *branch, *lookup;
|
|
git_commit *commit;
|
|
git_buf refpath = GIT_BUF_INIT;
|
|
|
|
cl_git_pass(git_buf_joinpath(&refpath,
|
|
git_repository_commondir(fixture.worktree), "refs/heads/testbranch"));
|
|
cl_assert(!git_path_exists(refpath.ptr));
|
|
|
|
cl_git_pass(git_repository_head(&head, fixture.worktree));
|
|
cl_git_pass(git_commit_lookup(&commit, fixture.worktree, git_reference_target(head)));
|
|
cl_git_pass(git_branch_create(&branch, fixture.worktree, "testbranch", commit, 0));
|
|
cl_git_pass(git_branch_lookup(&lookup, fixture.worktree, "testbranch", GIT_BRANCH_LOCAL));
|
|
cl_assert(git_reference_cmp(branch, lookup) == 0);
|
|
cl_assert(git_path_exists(refpath.ptr));
|
|
|
|
git_reference_free(lookup);
|
|
git_reference_free(branch);
|
|
git_reference_free(head);
|
|
git_commit_free(commit);
|
|
git_buf_free(&refpath);
|
|
}
|