Commit 352214416c0e5fd85ef02077ddf185103f3a92df

Sascha Cunz 2013-11-02T03:43:34

Checkout: Don't assert if treeish is NULL In git_checkout_tree, the first check tests if either repo or treeish is NULL and says that eithor of them has to have a valid value. But there is no code to handle the treeish == NULL case. So, do something meaningful in that case: use HEAD instead.

diff --git a/include/git2/checkout.h b/include/git2/checkout.h
index 4c6a4eb..efafdc3 100644
--- a/include/git2/checkout.h
+++ b/include/git2/checkout.h
@@ -280,7 +280,7 @@ GIT_EXTERN(int) git_checkout_index(
  *
  * @param repo repository to check out (must be non-bare)
  * @param treeish a commit, tag or tree which content will be used to update
- * the working directory
+ * the working directory (or NULL to use HEAD)
  * @param opts specifies checkout options (may be NULL)
  * @return 0 on success, GIT_ERROR otherwise (use giterr_last for information
  * about the error)
diff --git a/src/checkout.c b/src/checkout.c
index 20b964b..d818a44 100644
--- a/src/checkout.c
+++ b/src/checkout.c
@@ -2073,10 +2073,21 @@ int git_checkout_tree(
 	if (!repo)
 		repo = git_object_owner(treeish);
 
-	if (git_object_peel((git_object **)&tree, treeish, GIT_OBJ_TREE) < 0) {
-		giterr_set(
-			GITERR_CHECKOUT, "Provided object cannot be peeled to a tree");
-		return -1;
+	if (treeish) {
+		if (git_object_peel((git_object **)&tree, treeish, GIT_OBJ_TREE) < 0) {
+			giterr_set(
+				GITERR_CHECKOUT, "Provided object cannot be peeled to a tree");
+			return -1;
+		}
+	}
+	else {
+		if ((error = checkout_lookup_head_tree(&tree, repo)) < 0) {
+			if (error != GIT_EUNBORNBRANCH)
+				giterr_set(
+					GITERR_CHECKOUT,
+					"HEAD could not be peeled to a tree and no treeish given");
+			return error;
+		}
 	}
 
 	if (!(error = git_iterator_for_tree(&tree_i, tree, 0, NULL, NULL)))