Skip to content

Commit 30f539f

Browse files
committed
Merge remote-tracking branch 'seanfarley/smf/pygit2-upgrade'
2 parents df30f92 + 78d134c commit 30f539f

File tree

4 files changed

+65
-0
lines changed

4 files changed

+65
-0
lines changed

docs/references.rst

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ References
44

55
.. contents::
66

7+
.. automethod:: pygit2.Repository.listall_reference_objects
78
.. automethod:: pygit2.Repository.listall_references
89
.. automethod:: pygit2.Repository.lookup_reference
910

src/repository.c

+51
Original file line numberDiff line numberDiff line change
@@ -1123,6 +1123,56 @@ Repository_listall_references(Repository *self, PyObject *args)
11231123
}
11241124

11251125

1126+
PyDoc_STRVAR(Repository_listall_reference_objects__doc__,
1127+
"listall_reference_objects() -> [Reference, ...]\n"
1128+
"\n"
1129+
"Return a list with all the reference objects in the repository.");
1130+
1131+
PyObject *
1132+
Repository_listall_reference_objects(Repository *self, PyObject *args)
1133+
{
1134+
git_reference_iterator *iter;
1135+
git_reference *ref = NULL;
1136+
int err;
1137+
PyObject *list;
1138+
1139+
list = PyList_New(0);
1140+
if (list == NULL)
1141+
return NULL;
1142+
1143+
if ((err = git_reference_iterator_new(&iter, self->repo)) < 0)
1144+
return Error_set(err);
1145+
1146+
while ((err = git_reference_next(&ref, iter)) == 0) {
1147+
PyObject *py_ref = wrap_reference(ref, self);
1148+
if (py_ref == NULL)
1149+
goto error;
1150+
1151+
err = PyList_Append(list, py_ref);
1152+
Py_DECREF(py_ref);
1153+
1154+
if (err < 0)
1155+
goto error;
1156+
}
1157+
1158+
git_reference_iterator_free(iter);
1159+
if (err == GIT_ITEROVER)
1160+
err = 0;
1161+
1162+
if (err < 0) {
1163+
Py_CLEAR(list);
1164+
return Error_set(err);
1165+
}
1166+
1167+
return list;
1168+
1169+
error:
1170+
git_reference_iterator_free(iter);
1171+
Py_CLEAR(list);
1172+
return NULL;
1173+
}
1174+
1175+
11261176
PyDoc_STRVAR(Repository_listall_branches__doc__,
11271177
"listall_branches([flag]) -> [str, ...]\n"
11281178
"\n"
@@ -1643,6 +1693,7 @@ PyMethodDef Repository_methods[] = {
16431693
METHOD(Repository, create_reference_direct, METH_VARARGS),
16441694
METHOD(Repository, create_reference_symbolic, METH_VARARGS),
16451695
METHOD(Repository, listall_references, METH_NOARGS),
1696+
METHOD(Repository, listall_reference_objects, METH_NOARGS),
16461697
METHOD(Repository, listall_submodules, METH_NOARGS),
16471698
METHOD(Repository, lookup_reference, METH_O),
16481699
METHOD(Repository, revparse_single, METH_O),

src/repository.h

+2
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ PyObject* Repository_create_commit(Repository *self, PyObject *args);
5858
PyObject* Repository_create_tag(Repository *self, PyObject *args);
5959
PyObject* Repository_create_branch(Repository *self, PyObject *args);
6060
PyObject* Repository_listall_references(Repository *self, PyObject *args);
61+
PyObject* Repository_listall_reference_objects(Repository *self,
62+
PyObject *args);
6163
PyObject* Repository_listall_branches(Repository *self, PyObject *args);
6264
PyObject* Repository_lookup_reference(Repository *self, PyObject *py_name);
6365

test/test_refs.py

+11
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,17 @@
4242

4343
class ReferencesTest(utils.RepoTestCase):
4444

45+
def test_list_all_reference_objects(self):
46+
repo = self.repo
47+
48+
refs = [(ref.name, ref.target.hex)
49+
for ref in repo.listall_reference_objects()]
50+
self.assertEqual(sorted(refs),
51+
[('refs/heads/i18n',
52+
'5470a671a80ac3789f1a6a8cefbcf43ce7af0563'),
53+
('refs/heads/master',
54+
'2be5719152d4f82c7302b1c0932d8e5f0a4a0e98')])
55+
4556
def test_list_all_references(self):
4657
repo = self.repo
4758

0 commit comments

Comments
 (0)