worktree: expose interface to look up worktree by name

Our worktree interfaces do not provide a way to look up a worktree by
its name. Expose `get_linked_worktree()` to allow for this usecase. As
callers are responsible for freeing this worktree, introduce a new
function `free_worktree()` that does so.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Patrick Steinhardt 2024-01-08 11:05:43 +01:00 committed by Junio C Hamano
parent 84f0ea956f
commit b8a846b2e0
2 changed files with 28 additions and 11 deletions

View File

@ -12,18 +12,23 @@
#include "wt-status.h" #include "wt-status.h"
#include "config.h" #include "config.h"
void free_worktree(struct worktree *worktree)
{
if (!worktree)
return;
free(worktree->path);
free(worktree->id);
free(worktree->head_ref);
free(worktree->lock_reason);
free(worktree->prune_reason);
free(worktree);
}
void free_worktrees(struct worktree **worktrees) void free_worktrees(struct worktree **worktrees)
{ {
int i = 0; int i = 0;
for (i = 0; worktrees[i]; i++)
for (i = 0; worktrees[i]; i++) { free_worktree(worktrees[i]);
free(worktrees[i]->path);
free(worktrees[i]->id);
free(worktrees[i]->head_ref);
free(worktrees[i]->lock_reason);
free(worktrees[i]->prune_reason);
free(worktrees[i]);
}
free (worktrees); free (worktrees);
} }
@ -75,8 +80,8 @@ static struct worktree *get_main_worktree(int skip_reading_head)
return worktree; return worktree;
} }
static struct worktree *get_linked_worktree(const char *id, struct worktree *get_linked_worktree(const char *id,
int skip_reading_head) int skip_reading_head)
{ {
struct worktree *worktree = NULL; struct worktree *worktree = NULL;
struct strbuf path = STRBUF_INIT; struct strbuf path = STRBUF_INIT;

View File

@ -57,6 +57,13 @@ struct worktree *find_worktree(struct worktree **list,
const char *prefix, const char *prefix,
const char *arg); const char *arg);
/*
* Look up the worktree corresponding to `id`, or NULL of no such worktree
* exists.
*/
struct worktree *get_linked_worktree(const char *id,
int skip_reading_head);
/* /*
* Return the worktree corresponding to `path`, or NULL if no such worktree * Return the worktree corresponding to `path`, or NULL if no such worktree
* exists. * exists.
@ -134,6 +141,11 @@ void repair_worktrees(worktree_repair_fn, void *cb_data);
*/ */
void repair_worktree_at_path(const char *, worktree_repair_fn, void *cb_data); void repair_worktree_at_path(const char *, worktree_repair_fn, void *cb_data);
/*
* Free up the memory for a worktree.
*/
void free_worktree(struct worktree *);
/* /*
* Free up the memory for worktree(s) * Free up the memory for worktree(s)
*/ */