diff --git a/src/diff.c b/src/diff.c index 1ff85b7..14db334 100644 --- a/src/diff.c +++ b/src/diff.c @@ -91,7 +91,7 @@ wrap_diff_delta(const git_diff_delta *delta) py_delta = PyObject_New(DiffDelta, &DiffDeltaType); if (py_delta) { - py_delta->status = git_diff_status_char(delta->status); + py_delta->status = delta->status; py_delta->flags = delta->flags; py_delta->similarity = delta->similarity; py_delta->nfiles = delta->nfiles; @@ -222,6 +222,25 @@ PyTypeObject DiffFileType = { 0, /* tp_new */ }; + +PyDoc_STRVAR(DiffDelta_status_char__doc__, + "status_char()\n" + "\n" + "Return the single character abbreviation for a delta status code." +); + +PyObject * +DiffDelta_status_char(DiffDelta *self) +{ + char status = git_diff_status_char(self->status); + +#if PY_MAJOR_VERSION == 2 + return Py_BuildValue("c", status); +#else + return Py_BuildValue("C", status); +#endif +} + PyDoc_STRVAR(DiffDelta_is_binary__doc__, "True if binary data, False if not."); PyObject * @@ -241,8 +260,13 @@ DiffDelta_dealloc(DiffDelta *self) PyObject_Del(self); } +static PyMethodDef DiffDelta_methods[] = { + METHOD(DiffDelta, status_char, METH_NOARGS), + {NULL} +}; + PyMemberDef DiffDelta_members[] = { - MEMBER(DiffDelta, status, T_CHAR, "A GIT_DELTA_* constant."), + MEMBER(DiffDelta, status, T_UINT, "A GIT_DELTA_* constant."), MEMBER(DiffDelta, flags, T_UINT, "Combination of GIT_DIFF_FLAG_* flags."), MEMBER(DiffDelta, similarity, T_USHORT, "For renamed and copied."), MEMBER(DiffDelta, nfiles, T_USHORT, "Number of files in the delta."), @@ -286,7 +310,7 @@ PyTypeObject DiffDeltaType = { 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ - 0, /* tp_methods */ + DiffDelta_methods, /* tp_methods */ DiffDelta_members, /* tp_members */ DiffDelta_getseters, /* tp_getset */ 0, /* tp_base */ diff --git a/src/pygit2.c b/src/pygit2.c index db3497d..2c76980 100644 --- a/src/pygit2.c +++ b/src/pygit2.c @@ -341,11 +341,23 @@ moduleinit(PyObject* m) /* --break-rewrites=/M */ ADD_CONSTANT_INT(m, GIT_DIFF_FIND_AND_BREAK_REWRITES) - /* DiffFile.flags */ + /* DiffDelta and DiffFile flags */ ADD_CONSTANT_INT(m, GIT_DIFF_FLAG_BINARY) ADD_CONSTANT_INT(m, GIT_DIFF_FLAG_NOT_BINARY) ADD_CONSTANT_INT(m, GIT_DIFF_FLAG_VALID_ID) + /* DiffDelta.status */ + ADD_CONSTANT_INT(m, GIT_DELTA_UNMODIFIED) + ADD_CONSTANT_INT(m, GIT_DELTA_ADDED) + ADD_CONSTANT_INT(m, GIT_DELTA_DELETED) + ADD_CONSTANT_INT(m, GIT_DELTA_MODIFIED) + ADD_CONSTANT_INT(m, GIT_DELTA_RENAMED) + ADD_CONSTANT_INT(m, GIT_DELTA_COPIED) + ADD_CONSTANT_INT(m, GIT_DELTA_IGNORED) + ADD_CONSTANT_INT(m, GIT_DELTA_UNTRACKED) + ADD_CONSTANT_INT(m, GIT_DELTA_TYPECHANGE) + ADD_CONSTANT_INT(m, GIT_DELTA_UNREADABLE) + /* Config */ ADD_CONSTANT_INT(m, GIT_CONFIG_LEVEL_LOCAL); ADD_CONSTANT_INT(m, GIT_CONFIG_LEVEL_GLOBAL); diff --git a/test/test_diff.py b/test/test_diff.py index f193abb..0862b9f 100644 --- a/test/test_diff.py +++ b/test/test_diff.py @@ -33,6 +33,7 @@ import unittest import pygit2 from pygit2 import GIT_DIFF_INCLUDE_UNMODIFIED from pygit2 import GIT_DIFF_IGNORE_WHITESPACE, GIT_DIFF_IGNORE_WHITESPACE_EOL +from pygit2 import GIT_DELTA_RENAMED from . import utils from itertools import chain @@ -282,9 +283,11 @@ class DiffTest(utils.BareRepoTestCase): #~ --find-copies-harder during rename transformion... diff = commit_a.tree.diff_to_tree(commit_b.tree, GIT_DIFF_INCLUDE_UNMODIFIED) - self.assertAll(lambda x: x.delta.status != 'R', diff) + self.assertAll(lambda x: x.delta.status != GIT_DELTA_RENAMED, diff) + self.assertAll(lambda x: x.delta.status_char() != 'R', diff) diff.find_similar() - self.assertAny(lambda x: x.delta.status == 'R', diff) + self.assertAny(lambda x: x.delta.status == GIT_DELTA_RENAMED, diff) + self.assertAny(lambda x: x.delta.status_char() == 'R', diff) if __name__ == '__main__': unittest.main()