annotate mercurial/cext/diffhelpers.c @ 36809:3c15b84ab66c

hgweb: teach WSGI parser about query strings Currently, req.form uses cgi.parse() to populate form data. Depending on the request, form data can come from POST multipart/form-data, application/x-www-form-urlencoded, or the URL query string. Putting all these things into one data structure makes it difficult to reason about how exactly parameters got to the request. It can lead to wonkiness such as pulling parameters from both the URL and POST data. This commit teaches our WSGI request parser about argument data in query strings. We populate fields containing the query string data and only the query string data so it can't be confused with POST data. Differential Revision: https://phab.mercurial-scm.org/D2737
author Gregory Szorc <gregory.szorc@gmail.com>
date Thu, 08 Mar 2018 11:21:46 -0800
parents 7f8338b87c88
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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