worktree: teach worktree to lazy-load "prunable" reason
Add worktree_prune_reason() to allow a caller to discover whether a worktree is prunable and the reason that it is, much like worktree_lock_reason() indicates whether a worktree is locked and the reason for the lock. As with worktree_lock_reason(), retrieve the prunable reason lazily and cache it in the `worktree` structure. Helped-by: Eric Sunshine <sunshine@sunshineco.com> Signed-off-by: Rafael Silva <rafaeloliveira.cs@gmail.com> Reviewed-by: Eric Sunshine <sunshine@sunshineco.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
a29a8b7574
commit
fc0c7d5e9e
20
worktree.c
20
worktree.c
@ -15,6 +15,7 @@ void free_worktrees(struct worktree **worktrees)
|
|||||||
free(worktrees[i]->id);
|
free(worktrees[i]->id);
|
||||||
free(worktrees[i]->head_ref);
|
free(worktrees[i]->head_ref);
|
||||||
free(worktrees[i]->lock_reason);
|
free(worktrees[i]->lock_reason);
|
||||||
|
free(worktrees[i]->prune_reason);
|
||||||
free(worktrees[i]);
|
free(worktrees[i]);
|
||||||
}
|
}
|
||||||
free (worktrees);
|
free (worktrees);
|
||||||
@ -245,6 +246,25 @@ const char *worktree_lock_reason(struct worktree *wt)
|
|||||||
return wt->lock_reason;
|
return wt->lock_reason;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *worktree_prune_reason(struct worktree *wt, timestamp_t expire)
|
||||||
|
{
|
||||||
|
struct strbuf reason = STRBUF_INIT;
|
||||||
|
char *path = NULL;
|
||||||
|
|
||||||
|
if (is_main_worktree(wt))
|
||||||
|
return NULL;
|
||||||
|
if (wt->prune_reason_valid)
|
||||||
|
return wt->prune_reason;
|
||||||
|
|
||||||
|
if (should_prune_worktree(wt->id, &reason, &path, expire))
|
||||||
|
wt->prune_reason = strbuf_detach(&reason, NULL);
|
||||||
|
wt->prune_reason_valid = 1;
|
||||||
|
|
||||||
|
strbuf_release(&reason);
|
||||||
|
free(path);
|
||||||
|
return wt->prune_reason;
|
||||||
|
}
|
||||||
|
|
||||||
/* convenient wrapper to deal with NULL strbuf */
|
/* convenient wrapper to deal with NULL strbuf */
|
||||||
static void strbuf_addf_gently(struct strbuf *buf, const char *fmt, ...)
|
static void strbuf_addf_gently(struct strbuf *buf, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
|
@ -11,11 +11,13 @@ struct worktree {
|
|||||||
char *id;
|
char *id;
|
||||||
char *head_ref; /* NULL if HEAD is broken or detached */
|
char *head_ref; /* NULL if HEAD is broken or detached */
|
||||||
char *lock_reason; /* private - use worktree_lock_reason */
|
char *lock_reason; /* private - use worktree_lock_reason */
|
||||||
|
char *prune_reason; /* private - use worktree_prune_reason */
|
||||||
struct object_id head_oid;
|
struct object_id head_oid;
|
||||||
int is_detached;
|
int is_detached;
|
||||||
int is_bare;
|
int is_bare;
|
||||||
int is_current;
|
int is_current;
|
||||||
int lock_reason_valid; /* private */
|
int lock_reason_valid; /* private */
|
||||||
|
int prune_reason_valid; /* private */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -73,6 +75,13 @@ int is_main_worktree(const struct worktree *wt);
|
|||||||
*/
|
*/
|
||||||
const char *worktree_lock_reason(struct worktree *wt);
|
const char *worktree_lock_reason(struct worktree *wt);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return the reason string if the given worktree should be pruned, otherwise
|
||||||
|
* NULL if it should not be pruned. `expire` defines a grace period to prune
|
||||||
|
* the worktree when its path does not exist.
|
||||||
|
*/
|
||||||
|
const char *worktree_prune_reason(struct worktree *wt, timestamp_t expire);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return true if worktree entry should be pruned, along with the reason for
|
* Return true if worktree entry should be pruned, along with the reason for
|
||||||
* pruning. Otherwise, return false and the worktree's path in `wtpath`, or
|
* pruning. Otherwise, return false and the worktree's path in `wtpath`, or
|
||||||
|
Reference in New Issue
Block a user