Commit 44acdd1f9a7bb97b5a5fe724065fd86c63696aed

Vicent Martí 2013-11-04T08:09:58

Merge pull request #1937 from scunz/checkout_assert Don't assert in git_checkout_tree

diff --git a/include/git2/checkout.h b/include/git2/checkout.h
index 3793a4f..efafdc3 100644
--- a/include/git2/checkout.h
+++ b/include/git2/checkout.h
@@ -272,7 +272,7 @@ GIT_EXTERN(int) git_checkout_head(
 GIT_EXTERN(int) git_checkout_index(
 	git_repository *repo,
 	git_index *index,
-	git_checkout_opts *opts);
+	const git_checkout_opts *opts);
 
 /**
  * Updates files in the index and working tree to match the content of the
@@ -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)
@@ -288,7 +288,7 @@ GIT_EXTERN(int) git_checkout_index(
 GIT_EXTERN(int) git_checkout_tree(
 	git_repository *repo,
 	const git_object *treeish,
-	git_checkout_opts *opts);
+	const git_checkout_opts *opts);
 
 /** @} */
 GIT_END_DECL
diff --git a/src/checkout.c b/src/checkout.c
index dce9afd..a4f3266 100644
--- a/src/checkout.c
+++ b/src/checkout.c
@@ -2018,7 +2018,7 @@ cleanup:
 int git_checkout_index(
 	git_repository *repo,
 	git_index *index,
-	git_checkout_opts *opts)
+	const git_checkout_opts *opts)
 {
 	int error;
 	git_iterator *index_i;
@@ -2053,7 +2053,7 @@ int git_checkout_index(
 int git_checkout_tree(
 	git_repository *repo,
 	const git_object *treeish,
-	git_checkout_opts *opts)
+	const git_checkout_opts *opts)
 {
 	int error;
 	git_tree *tree = NULL;
@@ -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)))
@@ -2092,18 +2103,6 @@ int git_checkout_head(
 	git_repository *repo,
 	const git_checkout_opts *opts)
 {
-	int error;
-	git_tree *head = NULL;
-	git_iterator *head_i = NULL;
-
 	assert(repo);
-
-	if (!(error = checkout_lookup_head_tree(&head, repo)) &&
-		!(error = git_iterator_for_tree(&head_i, head, 0, NULL, NULL)))
-		error = git_checkout_iterator(head_i, opts);
-
-	git_iterator_free(head_i);
-	git_tree_free(head);
-
-	return error;
+	return git_checkout_tree(repo, NULL, opts);
 }