summaryrefslogtreecommitdiff
path: root/tests/worktree/worktree.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/worktree/worktree.c')
-rw-r--r--tests/worktree/worktree.c625
1 files changed, 0 insertions, 625 deletions
diff --git a/tests/worktree/worktree.c b/tests/worktree/worktree.c
deleted file mode 100644
index 9b87bfae6..000000000
--- a/tests/worktree/worktree.c
+++ /dev/null
@@ -1,625 +0,0 @@
-#include "clar_libgit2.h"
-#include "worktree_helpers.h"
-#include "submodule/submodule_helpers.h"
-
-#include "checkout.h"
-#include "repository.h"
-#include "worktree.h"
-
-#define COMMON_REPO "testrepo"
-#define WORKTREE_REPO "testrepo-worktree"
-
-static worktree_fixture fixture =
- WORKTREE_FIXTURE_INIT(COMMON_REPO, WORKTREE_REPO);
-
-void test_worktree_worktree__initialize(void)
-{
- setup_fixture_worktree(&fixture);
-}
-
-void test_worktree_worktree__cleanup(void)
-{
- cleanup_fixture_worktree(&fixture);
-}
-
-void test_worktree_worktree__list(void)
-{
- git_strarray wts;
-
- cl_git_pass(git_worktree_list(&wts, fixture.repo));
- cl_assert_equal_i(wts.count, 1);
- cl_assert_equal_s(wts.strings[0], "testrepo-worktree");
-
- git_strarray_dispose(&wts);
-}
-
-void test_worktree_worktree__list_with_invalid_worktree_dirs(void)
-{
- const char *filesets[3][2] = {
- { "gitdir", "commondir" },
- { "gitdir", "HEAD" },
- { "HEAD", "commondir" },
- };
- git_buf path = GIT_BUF_INIT;
- git_strarray wts;
- size_t i, j, len;
-
- cl_git_pass(git_buf_joinpath(&path,
- fixture.repo->commondir,
- "worktrees/invalid"));
- cl_git_pass(p_mkdir(path.ptr, 0755));
-
- len = path.size;
-
- for (i = 0; i < ARRAY_SIZE(filesets); i++) {
-
- for (j = 0; j < ARRAY_SIZE(filesets[i]); j++) {
- git_buf_truncate(&path, len);
- cl_git_pass(git_buf_joinpath(&path, path.ptr, filesets[i][j]));
- cl_git_pass(p_close(p_creat(path.ptr, 0644)));
- }
-
- cl_git_pass(git_worktree_list(&wts, fixture.worktree));
- cl_assert_equal_i(wts.count, 1);
- cl_assert_equal_s(wts.strings[0], "testrepo-worktree");
- git_strarray_dispose(&wts);
-
- for (j = 0; j < ARRAY_SIZE(filesets[i]); j++) {
- git_buf_truncate(&path, len);
- cl_git_pass(git_buf_joinpath(&path, path.ptr, filesets[i][j]));
- p_unlink(path.ptr);
- }
- }
-
- git_buf_dispose(&path);
-}
-
-void test_worktree_worktree__list_in_worktree_repo(void)
-{
- git_strarray wts;
-
- cl_git_pass(git_worktree_list(&wts, fixture.worktree));
- cl_assert_equal_i(wts.count, 1);
- cl_assert_equal_s(wts.strings[0], "testrepo-worktree");
-
- git_strarray_dispose(&wts);
-}
-
-void test_worktree_worktree__list_without_worktrees(void)
-{
- git_repository *repo;
- git_strarray wts;
-
- repo = cl_git_sandbox_init("testrepo2");
- cl_git_pass(git_worktree_list(&wts, repo));
- cl_assert_equal_i(wts.count, 0);
-
- git_repository_free(repo);
-}
-
-void test_worktree_worktree__lookup(void)
-{
- git_worktree *wt;
- git_buf gitdir_path = GIT_BUF_INIT;
-
- cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
-
- cl_git_pass(git_buf_joinpath(&gitdir_path, fixture.repo->commondir, "worktrees/testrepo-worktree/"));
-
- cl_assert_equal_s(wt->gitdir_path, gitdir_path.ptr);
- cl_assert_equal_s(wt->parent_path, fixture.repo->workdir);
- cl_assert_equal_s(wt->gitlink_path, fixture.worktree->gitlink);
- cl_assert_equal_s(wt->commondir_path, fixture.repo->gitdir);
- cl_assert_equal_s(wt->commondir_path, fixture.repo->commondir);
-
- git_buf_dispose(&gitdir_path);
- git_worktree_free(wt);
-}
-
-void test_worktree_worktree__lookup_nonexistent_worktree(void)
-{
- git_worktree *wt;
-
- cl_git_fail(git_worktree_lookup(&wt, fixture.repo, "nonexistent"));
- cl_assert_equal_p(wt, NULL);
-}
-
-void test_worktree_worktree__open(void)
-{
- git_worktree *wt;
- git_repository *repo;
-
- cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
-
- cl_git_pass(git_repository_open_from_worktree(&repo, wt));
- cl_assert_equal_s(git_repository_workdir(repo),
- git_repository_workdir(fixture.worktree));
-
- git_repository_free(repo);
- git_worktree_free(wt);
-}
-
-void test_worktree_worktree__open_invalid_commondir(void)
-{
- git_worktree *wt;
- git_repository *repo;
- git_buf buf = GIT_BUF_INIT, path = GIT_BUF_INIT;
-
- cl_git_pass(git_buf_sets(&buf, "/path/to/nonexistent/commondir"));
- cl_git_pass(git_buf_joinpath(&path,
- fixture.repo->commondir,
- "worktrees/testrepo-worktree/commondir"));
- cl_git_pass(git_futils_writebuffer(&buf, path.ptr, O_RDWR, 0644));
-
- cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
- cl_git_fail(git_repository_open_from_worktree(&repo, wt));
-
- git_buf_dispose(&buf);
- git_buf_dispose(&path);
- git_worktree_free(wt);
-}
-
-void test_worktree_worktree__open_invalid_gitdir(void)
-{
- git_worktree *wt;
- git_repository *repo;
- git_buf buf = GIT_BUF_INIT, path = GIT_BUF_INIT;
-
- cl_git_pass(git_buf_sets(&buf, "/path/to/nonexistent/gitdir"));
- cl_git_pass(git_buf_joinpath(&path,
- fixture.repo->commondir,
- "worktrees/testrepo-worktree/gitdir"));
- cl_git_pass(git_futils_writebuffer(&buf, path.ptr, O_RDWR, 0644));
-
- cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
- cl_git_fail(git_repository_open_from_worktree(&repo, wt));
-
- git_buf_dispose(&buf);
- git_buf_dispose(&path);
- git_worktree_free(wt);
-}
-
-void test_worktree_worktree__open_invalid_parent(void)
-{
- git_worktree *wt;
- git_repository *repo;
- git_buf buf = GIT_BUF_INIT;
-
- cl_git_pass(git_buf_sets(&buf, "/path/to/nonexistent/gitdir"));
- cl_git_pass(git_futils_writebuffer(&buf,
- fixture.worktree->gitlink, O_RDWR, 0644));
-
- cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
- cl_git_fail(git_repository_open_from_worktree(&repo, wt));
-
- git_buf_dispose(&buf);
- git_worktree_free(wt);
-}
-
-void test_worktree_worktree__init(void)
-{
- git_worktree *wt;
- git_repository *repo;
- git_reference *branch;
- git_buf path = GIT_BUF_INIT;
-
- cl_git_pass(git_buf_joinpath(&path, fixture.repo->workdir, "../worktree-new"));
- cl_git_pass(git_worktree_add(&wt, fixture.repo, "worktree-new", path.ptr, NULL));
-
- /* Open and verify created repo */
- cl_git_pass(git_repository_open(&repo, path.ptr));
- cl_assert(git__suffixcmp(git_repository_workdir(repo), "worktree-new/") == 0);
- cl_git_pass(git_branch_lookup(&branch, repo, "worktree-new", GIT_BRANCH_LOCAL));
-
- git_buf_dispose(&path);
- git_worktree_free(wt);
- git_reference_free(branch);
- git_repository_free(repo);
-}
-
-void test_worktree_worktree__add_locked(void)
-{
- git_worktree *wt;
- git_repository *repo;
- git_reference *branch;
- git_buf path = GIT_BUF_INIT;
- git_worktree_add_options opts = GIT_WORKTREE_ADD_OPTIONS_INIT;
-
- opts.lock = 1;
-
- cl_git_pass(git_buf_joinpath(&path, fixture.repo->workdir, "../worktree-locked"));
- cl_git_pass(git_worktree_add(&wt, fixture.repo, "worktree-locked", path.ptr, &opts));
-
- /* Open and verify created repo */
- cl_assert(git_worktree_is_locked(NULL, wt));
- cl_git_pass(git_repository_open(&repo, path.ptr));
- cl_assert(git__suffixcmp(git_repository_workdir(repo), "worktree-locked/") == 0);
- cl_git_pass(git_branch_lookup(&branch, repo, "worktree-locked", GIT_BRANCH_LOCAL));
-
- git_buf_dispose(&path);
- git_worktree_free(wt);
- git_reference_free(branch);
- git_repository_free(repo);
-}
-
-void test_worktree_worktree__init_existing_branch(void)
-{
- git_reference *head, *branch;
- git_commit *commit;
- git_worktree *wt;
- git_buf path = GIT_BUF_INIT;
-
- cl_git_pass(git_repository_head(&head, fixture.repo));
- cl_git_pass(git_commit_lookup(&commit, fixture.repo, &head->target.oid));
- cl_git_pass(git_branch_create(&branch, fixture.repo, "worktree-new", commit, false));
-
- cl_git_pass(git_buf_joinpath(&path, fixture.repo->workdir, "../worktree-new"));
- cl_git_fail(git_worktree_add(&wt, fixture.repo, "worktree-new", path.ptr, NULL));
-
- git_buf_dispose(&path);
- git_commit_free(commit);
- git_reference_free(head);
- git_reference_free(branch);
-}
-
-void test_worktree_worktree__add_with_explicit_branch(void)
-{
- git_reference *head, *branch, *wthead;
- git_commit *commit;
- git_worktree *wt;
- git_repository *wtrepo;
- git_buf path = GIT_BUF_INIT;
- git_worktree_add_options opts = GIT_WORKTREE_ADD_OPTIONS_INIT;
-
- cl_git_pass(git_repository_head(&head, fixture.repo));
- cl_git_pass(git_commit_lookup(&commit, fixture.repo, &head->target.oid));
- cl_git_pass(git_branch_create(&branch, fixture.repo, "worktree-with-ref", commit, false));
-
- opts.ref = branch;
-
- cl_git_pass(git_buf_joinpath(&path, fixture.repo->workdir, "../worktree-with-different-name"));
- cl_git_pass(git_worktree_add(&wt, fixture.repo, "worktree-with-different-name", path.ptr, &opts));
- cl_git_pass(git_repository_open_from_worktree(&wtrepo, wt));
- cl_git_pass(git_repository_head(&wthead, wtrepo));
- cl_assert_equal_s(git_reference_name(wthead), "refs/heads/worktree-with-ref");
-
- git_buf_dispose(&path);
- git_commit_free(commit);
- git_reference_free(head);
- git_reference_free(branch);
- git_reference_free(wthead);
- git_repository_free(wtrepo);
- git_worktree_free(wt);
-}
-
-
-void test_worktree_worktree__init_existing_worktree(void)
-{
- git_worktree *wt;
- git_buf path = GIT_BUF_INIT;
-
- cl_git_pass(git_buf_joinpath(&path, fixture.repo->workdir, "../worktree-new"));
- cl_git_fail(git_worktree_add(&wt, fixture.repo, "testrepo-worktree", path.ptr, NULL));
-
- cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
- cl_assert_equal_s(wt->gitlink_path, fixture.worktree->gitlink);
-
- git_buf_dispose(&path);
- git_worktree_free(wt);
-}
-
-void test_worktree_worktree__init_existing_path(void)
-{
- const char *wtfiles[] = { "HEAD", "commondir", "gitdir", "index" };
- git_worktree *wt;
- git_buf path = GIT_BUF_INIT;
- unsigned i;
-
- /* Delete files to verify they have not been created by
- * the init call */
- for (i = 0; i < ARRAY_SIZE(wtfiles); i++) {
- cl_git_pass(git_buf_joinpath(&path,
- fixture.worktree->gitdir, wtfiles[i]));
- cl_git_pass(p_unlink(path.ptr));
- }
-
- cl_git_pass(git_buf_joinpath(&path, fixture.repo->workdir, "../testrepo-worktree"));
- cl_git_fail(git_worktree_add(&wt, fixture.repo, "worktree-new", path.ptr, NULL));
-
- /* Verify files have not been re-created */
- for (i = 0; i < ARRAY_SIZE(wtfiles); i++) {
- cl_git_pass(git_buf_joinpath(&path,
- fixture.worktree->gitdir, wtfiles[i]));
- cl_assert(!git_path_exists(path.ptr));
- }
-
- git_buf_dispose(&path);
-}
-
-void test_worktree_worktree__init_submodule(void)
-{
- git_repository *repo, *sm, *wt;
- git_worktree *worktree;
- git_buf path = GIT_BUF_INIT;
-
- cleanup_fixture_worktree(&fixture);
- repo = setup_fixture_submod2();
-
- cl_git_pass(git_buf_joinpath(&path, repo->workdir, "sm_unchanged"));
- cl_git_pass(git_repository_open(&sm, path.ptr));
- cl_git_pass(git_buf_joinpath(&path, repo->workdir, "../worktree/"));
- cl_git_pass(git_worktree_add(&worktree, sm, "repo-worktree", path.ptr, NULL));
- cl_git_pass(git_repository_open_from_worktree(&wt, worktree));
-
- cl_git_pass(git_path_prettify_dir(&path, path.ptr, NULL));
- cl_assert_equal_s(path.ptr, wt->workdir);
- cl_git_pass(git_path_prettify_dir(&path, sm->commondir, NULL));
- cl_assert_equal_s(sm->commondir, wt->commondir);
-
- cl_git_pass(git_buf_joinpath(&path, sm->gitdir, "worktrees/repo-worktree/"));
- cl_assert_equal_s(path.ptr, wt->gitdir);
-
- git_buf_dispose(&path);
- git_worktree_free(worktree);
- git_repository_free(sm);
- git_repository_free(wt);
-}
-
-void test_worktree_worktree__validate(void)
-{
- git_worktree *wt;
-
- cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
- cl_git_pass(git_worktree_validate(wt));
-
- git_worktree_free(wt);
-}
-
-void test_worktree_worktree__name(void)
-{
- git_worktree *wt;
-
- cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
- cl_assert_equal_s(git_worktree_name(wt), "testrepo-worktree");
-
- git_worktree_free(wt);
-}
-
-void test_worktree_worktree__path(void)
-{
- git_worktree *wt;
- git_buf expected_path = GIT_BUF_INIT;
-
- cl_git_pass(git_buf_joinpath(&expected_path, clar_sandbox_path(), "testrepo-worktree"));
- cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
- cl_assert_equal_s(git_worktree_path(wt), expected_path.ptr);
-
- git_buf_dispose(&expected_path);
- git_worktree_free(wt);
-}
-
-void test_worktree_worktree__validate_invalid_commondir(void)
-{
- git_worktree *wt;
-
- cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
- git__free(wt->commondir_path);
- wt->commondir_path = "/path/to/invalid/commondir";
-
- cl_git_fail(git_worktree_validate(wt));
-
- wt->commondir_path = NULL;
- git_worktree_free(wt);
-}
-
-void test_worktree_worktree__validate_invalid_gitdir(void)
-{
- git_worktree *wt;
-
- cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
- git__free(wt->gitdir_path);
- wt->gitdir_path = "/path/to/invalid/gitdir";
- cl_git_fail(git_worktree_validate(wt));
-
- wt->gitdir_path = NULL;
- git_worktree_free(wt);
-}
-
-void test_worktree_worktree__validate_invalid_parent(void)
-{
- git_worktree *wt;
-
- cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
- git__free(wt->parent_path);
- wt->parent_path = "/path/to/invalid/parent";
- cl_git_fail(git_worktree_validate(wt));
-
- wt->parent_path = NULL;
- git_worktree_free(wt);
-}
-
-void test_worktree_worktree__lock_with_reason(void)
-{
- git_worktree *wt;
- git_buf reason = GIT_BUF_INIT;
-
- cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
-
- cl_assert(!git_worktree_is_locked(NULL, wt));
- cl_git_pass(git_worktree_lock(wt, "because"));
- cl_assert(git_worktree_is_locked(&reason, wt) > 0);
- cl_assert_equal_s(reason.ptr, "because");
- cl_assert(wt->locked);
-
- git_buf_dispose(&reason);
- git_worktree_free(wt);
-}
-
-void test_worktree_worktree__lock_without_reason(void)
-{
- git_worktree *wt;
- git_buf reason = GIT_BUF_INIT;
-
- cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
-
- cl_assert(!git_worktree_is_locked(NULL, wt));
- cl_git_pass(git_worktree_lock(wt, NULL));
- cl_assert(git_worktree_is_locked(&reason, wt) > 0);
- cl_assert_equal_i(reason.size, 0);
- cl_assert(wt->locked);
-
- git_buf_dispose(&reason);
- git_worktree_free(wt);
-}
-
-void test_worktree_worktree__unlock_unlocked_worktree(void)
-{
- git_worktree *wt;
-
- cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
- cl_assert(!git_worktree_is_locked(NULL, wt));
- cl_assert_equal_i(1, git_worktree_unlock(wt));
- cl_assert(!wt->locked);
-
- git_worktree_free(wt);
-}
-
-void test_worktree_worktree__unlock_locked_worktree(void)
-{
- git_worktree *wt;
-
- cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
- cl_git_pass(git_worktree_lock(wt, NULL));
- cl_assert(git_worktree_is_locked(NULL, wt));
- cl_assert_equal_i(0, git_worktree_unlock(wt));
- cl_assert(!wt->locked);
-
- git_worktree_free(wt);
-}
-
-void test_worktree_worktree__prune_without_opts_fails(void)
-{
- git_worktree *wt;
- git_repository *repo;
-
- cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
- cl_git_fail(git_worktree_prune(wt, NULL));
-
- /* Assert the repository is still valid */
- cl_git_pass(git_repository_open_from_worktree(&repo, wt));
-
- git_worktree_free(wt);
- git_repository_free(repo);
-}
-
-void test_worktree_worktree__prune_valid(void)
-{
- git_worktree_prune_options opts = GIT_WORKTREE_PRUNE_OPTIONS_INIT;
- git_worktree *wt;
- git_repository *repo;
-
- opts.flags = GIT_WORKTREE_PRUNE_VALID;
-
- cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
- cl_git_pass(git_worktree_prune(wt, &opts));
-
- /* Assert the repository is not valid anymore */
- cl_git_fail(git_repository_open_from_worktree(&repo, wt));
-
- git_worktree_free(wt);
- git_repository_free(repo);
-}
-
-void test_worktree_worktree__prune_locked(void)
-{
- git_worktree_prune_options opts = GIT_WORKTREE_PRUNE_OPTIONS_INIT;
- git_worktree *wt;
- git_repository *repo;
-
- cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
- cl_git_pass(git_worktree_lock(wt, NULL));
-
- opts.flags = GIT_WORKTREE_PRUNE_VALID;
- cl_git_fail(git_worktree_prune(wt, &opts));
- /* Assert the repository is still valid */
- cl_git_pass(git_repository_open_from_worktree(&repo, wt));
-
- opts.flags = GIT_WORKTREE_PRUNE_VALID|GIT_WORKTREE_PRUNE_LOCKED;
- cl_git_pass(git_worktree_prune(wt, &opts));
-
- git_worktree_free(wt);
- git_repository_free(repo);
-}
-
-void test_worktree_worktree__prune_gitdir_only(void)
-{
- git_worktree_prune_options opts = GIT_WORKTREE_PRUNE_OPTIONS_INIT;
- git_worktree *wt;
-
- opts.flags = GIT_WORKTREE_PRUNE_VALID;
- cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
- cl_git_pass(git_worktree_prune(wt, &opts));
-
- cl_assert(!git_path_exists(wt->gitdir_path));
- cl_assert(git_path_exists(wt->gitlink_path));
-
- git_worktree_free(wt);
-}
-
-void test_worktree_worktree__prune_worktree(void)
-{
- git_worktree_prune_options opts = GIT_WORKTREE_PRUNE_OPTIONS_INIT;
- git_worktree *wt;
-
- opts.flags = GIT_WORKTREE_PRUNE_VALID|GIT_WORKTREE_PRUNE_WORKING_TREE;
-
- cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
- cl_git_pass(git_worktree_prune(wt, &opts));
-
- cl_assert(!git_path_exists(wt->gitdir_path));
- cl_assert(!git_path_exists(wt->gitlink_path));
-
- git_worktree_free(wt);
-}
-
-static int foreach_worktree_cb(git_repository *worktree, void *payload)
-{
- int *counter = (int *)payload;
-
- switch (*counter) {
- case 0:
- cl_assert_equal_s(git_repository_path(fixture.repo),
- git_repository_path(worktree));
- cl_assert(!git_repository_is_worktree(worktree));
- break;
- case 1:
- cl_assert_equal_s(git_repository_path(fixture.worktree),
- git_repository_path(worktree));
- cl_assert(git_repository_is_worktree(worktree));
- break;
- default:
- cl_fail("more worktrees found than expected");
- }
-
- (*counter)++;
-
- return 0;
-}
-
-void test_worktree_worktree__foreach_worktree_lists_all_worktrees(void)
-{
- int counter = 0;
- cl_git_pass(git_repository_foreach_worktree(fixture.repo, foreach_worktree_cb, &counter));
-}
-
-void test_worktree_worktree__validate_invalid_worktreedir(void)
-{
- git_worktree *wt;
-
- cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
- p_rename("testrepo-worktree", "testrepo-worktree-tmp");
- cl_git_fail(git_worktree_validate(wt));
- p_rename("testrepo-worktree-tmp", "testrepo-worktree");
-
- git_worktree_free(wt);
-}