summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2017-02-03 13:52:23 +0100
committerPatrick Steinhardt <ps@pks.im>2017-02-13 11:13:08 +0100
commit1ba242c9ab0eb323abed1b3bbc770aeb3367d855 (patch)
tree0ecaec9fe31f15bb81c9ffce27c5f80621b82745
parent3f3a4ce7bcd9862ef1eb87dfc5871e4012159244 (diff)
downloadlibgit2-1ba242c9ab0eb323abed1b3bbc770aeb3367d855.tar.gz
worktree: extract git_worktree_is_prunable
-rw-r--r--include/git2/worktree.h18
-rw-r--r--src/worktree.c24
2 files changed, 35 insertions, 7 deletions
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
@@ -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 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;