Commit 1ba242c9ab0eb323abed1b3bbc770aeb3367d855

Patrick Steinhardt 2017-02-03T13:52:23

worktree: extract git_worktree_is_prunable

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;