Commit d1f210fc by Patrick Steinhardt

repository: remove function to iterate over HEADs

The function `git_repository_foreach_head` is broken, as it directly
interacts with the on-disk representation of the reference database,
thus assuming that no other refdb is used for the given repository. As
this is an internal function only and all users have been replaced,
let's remove this function.
parent ac5fbe31
......@@ -2299,45 +2299,6 @@ out:
return error;
}
int git_repository_foreach_head(git_repository *repo,
git_repository_foreach_head_cb cb,
int flags, void *payload)
{
git_strarray worktrees = GIT_VECTOR_INIT;
git_buf path = GIT_BUF_INIT;
int error = 0;
size_t i;
if (!(flags & GIT_REPOSITORY_FOREACH_HEAD_SKIP_REPO)) {
/* Gather HEAD of main repository */
if ((error = git_buf_joinpath(&path, repo->commondir, GIT_HEAD_FILE)) < 0 ||
(error = cb(repo, path.ptr, payload) != 0))
goto out;
}
if (!(flags & GIT_REPOSITORY_FOREACH_HEAD_SKIP_WORKTREES)) {
if ((error = git_worktree_list(&worktrees, repo)) < 0) {
error = 0;
goto out;
}
/* Gather HEADs of all worktrees */
for (i = 0; i < worktrees.count; i++) {
if (get_worktree_file_path(&path, repo, worktrees.strings[i], GIT_HEAD_FILE) < 0)
continue;
if ((error = cb(repo, path.ptr, payload)) != 0)
goto out;
}
}
out:
git_buf_dispose(&path);
git_strarray_dispose(&worktrees);
return error;
}
int git_repository_head_unborn(git_repository *repo)
{
git_reference *ref = NULL;
......
......@@ -173,35 +173,6 @@ int git_repository_foreach_worktree(git_repository *repo,
void *payload);
/*
* Called for each HEAD.
*
* Can return either 0, causing the iteration over HEADs to
* continue, or a non-0 value causing the iteration to abort. The
* return value is passed back to the caller of
* `git_repository_foreach_head`
*/
typedef int (*git_repository_foreach_head_cb)(git_repository *repo, const char *path, void *payload);
enum {
/* Skip enumeration of the main repository HEAD */
GIT_REPOSITORY_FOREACH_HEAD_SKIP_REPO = (1u << 0),
/* Skip enumeration of worktree HEADs */
GIT_REPOSITORY_FOREACH_HEAD_SKIP_WORKTREES = (1u << 1),
};
/*
* Iterate over repository and all worktree HEADs.
*
* This function will be called for the repository HEAD and for
* all HEADS of linked worktrees. For each HEAD, the callback is
* executed with the given payload. The return value equals the
* return value of the last executed callback function.
*/
int git_repository_foreach_head(git_repository *repo,
git_repository_foreach_head_cb cb,
int flags, void *payload);
/*
* Weak pointers to repository internals.
*
* The returned pointers do not need to be freed. Do not keep
......
......@@ -581,49 +581,6 @@ void test_worktree_worktree__prune_worktree(void)
git_worktree_free(wt);
}
static int read_head_ref(git_repository *repo, const char *path, void *payload)
{
git_vector *refs = (git_vector *) payload;
git_reference *head;
GIT_UNUSED(repo);
cl_git_pass(git_reference__read_head(&head, repo, path));
git_vector_insert(refs, head);
return 0;
}
void test_worktree_worktree__foreach_head_gives_same_results_in_wt_and_repo(void)
{
git_vector repo_refs = GIT_VECTOR_INIT, worktree_refs = GIT_VECTOR_INIT;
git_reference *heads[2];
size_t i;
cl_git_pass(git_reference_lookup(&heads[0], fixture.repo, GIT_HEAD_FILE));
cl_git_pass(git_reference_lookup(&heads[1], fixture.worktree, GIT_HEAD_FILE));
cl_git_pass(git_repository_foreach_head(fixture.repo, read_head_ref, 0, &repo_refs));
cl_git_pass(git_repository_foreach_head(fixture.worktree, read_head_ref, 0, &worktree_refs));
cl_assert_equal_i(repo_refs.length, ARRAY_SIZE(heads));
cl_assert_equal_i(worktree_refs.length, ARRAY_SIZE(heads));
for (i = 0; i < ARRAY_SIZE(heads); i++) {
cl_assert_equal_s(heads[i]->name, ((git_reference *) repo_refs.contents[i])->name);
cl_assert_equal_s(heads[i]->name, ((git_reference *) repo_refs.contents[i])->name);
cl_assert_equal_s(heads[i]->name, ((git_reference *) worktree_refs.contents[i])->name);
git_reference_free(heads[i]);
git_reference_free(repo_refs.contents[i]);
git_reference_free(worktree_refs.contents[i]);
}
git_vector_free(&repo_refs);
git_vector_free(&worktree_refs);
}
static int foreach_worktree_cb(git_repository *worktree, void *payload)
{
int *counter = (int *)payload;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment