Add the function is_worktree_locked(), which is a helper to tell if a worktree is locked without having to be able to modify it. Signed-off-by: Peter Jones <pjones@xxxxxxxxxx> --- builtin/worktree.c | 2 +- worktree.c | 16 ++++++++++++++++ worktree.h | 5 +++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/builtin/worktree.c b/builtin/worktree.c index 4de44f579af..86305cc1fe1 100644 --- a/builtin/worktree.c +++ b/builtin/worktree.c @@ -245,7 +245,7 @@ static void validate_worktree_add(const char *path, const struct add_opts *opts) if (!wt) goto done; - locked = !!worktree_lock_reason(wt); + locked = is_worktree_locked(wt); if ((!locked && opts->force) || (locked && opts->force > 1)) { if (delete_git_dir(wt->id)) die(_("unable to re-add worktree '%s'"), path); diff --git a/worktree.c b/worktree.c index 5b4793caa34..4924805c389 100644 --- a/worktree.c +++ b/worktree.c @@ -244,6 +244,22 @@ int is_main_worktree(const struct worktree *wt) return !wt->id; } +int is_worktree_locked(const struct worktree *wt) +{ + struct strbuf path = STRBUF_INIT; + int locked = 0; + + if (wt->lock_reason_valid && wt->lock_reason) + return 1; + + strbuf_addstr(&path, worktree_git_path(wt, "locked")); + if (file_exists(path.buf)) + locked = 1; + + strbuf_release(&path); + return locked; +} + const char *worktree_lock_reason(struct worktree *wt) { assert(!is_main_worktree(wt)); diff --git a/worktree.h b/worktree.h index caecc7a281c..5ff16c414b5 100644 --- a/worktree.h +++ b/worktree.h @@ -56,6 +56,11 @@ struct worktree *find_worktree(struct worktree **list, */ int is_main_worktree(const struct worktree *wt); +/* + * Return true if the given worktree is locked + */ +int is_worktree_locked(const struct worktree *wt); + /* * Return the reason string if the given worktree is locked or NULL * otherwise. -- 2.23.0