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>
This commit is contained in:

committed by
Junio C Hamano

parent
7435e7e2e7
commit
c8dd491fa5
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user