worktree: extract git_worktree_is_prunable
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
diff --git a/include/git2/worktree.h b/include/git2/worktree.h
index ec869fb..cad1284 100644
--- a/include/git2/worktree.h
+++ b/include/git2/worktree.h
@@ -126,6 +126,24 @@ typedef enum {
} 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
*
* Prune the working tree, that is remove the git data
diff --git a/src/worktree.c b/src/worktree.c
index a3fe07a..5abc989 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;