Implement Iterator protocol on Repository

Uses a stupid implementation that builds a list in memory and returns
it's iterator.
This commit is contained in:
richo 2013-01-04 13:42:18 +11:00
parent 5d5e019ab4
commit 3058181e14
2 changed files with 37 additions and 1 deletions

@ -161,6 +161,35 @@ Repository_contains(Repository *self, PyObject *value)
return exists;
}
static int
Repository_build_as_iter(git_oid *oid, PyObject *accum)
{
PyList_Append(accum, git_oid_to_py_str(oid));
return 0;
}
PyObject *
Repository_as_iter(Repository *self)
{
git_odb *odb;
int err;
PyObject *accum = PyList_New(0);
err = git_repository_odb(&odb, self->repo);
if (err < 0) {
Error_set(err);
return -1;
}
err = git_odb_foreach(odb, Repository_build_as_iter, accum);
if (err < 0) {
Error_set(err);
return -1;
}
git_odb_free(odb);
return PyObject_GetIter(accum);
}
PyObject *
Repository_head(Repository *self)
{
@ -984,7 +1013,7 @@ PyTypeObject RepositoryType = {
(inquiry)Repository_clear, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
(getiterfunc)Repository_as_iter, /* tp_iter */
0, /* tp_iternext */
Repository_methods, /* tp_methods */
0, /* tp_members */

@ -93,6 +93,13 @@ class RepositoryTest(utils.BareRepoTestCase):
self.assertFalse('a' * 40 in self.repo)
self.assertFalse('a' * 20 in self.repo)
def test_iterable(self):
l = []
for obj in self.repo:
l.append(obj)
self.assertTrue(A_HEX_SHA in l)
def test_lookup_blob(self):
self.assertRaises(TypeError, lambda: self.repo[123])
self.assertEqual(self.repo[A_BIN_SHA].hex, A_HEX_SHA)