From fbab2953deb308ee9b0dbaa78353bfbbd7253c88 Mon Sep 17 00:00:00 2001
From: Nico von Geyso <Nico.Geyso@FU-Berlin.de>
Date: Sun, 17 Feb 2013 12:56:11 +0100
Subject: [PATCH] new Repository.checkout method

---
 src/repository.c | 40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/src/repository.c b/src/repository.c
index 4bfb71e..38451c8 100644
--- a/src/repository.c
+++ b/src/repository.c
@@ -45,6 +45,7 @@ extern PyTypeObject TreeBuilderType;
 extern PyTypeObject ConfigType;
 extern PyTypeObject DiffType;
 extern PyTypeObject RemoteType;
+extern PyTypeObject ReferenceType;
 
 git_otype
 int_to_loose_object_type(int type_id)
@@ -1066,6 +1067,44 @@ Repository_remotes__get__(Repository *self)
 }
 
 
+PyDoc_STRVAR(Repository_checkout__doc__,
+  "checkout(reference:Reference, [strategy:int])\n"
+  "\n"
+  "Checks out a tree by a given reference and modifies the HEAD pointer.\n"
+  "Standard checkout strategy is pygit2.GIT_CHECKOUT_SAFE_CREATE");
+
+PyObject *
+Repository_checkout(Repository *self, PyObject *args)
+{
+    git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT;
+    unsigned int strategy = GIT_CHECKOUT_SAFE_CREATE;
+    Reference* ref;
+    git_object* object;
+    const git_oid* id;
+    int err;
+
+    if (!PyArg_ParseTuple(args, "O!|I", &ReferenceType, &ref, &strategy))
+        return NULL;
+
+    CHECK_REFERENCE(ref);
+
+    id = git_reference_target(ref->reference);
+    err = git_object_lookup(&object, self->repo, id, GIT_OBJ_COMMIT);
+    if(err == GIT_OK) {
+        opts.checkout_strategy = strategy;
+        err = git_checkout_tree(self->repo, object, &opts);
+        if (err == GIT_OK)
+            err = git_repository_set_head(self->repo,
+                      git_reference_name(ref->reference));
+    }
+
+    if(err < 0)
+        return Error_set(err);
+
+    Py_RETURN_NONE;
+}
+
+
 PyMethodDef Repository_methods[] = {
     METHOD(Repository, create_blob, METH_VARARGS),
     METHOD(Repository, create_blob_fromfile, METH_VARARGS),
@@ -1083,6 +1122,7 @@ PyMethodDef Repository_methods[] = {
     METHOD(Repository, status, METH_NOARGS),
     METHOD(Repository, status_file, METH_O),
     METHOD(Repository, create_remote, METH_VARARGS),
+    METHOD(Repository, checkout, METH_VARARGS),
     {NULL}
 };