Show More
@@ -38,85 +38,6 b' static PyObject *dict_new_presized(PyObj' | |||
|
38 | 38 | return _dict_new_presized(expected_size); |
|
39 | 39 | } |
|
40 | 40 | |
|
41 | /* | |
|
42 | * This code assumes that a manifest is stitched together with newline | |
|
43 | * ('\n') characters. | |
|
44 | */ | |
|
45 | static PyObject *parse_manifest(PyObject *self, PyObject *args) | |
|
46 | { | |
|
47 | PyObject *mfdict, *fdict; | |
|
48 | char *str, *start, *end; | |
|
49 | int len; | |
|
50 | ||
|
51 | if (!PyArg_ParseTuple( | |
|
52 | args, PY23("O!O!s#:parse_manifest", "O!O!y#:parse_manifest"), | |
|
53 | &PyDict_Type, &mfdict, &PyDict_Type, &fdict, &str, &len)) | |
|
54 | goto quit; | |
|
55 | ||
|
56 | start = str; | |
|
57 | end = str + len; | |
|
58 | while (start < end) { | |
|
59 | PyObject *file = NULL, *node = NULL; | |
|
60 | PyObject *flags = NULL; | |
|
61 | char *zero = NULL, *newline = NULL; | |
|
62 | ptrdiff_t nlen; | |
|
63 | ||
|
64 | zero = memchr(start, '\0', end - start); | |
|
65 | if (!zero) { | |
|
66 | PyErr_SetString(PyExc_ValueError, | |
|
67 | "manifest entry has no separator"); | |
|
68 | goto quit; | |
|
69 | } | |
|
70 | ||
|
71 | newline = memchr(zero + 1, '\n', end - (zero + 1)); | |
|
72 | if (!newline) { | |
|
73 | PyErr_SetString(PyExc_ValueError, | |
|
74 | "manifest contains trailing garbage"); | |
|
75 | goto quit; | |
|
76 | } | |
|
77 | ||
|
78 | file = PyBytes_FromStringAndSize(start, zero - start); | |
|
79 | ||
|
80 | if (!file) | |
|
81 | goto bail; | |
|
82 | ||
|
83 | nlen = newline - zero - 1; | |
|
84 | ||
|
85 | node = unhexlify(zero + 1, nlen > 40 ? 40 : (Py_ssize_t)nlen); | |
|
86 | if (!node) | |
|
87 | goto bail; | |
|
88 | ||
|
89 | if (nlen > 40) { | |
|
90 | flags = PyBytes_FromStringAndSize(zero + 41, nlen - 40); | |
|
91 | if (!flags) | |
|
92 | goto bail; | |
|
93 | ||
|
94 | if (PyDict_SetItem(fdict, file, flags) == -1) | |
|
95 | goto bail; | |
|
96 | } | |
|
97 | ||
|
98 | if (PyDict_SetItem(mfdict, file, node) == -1) | |
|
99 | goto bail; | |
|
100 | ||
|
101 | start = newline + 1; | |
|
102 | ||
|
103 | Py_XDECREF(flags); | |
|
104 | Py_XDECREF(node); | |
|
105 | Py_XDECREF(file); | |
|
106 | continue; | |
|
107 | bail: | |
|
108 | Py_XDECREF(flags); | |
|
109 | Py_XDECREF(node); | |
|
110 | Py_XDECREF(file); | |
|
111 | goto quit; | |
|
112 | } | |
|
113 | ||
|
114 | Py_INCREF(Py_None); | |
|
115 | return Py_None; | |
|
116 | quit: | |
|
117 | return NULL; | |
|
118 | } | |
|
119 | ||
|
120 | 41 | static inline dirstateTupleObject *make_dirstate_tuple(char state, int mode, |
|
121 | 42 | int size, int mtime) |
|
122 | 43 | { |
@@ -690,7 +611,6 b' static PyMethodDef methods[] = {' | |||
|
690 | 611 | {"nonnormalotherparententries", nonnormalotherparententries, METH_VARARGS, |
|
691 | 612 | "create a set containing non-normal and other parent entries of given " |
|
692 | 613 | "dirstate\n"}, |
|
693 | {"parse_manifest", parse_manifest, METH_VARARGS, "parse a manifest\n"}, | |
|
694 | 614 | {"parse_dirstate", parse_dirstate, METH_VARARGS, "parse a dirstate\n"}, |
|
695 | 615 | {"parse_index2", parse_index2, METH_VARARGS, "parse a revlog index\n"}, |
|
696 | 616 | {"isasciistr", isasciistr, METH_VARARGS, "check if an ASCII string\n"}, |
General Comments 0
You need to be logged in to leave comments.
Login now