Skip to content

Commit 711e9eb

Browse files
committed
Add static Diff.parse_diff
1 parent f1e9c3b commit 711e9eb

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

src/diff.c

+29-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ wrap_diff(git_diff *diff, Repository *repo)
5454

5555
py_diff = PyObject_New(Diff, &DiffType);
5656
if (py_diff) {
57-
Py_INCREF(repo);
57+
Py_XINCREF(repo);
5858
py_diff->repo = repo;
5959
py_diff->diff = diff;
6060
}
@@ -901,6 +901,32 @@ Diff_stats__get__(Diff *self)
901901
return wrap_diff_stats(self->diff);
902902
}
903903

904+
PyDoc_STRVAR(Diff_parse_diff__doc__,
905+
"parse_diff(git_diff: str) -> Diff\n"
906+
"\n"
907+
"Parses a git unified diff into a diff object without a repository");
908+
909+
static PyObject *
910+
Diff_parse_diff(PyObject *self, PyObject *args)
911+
{
912+
/* A wrapper around
913+
* git_diff_from_buffer
914+
*/
915+
git_diff *diff;
916+
const char *content = NULL;
917+
Py_ssize_t content_len;
918+
int err;
919+
920+
if (!PyArg_ParseTuple(args, "s#", &content, &content_len))
921+
return NULL;
922+
923+
err = git_diff_from_buffer(&diff, content, content_len);
924+
if (err < 0)
925+
return Error_set(err);
926+
927+
return wrap_diff(diff, NULL);
928+
}
929+
904930
static void
905931
Diff_dealloc(Diff *self)
906932
{
@@ -926,6 +952,8 @@ static PyMethodDef Diff_methods[] = {
926952
METHOD(Diff, merge, METH_VARARGS),
927953
METHOD(Diff, find_similar, METH_VARARGS | METH_KEYWORDS),
928954
METHOD(Diff, from_c, METH_STATIC | METH_VARARGS),
955+
{"parse_diff", (PyCFunction) Diff_parse_diff,
956+
METH_VARARGS | METH_STATIC, Diff_parse_diff__doc__},
929957
{NULL}
930958
};
931959

test/test_diff.py

+10
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,16 @@ def test_deltas(self):
343343
# As explained in the libgit2 documentation, flags are not set
344344
#self.assertEqual(delta.flags, patch_delta.flags)
345345

346+
def test_diff_parse(self):
347+
diff = pygit2.Diff.parse_diff(PATCH)
348+
349+
stats = diff.stats
350+
self.assertEqual(2, stats.deletions)
351+
self.assertEqual(1, stats.insertions)
352+
self.assertEqual(2, stats.files_changed)
353+
354+
deltas = list(diff.deltas)
355+
self.assertEqual(2, len(deltas))
346356

347357
class BinaryDiffTest(utils.BinaryFileRepoTestCase):
348358
def test_binary_diff(self):

0 commit comments

Comments
 (0)