diff --git a/TODO.txt b/TODO.txt index d4b8ab2..d9e656e 100644 --- a/TODO.txt +++ b/TODO.txt @@ -5,8 +5,7 @@ Signature References ========== -- Wrap missing functions: git_reference_foreach, git_reference_is_packed, - git_reference_reload +- Wrap missing functions: git_reference_foreach, git_reference_is_packed. - Write more twisted tests. Like accessing a reference deleted by someone else. diff --git a/pygit2.c b/pygit2.c index e3c3327..a4cd80d 100644 --- a/pygit2.c +++ b/pygit2.c @@ -2408,6 +2408,23 @@ Reference_rename(Reference *self, PyObject *py_name) Py_RETURN_NONE; /* Return None */ } +static PyObject * +Reference_reload(Reference *self) +{ + int err; + + CHECK_REFERENCE(self); + + err = git_reference_reload(self->reference); + if (err < 0) { + self->reference = NULL; + return Error_set(err); + } + + Py_RETURN_NONE; +} + + static PyObject * Reference_resolve(Reference *self, PyObject *args) { @@ -2563,6 +2580,8 @@ static PyMethodDef Reference_methods[] = { "Delete this reference. It will no longer be valid!"}, {"rename", (PyCFunction)Reference_rename, METH_O, "Rename the reference."}, + {"reload", (PyCFunction)Reference_reload, METH_NOARGS, + "Reload the reference from the file-system."}, {"resolve", (PyCFunction)Reference_resolve, METH_NOARGS, "Resolve a symbolic reference and return a direct reference."}, {NULL} diff --git a/test/test_refs.py b/test/test_refs.py index 46a6ac9..c96aa9b 100644 --- a/test/test_refs.py +++ b/test/test_refs.py @@ -135,6 +135,17 @@ class ReferencesTest(utils.RepoTestCase): self.assertEqual(reference.name, 'refs/tags/version2') + def test_reload(self): + name = 'refs/tags/version1' + + ref = self.repo.create_symbolic_reference(name, "refs/heads/master") + ref2 = self.repo.lookup_reference(name) + ref.delete() + self.assertEqual(ref2.name, name) + self.assertRaises(KeyError, ref2.reload) + self.assertRaises(GitError, getattr, ref2, 'name') + + def test_reference_resolve(self): reference = self.repo.lookup_reference('HEAD') self.assertEqual(reference.type, GIT_REF_SYMBOLIC)