Skip to content

Commit 27f1848

Browse files
committed
Merge remote-tracking branch 'TimesysGit/reference-equality'
2 parents 6bee3fb + bb4ae9a commit 27f1848

File tree

2 files changed

+78
-1
lines changed

2 files changed

+78
-1
lines changed

src/reference.c

+66-1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ extern PyObject *GitError;
4242
extern PyTypeObject RefLogEntryType;
4343
extern PyTypeObject SignatureType;
4444

45+
PyTypeObject ReferenceType;
4546

4647
void RefLogIter_dealloc(RefLogIter *self)
4748
{
@@ -407,6 +408,70 @@ Reference_peel(Reference *self, PyObject *args)
407408
return wrap_object(obj, self->repo);
408409
}
409410

411+
PyObject *
412+
Reference_richcompare(PyObject *o1, PyObject *o2, int op)
413+
{
414+
PyObject *res;
415+
Reference *obj1;
416+
Reference *obj2;
417+
const char *name1;
418+
const char *name2;
419+
420+
if (!PyObject_TypeCheck(o2, &ReferenceType)) {
421+
Py_INCREF(Py_NotImplemented);
422+
return Py_NotImplemented;
423+
}
424+
425+
switch (op) {
426+
case Py_NE:
427+
obj1 = (Reference *) o1;
428+
obj2 = (Reference *) o2;
429+
430+
CHECK_REFERENCE(obj1);
431+
CHECK_REFERENCE(obj2);
432+
433+
name1 = git_reference_name(obj1->reference);
434+
name2 = git_reference_name(obj2->reference);
435+
436+
if (strcmp(name1, name2) != 0) {
437+
res = Py_True;
438+
break;
439+
}
440+
441+
res = Py_False;
442+
break;
443+
case Py_EQ:
444+
obj1 = (Reference *) o1;
445+
obj2 = (Reference *) o2;
446+
447+
CHECK_REFERENCE(obj1);
448+
CHECK_REFERENCE(obj2);
449+
450+
name1 = git_reference_name(obj1->reference);
451+
name2 = git_reference_name(obj2->reference);
452+
453+
if (strcmp(name1, name2) != 0) {
454+
res = Py_False;
455+
break;
456+
}
457+
458+
res = Py_True;
459+
break;
460+
case Py_LT:
461+
case Py_LE:
462+
case Py_GT:
463+
case Py_GE:
464+
Py_INCREF(Py_NotImplemented);
465+
return Py_NotImplemented;
466+
default:
467+
PyErr_Format(PyExc_RuntimeError, "Unexpected '%d' op", op);
468+
return NULL;
469+
}
470+
471+
Py_INCREF(res);
472+
return res;
473+
}
474+
410475
PyDoc_STRVAR(RefLogEntry_committer__doc__, "Committer.");
411476

412477
PyObject *
@@ -541,7 +606,7 @@ PyTypeObject ReferenceType = {
541606
Reference__doc__, /* tp_doc */
542607
0, /* tp_traverse */
543608
0, /* tp_clear */
544-
0, /* tp_richcompare */
609+
Reference_richcompare, /* tp_richcompare */
545610
0, /* tp_weaklistoffset */
546611
0, /* tp_iter */
547612
0, /* tp_iternext */

test/test_refs.py

+12
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,18 @@ def test_peel(self):
229229
commit = ref.peel(Commit)
230230
assert commit.tree.id == ref.peel(Tree).id
231231

232+
def test_equality(self):
233+
repo = self.repo
234+
ref1 = repo.references.get('refs/heads/master')
235+
ref2 = repo.references.get('refs/heads/master')
236+
ref3 = repo.references.get('refs/heads/i18n')
237+
238+
assert ref1 is not ref2
239+
assert ref1 == ref2
240+
assert not ref1 != ref2
241+
242+
assert ref1 != ref3
243+
assert not ref1 == ref3
232244

233245
class ReferencesTest(utils.RepoTestCase):
234246
def test_list_all_reference_objects(self):

0 commit comments

Comments
 (0)