From ee6763af0a3b97225803c6c908a29de40336cf38 Mon Sep 17 00:00:00 2001 From: Nguyễn Thái Ngọc Duy Date: Mon, 12 Feb 2018 16:49:40 +0700 Subject: worktree remove: allow it when $GIT_WORK_TREE is already gone MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "git worktree remove" basically consists of two things - delete $GIT_WORK_TREE - delete $GIT_DIR (which is $SUPER_GIT_DIR/worktrees/something) If $GIT_WORK_TREE is already gone for some reason, we should be able to finish the job by deleting $GIT_DIR. Two notes: - $GIT_WORK_TREE _can_ be missing if the worktree is locked. In that case we must not delete $GIT_DIR because the real $GIT_WORK_TREE may be in a usb stick somewhere. This is already handled because we check for lock first. - validate_worktree() is still called because it may do more checks in future (and it already does something else, like checking main worktree, but that's irrelevant in this case) Noticed-by: Kaartic Sivaraam Signed-off-by: Nguyễn Thái Ngọc Duy Signed-off-by: Junio C Hamano --- worktree.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'worktree.c') diff --git a/worktree.c b/worktree.c index 0373faf0d..28989cf06 100644 --- a/worktree.c +++ b/worktree.c @@ -267,7 +267,8 @@ static void strbuf_addf_gently(struct strbuf *buf, const char *fmt, ...) va_end(params); } -int validate_worktree(const struct worktree *wt, struct strbuf *errmsg) +int validate_worktree(const struct worktree *wt, struct strbuf *errmsg, + unsigned flags) { struct strbuf wt_path = STRBUF_INIT; char *path = NULL; @@ -303,6 +304,12 @@ int validate_worktree(const struct worktree *wt, struct strbuf *errmsg) goto done; } + if (flags & WT_VALIDATE_WORKTREE_MISSING_OK && + !file_exists(wt->path)) { + ret = 0; + goto done; + } + if (!file_exists(wt_path.buf)) { strbuf_addf_gently(errmsg, _("'%s' does not exist"), wt_path.buf); goto done; -- cgit v1.2.3