diff options
author | Anders Kaseorg <andersk@mit.edu> | 2021-12-01 14:15:43 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2021-12-01 22:18:25 -0800 |
commit | c8dd491fa5b57ecfd9ef33ae5291eb2a9402cd59 (patch) | |
tree | b686f1bb1a587d214f3a19efa6d56b7c65d07ae2 /builtin/branch.c | |
parent | branch: lowercase error messages (diff) | |
download | tgif-c8dd491fa5b57ecfd9ef33ae5291eb2a9402cd59.tar.xz |
worktree: simplify find_shared_symref() memory ownership model
Storing the worktrees list in a static variable meant that
find_shared_symref() had to rebuild the list on each call (which is
inefficient when the call site is in a loop), and also that each call
invalidated the pointer returned by the previous call (which is
confusing).
Instead, make it the caller’s responsibility to pass in the worktrees
list and manage its lifetime.
Signed-off-by: Anders Kaseorg <andersk@mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/branch.c')
-rw-r--r-- | builtin/branch.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/builtin/branch.c b/builtin/branch.c index 81b5c111cb..6c8b0fcc11 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -192,6 +192,7 @@ static void delete_branch_config(const char *branchname) static int delete_branches(int argc, const char **argv, int force, int kinds, int quiet) { + struct worktree **worktrees; struct commit *head_rev = NULL; struct object_id oid; char *name = NULL; @@ -228,6 +229,9 @@ static int delete_branches(int argc, const char **argv, int force, int kinds, if (!head_rev) die(_("Couldn't look up commit object for HEAD")); } + + worktrees = get_worktrees(); + for (i = 0; i < argc; i++, strbuf_reset(&bname)) { char *target = NULL; int flags = 0; @@ -238,7 +242,7 @@ static int delete_branches(int argc, const char **argv, int force, int kinds, if (kinds == FILTER_REFS_BRANCHES) { const struct worktree *wt = - find_shared_symref("HEAD", name); + find_shared_symref(worktrees, "HEAD", name); if (wt) { error(_("Cannot delete branch '%s' " "checked out at '%s'"), @@ -299,6 +303,7 @@ static int delete_branches(int argc, const char **argv, int force, int kinds, free(name); strbuf_release(&bname); + free_worktrees(worktrees); return ret; } |