diff --git a/include/git2/worktree.h b/include/git2/worktree.h index ec869fb59..cad1284fa 100644 --- a/include/git2/worktree.h +++ b/include/git2/worktree.h @@ -125,6 +125,24 @@ typedef enum { GIT_WORKTREE_PRUNE_WORKING_TREE = 1u << 2, } git_worktree_prune_t; +/** + * Is the worktree prunable with the given set of flags? + * + * A worktree is not prunable in the following scenarios: + * + * - the worktree is linking to a valid on-disk worktree. The + * GIT_WORKTREE_PRUNE_VALID flag will cause this check to be + * ignored. + * - the worktree is not valid but locked. The + * GIT_WORKRTEE_PRUNE_LOCKED flag will cause this check to be + * ignored. + * + * If the worktree is not valid and not locked or if the above + * flags have been passed in, this function will return a + * positive value. + */ +GIT_EXTERN(int) git_worktree_is_prunable(git_worktree *wt, unsigned flags); + /** * Prune working tree * diff --git a/src/worktree.c b/src/worktree.c index a3fe07a23..5abc98945 100644 --- a/src/worktree.c +++ b/src/worktree.c @@ -357,11 +357,9 @@ out: return ret; } -int git_worktree_prune(git_worktree *wt, unsigned flags) +int git_worktree_is_prunable(git_worktree *wt, unsigned flags) { - git_buf reason = GIT_BUF_INIT, path = GIT_BUF_INIT; - char *wtpath; - int err; + git_buf reason = GIT_BUF_INIT; if ((flags & GIT_WORKTREE_PRUNE_LOCKED) == 0 && git_worktree_is_locked(&reason, wt)) @@ -369,15 +367,28 @@ int git_worktree_prune(git_worktree *wt, unsigned flags) if (!reason.size) git_buf_attach_notowned(&reason, "no reason given", 15); giterr_set(GITERR_WORKTREE, "Not pruning locked working tree: '%s'", reason.ptr); + git_buf_free(&reason); - err = -1; - goto out; + return 0; } if ((flags & GIT_WORKTREE_PRUNE_VALID) == 0 && git_worktree_validate(wt) == 0) { giterr_set(GITERR_WORKTREE, "Not pruning valid working tree"); + return 0; + } + + return 1; +} + +int git_worktree_prune(git_worktree *wt, unsigned flags) +{ + git_buf path = GIT_BUF_INIT; + char *wtpath; + int err; + + if (!git_worktree_is_prunable(wt, flags)) { err = -1; goto out; } @@ -415,7 +426,6 @@ int git_worktree_prune(git_worktree *wt, unsigned flags) goto out; out: - git_buf_free(&reason); git_buf_free(&path); return err;