From 73a4a3a649661ed63b4eec9f1cd4796788cb03d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=2E=20David=20Ib=C3=A1=C3=B1ez?= <jdavid.ibp@gmail.com> Date: Sat, 24 Dec 2011 17:04:24 +0100 Subject: [PATCH] refs: resolving a direct ref returns the same object When resolving a direct reference the same Python object is returned, with the refcount incremented by one. The reference is reloaded. --- TODO.txt | 2 ++ pygit2.c | 14 ++++++++++++-- test/test_refs.py | 6 ++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/TODO.txt b/TODO.txt index cc74b66..d4b8ab2 100644 --- a/TODO.txt +++ b/TODO.txt @@ -7,6 +7,8 @@ References ========== - Wrap missing functions: git_reference_foreach, git_reference_is_packed, git_reference_reload +- Write more twisted tests. Like accessing a reference deleted by someone + else. Other ========= diff --git a/pygit2.c b/pygit2.c index ae1fcb1..e3c3327 100644 --- a/pygit2.c +++ b/pygit2.c @@ -2416,12 +2416,22 @@ Reference_resolve(Reference *self, PyObject *args) CHECK_REFERENCE(self); - /* Resolve */ + /* Direct: reload */ + if (git_reference_type(self->reference) == GIT_REF_OID) { + err = git_reference_reload(self->reference); + if (err < 0) { + self->reference = NULL; + return Error_set(err); + } + Py_INCREF(self); + return (PyObject *)self; + } + + /* Symbolic: resolve */ err = git_reference_resolve(&c_reference, self->reference); if (err < 0) return Error_set(err); - /* Make an instance of Reference and return it */ return wrap_reference(c_reference); } diff --git a/test/test_refs.py b/test/test_refs.py index de4c054..46a6ac9 100644 --- a/test/test_refs.py +++ b/test/test_refs.py @@ -143,6 +143,12 @@ class ReferencesTest(utils.RepoTestCase): self.assertEqual(reference.hex, LAST_COMMIT) + def test_reference_resolve_identity(self): + head = self.repo.lookup_reference('HEAD') + ref = head.resolve() + self.assertTrue(ref.resolve() is ref) + + def test_create_reference(self): # We add a tag as a new reference that points to "origin/master" reference = self.repo.create_reference('refs/tags/version1',