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