mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-05 20:11:17 +00:00

The current signature of `git_worktree_prune` accepts a flags field to alter its behavior. This is not as flexible as we'd like it to be when we want to enable passing additional options in the future. As the function has not been part of any release yet, we are still free to alter its current signature. This commit does so by using our usual pattern of an options structure, which is easily extendable without breaking the API.
174 lines
4.3 KiB
C
174 lines
4.3 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_worktree_prune_options opts = GIT_WORKTREE_PRUNE_OPTIONS_INIT;
|
|
git_reference *branch;
|
|
git_worktree *worktree;
|
|
|
|
opts.flags = GIT_WORKTREE_PRUNE_VALID;
|
|
|
|
cl_git_pass(git_worktree_lookup(&worktree, fixture.repo, fixture.worktreename));
|
|
cl_git_pass(git_worktree_prune(worktree, &opts));
|
|
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__renaming_reference_updates_worktree_heads(void)
|
|
{
|
|
git_reference *head, *branch, *renamed;
|
|
|
|
cl_git_pass(git_branch_lookup(&branch, fixture.repo,
|
|
"testrepo-worktree", GIT_BRANCH_LOCAL));
|
|
cl_git_pass(git_reference_rename(&renamed, branch, "refs/heads/renamed", 0, NULL));
|
|
cl_git_pass(git_repository_head(&head, fixture.worktree));
|
|
|
|
git_reference_free(head);
|
|
git_reference_free(branch);
|
|
git_reference_free(renamed);
|
|
}
|
|
|
|
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);
|
|
}
|