Mercurial > hg
annotate mercurial/cext/diffhelpers.c @ 37454:0a9751ece252
tests: add another full hex node in plain text
Should have been part of D3168.
Differential Revision: https://phab.mercurial-scm.org/D3186
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Sat, 07 Apr 2018 00:00:33 -0700 |
parents | 7f8338b87c88 |
children |
rev | line source |
---|---|
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
1 /* |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
2 * diffhelpers.c - helper routines for mpatch |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
3 * |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
4 * Copyright 2007 Chris Mason <chris.mason@oracle.com> |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
5 * |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
6 * This software may be used and distributed according to the terms |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
7 * of the GNU General Public License v2, incorporated herein by reference. |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
8 */ |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
9 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
10 #include <Python.h> |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
11 #include <stdlib.h> |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
12 #include <string.h> |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
13 |
11363
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
14 #include "util.h" |
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
15 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
16 static char diffhelpers_doc[] = "Efficient diff parsing"; |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
17 static PyObject *diffhelpers_Error; |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
18 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
19 /* fixup the last lines of a and b when the patch has no newline at eof */ |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
20 static void _fix_newline(PyObject *hunk, PyObject *a, PyObject *b) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
21 { |
16693
f1aa3010642f
diffhelpers: use Py_ssize_t in _fix_newline()
Adrian Buehlmann <adrian@cadifra.com>
parents:
16651
diff
changeset
|
22 Py_ssize_t hunksz = PyList_Size(hunk); |
36057
7f8338b87c88
diffhelpers: allow clang-format oversight
Augie Fackler <augie@google.com>
parents:
32370
diff
changeset
|
23 PyObject *s = PyList_GET_ITEM(hunk, hunksz - 1); |
11363
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
24 char *l = PyBytes_AsString(s); |
16693
f1aa3010642f
diffhelpers: use Py_ssize_t in _fix_newline()
Adrian Buehlmann <adrian@cadifra.com>
parents:
16651
diff
changeset
|
25 Py_ssize_t alen = PyList_Size(a); |
f1aa3010642f
diffhelpers: use Py_ssize_t in _fix_newline()
Adrian Buehlmann <adrian@cadifra.com>
parents:
16651
diff
changeset
|
26 Py_ssize_t blen = PyList_Size(b); |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
27 char c = l[0]; |
10146
9c59cdafcc24
diffhelpers: fix variable declaration for MSVC (not C99)
Patrick Mezard <pmezard@gmail.com>
parents:
10129
diff
changeset
|
28 PyObject *hline; |
16693
f1aa3010642f
diffhelpers: use Py_ssize_t in _fix_newline()
Adrian Buehlmann <adrian@cadifra.com>
parents:
16651
diff
changeset
|
29 Py_ssize_t sz = PyBytes_GET_SIZE(s); |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
30 |
36057
7f8338b87c88
diffhelpers: allow clang-format oversight
Augie Fackler <augie@google.com>
parents:
32370
diff
changeset
|
31 if (sz > 1 && l[sz - 2] == '\r') |
10146
9c59cdafcc24
diffhelpers: fix variable declaration for MSVC (not C99)
Patrick Mezard <pmezard@gmail.com>
parents:
10129
diff
changeset
|
32 /* tolerate CRLF in last line */ |
9c59cdafcc24
diffhelpers: fix variable declaration for MSVC (not C99)
Patrick Mezard <pmezard@gmail.com>
parents:
10129
diff
changeset
|
33 sz -= 1; |
11363
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
34 |
36057
7f8338b87c88
diffhelpers: allow clang-format oversight
Augie Fackler <augie@google.com>
parents:
32370
diff
changeset
|
35 hline = PyBytes_FromStringAndSize(l, sz - 1); |
23959
c8e7fa41bfc5
diffhelpers: verify hline was created before using it
Augie Fackler <augie@google.com>
parents:
16695
diff
changeset
|
36 if (!hline) { |
23964
f1c127df7c4f
diffhelpers: fix botched return statement from c8e7fa41bfc5
Augie Fackler <raf@durin42.com>
parents:
23959
diff
changeset
|
37 return; |
23959
c8e7fa41bfc5
diffhelpers: verify hline was created before using it
Augie Fackler <augie@google.com>
parents:
16695
diff
changeset
|
38 } |
10146
9c59cdafcc24
diffhelpers: fix variable declaration for MSVC (not C99)
Patrick Mezard <pmezard@gmail.com>
parents:
10129
diff
changeset
|
39 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
40 if (c == ' ' || c == '+') { |
11363
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
41 PyObject *rline = PyBytes_FromStringAndSize(l + 1, sz - 2); |
36057
7f8338b87c88
diffhelpers: allow clang-format oversight
Augie Fackler <augie@google.com>
parents:
32370
diff
changeset
|
42 PyList_SetItem(b, blen - 1, rline); |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
43 } |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
44 if (c == ' ' || c == '-') { |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
45 Py_INCREF(hline); |
36057
7f8338b87c88
diffhelpers: allow clang-format oversight
Augie Fackler <augie@google.com>
parents:
32370
diff
changeset
|
46 PyList_SetItem(a, alen - 1, hline); |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
47 } |
36057
7f8338b87c88
diffhelpers: allow clang-format oversight
Augie Fackler <augie@google.com>
parents:
32370
diff
changeset
|
48 PyList_SetItem(hunk, hunksz - 1, hline); |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
49 } |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
50 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
51 /* python callable form of _fix_newline */ |
36057
7f8338b87c88
diffhelpers: allow clang-format oversight
Augie Fackler <augie@google.com>
parents:
32370
diff
changeset
|
52 static PyObject *fix_newline(PyObject *self, PyObject *args) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
53 { |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
54 PyObject *hunk, *a, *b; |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
55 if (!PyArg_ParseTuple(args, "OOO", &hunk, &a, &b)) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
56 return NULL; |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
57 _fix_newline(hunk, a, b); |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
58 return Py_BuildValue("l", 0); |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
59 } |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
60 |
16694
797b76205408
diffhelpers: use Py_ssize_t in addlines()
Adrian Buehlmann <adrian@cadifra.com>
parents:
16693
diff
changeset
|
61 #if (PY_VERSION_HEX < 0x02050000) |
797b76205408
diffhelpers: use Py_ssize_t in addlines()
Adrian Buehlmann <adrian@cadifra.com>
parents:
16693
diff
changeset
|
62 static const char *addlines_format = "OOiiOO"; |
797b76205408
diffhelpers: use Py_ssize_t in addlines()
Adrian Buehlmann <adrian@cadifra.com>
parents:
16693
diff
changeset
|
63 #else |
797b76205408
diffhelpers: use Py_ssize_t in addlines()
Adrian Buehlmann <adrian@cadifra.com>
parents:
16693
diff
changeset
|
64 static const char *addlines_format = "OOnnOO"; |
797b76205408
diffhelpers: use Py_ssize_t in addlines()
Adrian Buehlmann <adrian@cadifra.com>
parents:
16693
diff
changeset
|
65 #endif |
797b76205408
diffhelpers: use Py_ssize_t in addlines()
Adrian Buehlmann <adrian@cadifra.com>
parents:
16693
diff
changeset
|
66 |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
67 /* |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
68 * read lines from fp into the hunk. The hunk is parsed into two arrays |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
69 * a and b. a gets the old state of the text, b gets the new state |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
70 * The control char from the hunk is saved when inserting into a, but not b |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
71 * (for performance while deleting files) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
72 */ |
36057
7f8338b87c88
diffhelpers: allow clang-format oversight
Augie Fackler <augie@google.com>
parents:
32370
diff
changeset
|
73 static PyObject *addlines(PyObject *self, PyObject *args) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
74 { |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
75 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
76 PyObject *fp, *hunk, *a, *b, *x; |
16694
797b76205408
diffhelpers: use Py_ssize_t in addlines()
Adrian Buehlmann <adrian@cadifra.com>
parents:
16693
diff
changeset
|
77 Py_ssize_t i; |
797b76205408
diffhelpers: use Py_ssize_t in addlines()
Adrian Buehlmann <adrian@cadifra.com>
parents:
16693
diff
changeset
|
78 Py_ssize_t lena, lenb; |
797b76205408
diffhelpers: use Py_ssize_t in addlines()
Adrian Buehlmann <adrian@cadifra.com>
parents:
16693
diff
changeset
|
79 Py_ssize_t num; |
797b76205408
diffhelpers: use Py_ssize_t in addlines()
Adrian Buehlmann <adrian@cadifra.com>
parents:
16693
diff
changeset
|
80 Py_ssize_t todoa, todob; |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
81 char *s, c; |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
82 PyObject *l; |
36057
7f8338b87c88
diffhelpers: allow clang-format oversight
Augie Fackler <augie@google.com>
parents:
32370
diff
changeset
|
83 if (!PyArg_ParseTuple(args, addlines_format, &fp, &hunk, &lena, &lenb, |
7f8338b87c88
diffhelpers: allow clang-format oversight
Augie Fackler <augie@google.com>
parents:
32370
diff
changeset
|
84 &a, &b)) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
85 return NULL; |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
86 |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10146
diff
changeset
|
87 while (1) { |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
88 todoa = lena - PyList_Size(a); |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
89 todob = lenb - PyList_Size(b); |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
90 num = todoa > todob ? todoa : todob; |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
91 if (num == 0) |
36057
7f8338b87c88
diffhelpers: allow clang-format oversight
Augie Fackler <augie@google.com>
parents:
32370
diff
changeset
|
92 break; |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10146
diff
changeset
|
93 for (i = 0; i < num; i++) { |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
94 x = PyFile_GetLine(fp, 0); |
11363
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
95 s = PyBytes_AsString(x); |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
96 c = *s; |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
97 if (strcmp(s, "\\ No newline at end of file\n") == 0) { |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
98 _fix_newline(hunk, a, b); |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
99 continue; |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
100 } |
5483
ec2cc1dadbf7
Handle patches with misformatted empty lines
Hollis Blanchard <hollisb@us.ibm.com>
parents:
4897
diff
changeset
|
101 if (c == '\n') { |
ec2cc1dadbf7
Handle patches with misformatted empty lines
Hollis Blanchard <hollisb@us.ibm.com>
parents:
4897
diff
changeset
|
102 /* Some patches may be missing the control char |
ec2cc1dadbf7
Handle patches with misformatted empty lines
Hollis Blanchard <hollisb@us.ibm.com>
parents:
4897
diff
changeset
|
103 * on empty lines. Supply a leading space. */ |
ec2cc1dadbf7
Handle patches with misformatted empty lines
Hollis Blanchard <hollisb@us.ibm.com>
parents:
4897
diff
changeset
|
104 Py_DECREF(x); |
11363
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
105 x = PyBytes_FromString(" \n"); |
5483
ec2cc1dadbf7
Handle patches with misformatted empty lines
Hollis Blanchard <hollisb@us.ibm.com>
parents:
4897
diff
changeset
|
106 } |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
107 PyList_Append(hunk, x); |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
108 if (c == '+') { |
11363
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
109 l = PyBytes_FromString(s + 1); |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
110 PyList_Append(b, l); |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
111 Py_DECREF(l); |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
112 } else if (c == '-') { |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
113 PyList_Append(a, x); |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
114 } else { |
11363
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
115 l = PyBytes_FromString(s + 1); |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
116 PyList_Append(b, l); |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
117 Py_DECREF(l); |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
118 PyList_Append(a, x); |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
119 } |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
120 Py_DECREF(x); |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
121 } |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
122 } |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
123 return Py_BuildValue("l", 0); |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
124 } |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
125 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
126 /* |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
127 * compare the lines in a with the lines in b. a is assumed to have |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
128 * a control char at the start of each line, this char is ignored in the |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
129 * compare |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
130 */ |
36057
7f8338b87c88
diffhelpers: allow clang-format oversight
Augie Fackler <augie@google.com>
parents:
32370
diff
changeset
|
131 static PyObject *testhunk(PyObject *self, PyObject *args) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
132 { |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
133 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
134 PyObject *a, *b; |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
135 long bstart; |
16695
0a0933d3d59c
diffhelpers: use Py_ssize_t in testhunk()
Adrian Buehlmann <adrian@cadifra.com>
parents:
16694
diff
changeset
|
136 Py_ssize_t alen, blen; |
0a0933d3d59c
diffhelpers: use Py_ssize_t in testhunk()
Adrian Buehlmann <adrian@cadifra.com>
parents:
16694
diff
changeset
|
137 Py_ssize_t i; |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
138 char *sa, *sb; |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
139 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
140 if (!PyArg_ParseTuple(args, "OOl", &a, &b, &bstart)) |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
141 return NULL; |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
142 alen = PyList_Size(a); |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
143 blen = PyList_Size(b); |
16651
9e40bc4c1bde
diffhelpers: harden testhunk
Matt Mackall <mpm@selenic.com>
parents:
13302
diff
changeset
|
144 if (alen > blen - bstart || bstart < 0) { |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
145 return Py_BuildValue("l", -1); |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
146 } |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10146
diff
changeset
|
147 for (i = 0; i < alen; i++) { |
11363
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
148 sa = PyBytes_AsString(PyList_GET_ITEM(a, i)); |
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
149 sb = PyBytes_AsString(PyList_GET_ITEM(b, i + bstart)); |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10146
diff
changeset
|
150 if (strcmp(sa + 1, sb) != 0) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
151 return Py_BuildValue("l", -1); |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
152 } |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
153 return Py_BuildValue("l", 0); |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
154 } |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
155 |
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
156 static PyMethodDef methods[] = { |
36057
7f8338b87c88
diffhelpers: allow clang-format oversight
Augie Fackler <augie@google.com>
parents:
32370
diff
changeset
|
157 {"addlines", addlines, METH_VARARGS, "add lines to a hunk\n"}, |
7f8338b87c88
diffhelpers: allow clang-format oversight
Augie Fackler <augie@google.com>
parents:
32370
diff
changeset
|
158 {"fix_newline", fix_newline, METH_VARARGS, "fixup newline counters\n"}, |
7f8338b87c88
diffhelpers: allow clang-format oversight
Augie Fackler <augie@google.com>
parents:
32370
diff
changeset
|
159 {"testhunk", testhunk, METH_VARARGS, "test lines in a hunk\n"}, |
7f8338b87c88
diffhelpers: allow clang-format oversight
Augie Fackler <augie@google.com>
parents:
32370
diff
changeset
|
160 {NULL, NULL}}; |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
161 |
32357
2f51f4c535d2
diffhelpers: add version to help detect breaking binary changes
Jun Wu <quark@fb.com>
parents:
23964
diff
changeset
|
162 static const int version = 1; |
2f51f4c535d2
diffhelpers: add version to help detect breaking binary changes
Jun Wu <quark@fb.com>
parents:
23964
diff
changeset
|
163 |
11363
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
164 #ifdef IS_PY3K |
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
165 static struct PyModuleDef diffhelpers_module = { |
36057
7f8338b87c88
diffhelpers: allow clang-format oversight
Augie Fackler <augie@google.com>
parents:
32370
diff
changeset
|
166 PyModuleDef_HEAD_INIT, "diffhelpers", diffhelpers_doc, -1, methods, |
11363
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
167 }; |
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
168 |
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
169 PyMODINIT_FUNC PyInit_diffhelpers(void) |
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
170 { |
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
171 PyObject *m; |
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
172 |
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
173 m = PyModule_Create(&diffhelpers_module); |
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
174 if (m == NULL) |
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
175 return NULL; |
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
176 |
36057
7f8338b87c88
diffhelpers: allow clang-format oversight
Augie Fackler <augie@google.com>
parents:
32370
diff
changeset
|
177 diffhelpers_Error = |
7f8338b87c88
diffhelpers: allow clang-format oversight
Augie Fackler <augie@google.com>
parents:
32370
diff
changeset
|
178 PyErr_NewException("diffhelpers.diffhelpersError", NULL, NULL); |
11363
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
179 Py_INCREF(diffhelpers_Error); |
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
180 PyModule_AddObject(m, "diffhelpersError", diffhelpers_Error); |
32357
2f51f4c535d2
diffhelpers: add version to help detect breaking binary changes
Jun Wu <quark@fb.com>
parents:
23964
diff
changeset
|
181 PyModule_AddIntConstant(m, "version", version); |
11363
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
182 |
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
183 return m; |
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
184 } |
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
185 #else |
36057
7f8338b87c88
diffhelpers: allow clang-format oversight
Augie Fackler <augie@google.com>
parents:
32370
diff
changeset
|
186 PyMODINIT_FUNC initdiffhelpers(void) |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
187 { |
32357
2f51f4c535d2
diffhelpers: add version to help detect breaking binary changes
Jun Wu <quark@fb.com>
parents:
23964
diff
changeset
|
188 PyObject *m; |
2f51f4c535d2
diffhelpers: add version to help detect breaking binary changes
Jun Wu <quark@fb.com>
parents:
23964
diff
changeset
|
189 m = Py_InitModule3("diffhelpers", methods, diffhelpers_doc); |
36057
7f8338b87c88
diffhelpers: allow clang-format oversight
Augie Fackler <augie@google.com>
parents:
32370
diff
changeset
|
190 diffhelpers_Error = |
7f8338b87c88
diffhelpers: allow clang-format oversight
Augie Fackler <augie@google.com>
parents:
32370
diff
changeset
|
191 PyErr_NewException("diffhelpers.diffhelpersError", NULL, NULL); |
32357
2f51f4c535d2
diffhelpers: add version to help detect breaking binary changes
Jun Wu <quark@fb.com>
parents:
23964
diff
changeset
|
192 PyModule_AddIntConstant(m, "version", version); |
4897
4574925db5c0
Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
193 } |
11363
f50103035c38
diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
194 #endif |