From e402d0e9eb8293a0837ddbf2ed62f7505618ac60 Mon Sep 17 00:00:00 2001
From: Nico von Geyso <Nico.Geyso@FU-Berlin.de>
Date: Mon, 28 May 2012 12:41:43 +0200
Subject: [PATCH] added head-getter for Repository

You do not have to lookup and resolve the HEAD reference anymore if you simply want
the last commit. Repository has now a head-getter which combines all these steps.

example:
  repo = Repository('.')
  head = repo.head
  print(head.message)
---
 include/pygit2/repository.h |  1 +
 src/pygit2/repository.c     | 27 +++++++++++++++++++++++++++
 test/test_refs.py           |  3 +++
 3 files changed, 31 insertions(+)

diff --git a/include/pygit2/repository.h b/include/pygit2/repository.h
index 35cf7c0..1a18353 100644
--- a/include/pygit2/repository.h
+++ b/include/pygit2/repository.h
@@ -13,6 +13,7 @@ int  Repository_contains(Repository *self, PyObject *value);
 
 git_odb_object* Repository_read_raw(git_repository *repo, const git_oid *oid, size_t len);
 
+PyObject* Repository_head(Repository *self);
 PyObject* Repository_getitem(Repository *self, PyObject *value);
 PyObject* Repository_read(Repository *self, PyObject *py_hex);
 PyObject* Repository_write(Repository *self, PyObject *args);
diff --git a/src/pygit2/repository.c b/src/pygit2/repository.c
index 00de0d9..7c288e0 100644
--- a/src/pygit2/repository.c
+++ b/src/pygit2/repository.c
@@ -7,6 +7,8 @@
 #include <pygit2/oid.h>
 #include <pygit2/repository.h>
 
+extern PyObject *GitError;
+
 extern PyTypeObject IndexType;
 extern PyTypeObject WalkerType;
 extern PyTypeObject SignatureType;
@@ -155,6 +157,29 @@ Repository_contains(Repository *self, PyObject *value)
     return exists;
 }
 
+PyObject *
+Repository_head(Repository *self)
+{
+    git_reference *head;
+    const git_oid *oid;
+    int err, len;
+    
+    err = git_repository_head(&head, self->repo);
+    if(err < 0) {
+      if(err == GIT_ENOTFOUND)
+        PyErr_SetString(GitError, "head reference does not exist");
+      else
+        Error_set(err);
+
+      return NULL;
+    }
+
+    oid = git_reference_oid(head);
+
+    return lookup_object(self, oid, GIT_OBJ_COMMIT);
+}
+
+
 PyObject *
 Repository_getitem(Repository *self, PyObject *value)
 {
@@ -740,6 +765,8 @@ PyGetSetDef Repository_getseters[] = {
     {"index", (getter)Repository_get_index, NULL, "index file. ", NULL},
     {"path", (getter)Repository_get_path, NULL,
      "The normalized path to the git repository.", NULL},
+    {"head", (getter)Repository_head, NULL,
+      "Current head reference of the repository.", NULL},
     {"workdir", (getter)Repository_get_workdir, NULL,
      "The normalized path to the working directory of the repository. "
      "If the repository is bare, None will be returned.", NULL},
diff --git a/test/test_refs.py b/test/test_refs.py
index c28609b..d3a7378 100644
--- a/test/test_refs.py
+++ b/test/test_refs.py
@@ -61,6 +61,9 @@ class ReferencesTest(utils.RepoTestCase):
         self.assertEqual(repo.listall_references(GIT_REF_SYMBOLIC),
                          ('refs/tags/version1', ))
 
+    def test_head(self):
+        head = self.repo.head
+        self.assertEqual(LAST_COMMIT, self.repo[head.oid].hex)
 
     def test_lookup_reference(self):
         repo = self.repo