summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2017-04-04 18:44:43 +0200
committerPatrick Steinhardt <ps@pks.im>2017-04-05 13:50:38 +0200
commit38fc5ab0a235bdb2c35d0ddb3193840c088662a3 (patch)
tree4b805b4d30ca5df3d860e7b30b8a9051bae74837
parent74511aa2041b16b856932b53565c6a1127d0f8be (diff)
downloadlibgit2-38fc5ab0a235bdb2c35d0ddb3193840c088662a3.tar.gz
branch: use `foreach_head` to see if a branch is checked out
Previously, we have extracted the logic to find and iterate over all HEADs of a repository. Use this function in `git_branch_is_checked_out`.
-rw-r--r--src/branch.c65
1 files changed, 16 insertions, 49 deletions
diff --git a/src/branch.c b/src/branch.c
index 7d5e9cb7f..7a83b83af 100644
--- a/src/branch.c
+++ b/src/branch.c
@@ -127,62 +127,29 @@ int git_branch_create_from_annotated(
repository, branch_name, commit->commit, commit->description, force);
}
-int git_branch_is_checked_out(
- const git_reference *branch)
+static int branch_equals(git_repository *repo, const char *path, void *payload)
{
- git_buf path = GIT_BUF_INIT, buf = GIT_BUF_INIT;
- git_strarray worktrees;
- git_reference *ref = NULL;
- git_repository *repo;
- const char *worktree;
- int found = false;
- size_t i;
-
- assert(branch && git_reference_is_branch(branch));
-
- repo = git_reference_owner(branch);
-
- if (git_worktree_list(&worktrees, repo) < 0)
- return -1;
-
- for (i = 0; i < worktrees.count; i++) {
- worktree = worktrees.strings[i];
-
- if (git_repository_head_for_worktree(&ref, repo, worktree) < 0)
- continue;
-
- if (git__strcmp(ref->name, branch->name) == 0) {
- found = true;
- git_reference_free(ref);
- break;
- }
-
- git_reference_free(ref);
- }
- git_strarray_free(&worktrees);
-
- if (found)
- return found;
+ git_reference *branch = (git_reference *) payload;
+ git_reference *head;
+ int equal;
- /* Check HEAD of parent */
- if (git_buf_joinpath(&path, repo->commondir, GIT_HEAD_FILE) < 0)
- goto out;
- if (git_futils_readbuffer(&buf, path.ptr) < 0)
- goto out;
- if (git__prefixcmp(buf.ptr, "ref: ") == 0)
- git_buf_consume(&buf, buf.ptr + strlen("ref: "));
- git_buf_rtrim(&buf);
+ if (git_reference__read_head(&head, repo, path) < 0 ||
+ git_reference_type(head) != GIT_REF_SYMBOLIC)
+ return 0;
- found = git__strcmp(buf.ptr, branch->name) == 0;
+ equal = !git__strcmp(head->target.symbolic, branch->name);
+ git_reference_free(head);
+ return equal;
+}
-out:
- git_buf_free(&buf);
- git_buf_free(&path);
+int git_branch_is_checked_out(const git_reference *branch)
+{
+ assert(branch && git_reference_is_branch(branch));
- return found;
+ return git_repository_foreach_head(git_reference_owner(branch),
+ branch_equals, (void *) branch) == 1;
}
-
int git_branch_delete(git_reference *branch)
{
int is_head;