summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--builtin/worktree.c12
-rwxr-xr-xt/t2028-worktree-move.sh17
-rw-r--r--worktree.c9
-rw-r--r--worktree.h5
4 files changed, 36 insertions, 7 deletions
diff --git a/builtin/worktree.c b/builtin/worktree.c
index 990e47b..f77ef99 100644
--- a/builtin/worktree.c
+++ b/builtin/worktree.c
@@ -674,7 +674,7 @@ static int move_worktree(int ac, const char **av, const char *prefix)
reason);
die(_("cannot move a locked working tree"));
}
- if (validate_worktree(wt, &errmsg))
+ if (validate_worktree(wt, &errmsg, 0))
die(_("validation failed, cannot move working tree: %s"),
errmsg.buf);
strbuf_release(&errmsg);
@@ -799,15 +799,17 @@ static int remove_worktree(int ac, const char **av, const char *prefix)
reason);
die(_("cannot remove a locked working tree"));
}
- if (validate_worktree(wt, &errmsg))
+ if (validate_worktree(wt, &errmsg, WT_VALIDATE_WORKTREE_MISSING_OK))
die(_("validation failed, cannot remove working tree: %s"),
errmsg.buf);
strbuf_release(&errmsg);
- if (!force)
- check_clean_worktree(wt, av[0]);
+ if (file_exists(wt->path)) {
+ if (!force)
+ check_clean_worktree(wt, av[0]);
- ret |= delete_git_work_tree(wt);
+ ret |= delete_git_work_tree(wt);
+ }
/*
* continue on even if ret is non-zero, there's no going back
* from here.
diff --git a/t/t2028-worktree-move.sh b/t/t2028-worktree-move.sh
index 4718c45..082368d 100755
--- a/t/t2028-worktree-move.sh
+++ b/t/t2028-worktree-move.sh
@@ -126,4 +126,21 @@ test_expect_success 'force remove worktree with untracked file' '
test_path_is_missing destination
'
+test_expect_success 'remove missing worktree' '
+ git worktree add to-be-gone &&
+ test -d .git/worktrees/to-be-gone &&
+ mv to-be-gone gone &&
+ git worktree remove to-be-gone &&
+ test_path_is_missing .git/worktrees/to-be-gone
+'
+
+test_expect_success 'NOT remove missing-but-locked worktree' '
+ git worktree add gone-but-locked &&
+ git worktree lock gone-but-locked &&
+ test -d .git/worktrees/gone-but-locked &&
+ mv gone-but-locked really-gone-now &&
+ test_must_fail git worktree remove gone-but-locked &&
+ test_path_is_dir .git/worktrees/gone-but-locked
+'
+
test_done
diff --git a/worktree.c b/worktree.c
index 0373faf..28989cf 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;
diff --git a/worktree.h b/worktree.h
index a913428..fe38ce1 100644
--- a/worktree.h
+++ b/worktree.h
@@ -61,12 +61,15 @@ extern int is_main_worktree(const struct worktree *wt);
*/
extern const char *is_worktree_locked(struct worktree *wt);
+#define WT_VALIDATE_WORKTREE_MISSING_OK (1 << 0)
+
/*
* Return zero if the worktree is in good condition. Error message is
* returned if "errmsg" is not NULL.
*/
extern int validate_worktree(const struct worktree *wt,
- struct strbuf *errmsg);
+ struct strbuf *errmsg,
+ unsigned flags);
/*
* Update worktrees/xxx/gitdir with the new path.