summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/git2/checkout.h2
-rw-r--r--src/checkout.c19
2 files changed, 16 insertions, 5 deletions
diff --git a/include/git2/checkout.h b/include/git2/checkout.h
index 4c6a4ebf7..efafdc3e4 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 20b964b54..d818a44bf 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)))