Show More
@@ -343,18 +343,28 b' static PyObject *index_get(indexObject *' | |||||
343 | } |
|
343 | } | |
344 | } |
|
344 | } | |
345 | /* |
|
345 | /* | |
|
346 | * Pack header information in binary | |||
|
347 | */ | |||
|
348 | static PyObject *index_pack_header(indexObject *self, PyObject *args) | |||
|
349 | { | |||
|
350 | int header; | |||
|
351 | char out[4]; | |||
|
352 | if (!PyArg_ParseTuple(args, "I", &header)) { | |||
|
353 | return NULL; | |||
|
354 | } | |||
|
355 | putbe32(header, out); | |||
|
356 | return PyBytes_FromStringAndSize(out, 4); | |||
|
357 | } | |||
|
358 | /* | |||
346 | * Return the raw binary string representing a revision |
|
359 | * Return the raw binary string representing a revision | |
347 | */ |
|
360 | */ | |
348 |
static PyObject *index_entry_binary(indexObject *self, PyObject * |
|
361 | static PyObject *index_entry_binary(indexObject *self, PyObject *value) | |
349 | { |
|
362 | { | |
350 | long rev; |
|
363 | long rev; | |
351 | int header; |
|
|||
352 | const char *data; |
|
364 | const char *data; | |
353 | char entry[v2_hdrsize]; |
|
|||
354 |
|
||||
355 | Py_ssize_t length = index_length(self); |
|
365 | Py_ssize_t length = index_length(self); | |
356 |
|
366 | |||
357 | if (!PyArg_ParseTuple(args, "lI", &rev, &header)) { |
|
367 | if (!pylong_to_long(value, &rev)) { | |
358 | return NULL; |
|
368 | return NULL; | |
359 | } |
|
369 | } | |
360 | if (rev < 0 || rev >= length) { |
|
370 | if (rev < 0 || rev >= length) { | |
@@ -367,10 +377,8 b' static PyObject *index_entry_binary(inde' | |||||
367 | if (data == NULL) |
|
377 | if (data == NULL) | |
368 | return NULL; |
|
378 | return NULL; | |
369 | if (rev == 0) { |
|
379 | if (rev == 0) { | |
370 |
/* |
|
380 | /* the header is eating the start of the first entry */ | |
371 | memcpy(entry, data, self->hdrsize); |
|
381 | return PyBytes_FromStringAndSize(data + 4, self->hdrsize - 4); | |
372 | putbe32(header, entry); |
|
|||
373 | return PyBytes_FromStringAndSize(entry, self->hdrsize); |
|
|||
374 | } |
|
382 | } | |
375 | return PyBytes_FromStringAndSize(data, self->hdrsize); |
|
383 | return PyBytes_FromStringAndSize(data, self->hdrsize); | |
376 | } |
|
384 | } | |
@@ -2891,8 +2899,10 b' static PyMethodDef index_methods[] = {' | |||||
2891 | {"shortest", (PyCFunction)index_shortest, METH_VARARGS, |
|
2899 | {"shortest", (PyCFunction)index_shortest, METH_VARARGS, | |
2892 | "find length of shortest hex nodeid of a binary ID"}, |
|
2900 | "find length of shortest hex nodeid of a binary ID"}, | |
2893 | {"stats", (PyCFunction)index_stats, METH_NOARGS, "stats for the index"}, |
|
2901 | {"stats", (PyCFunction)index_stats, METH_NOARGS, "stats for the index"}, | |
2894 |
{"entry_binary", (PyCFunction)index_entry_binary, METH_ |
|
2902 | {"entry_binary", (PyCFunction)index_entry_binary, METH_O, | |
2895 | "return an entry in binary form"}, |
|
2903 | "return an entry in binary form"}, | |
|
2904 | {"pack_header", (PyCFunction)index_pack_header, METH_VARARGS, | |||
|
2905 | "pack the revlog header information into binary"}, | |||
2896 | {NULL} /* Sentinel */ |
|
2906 | {NULL} /* Sentinel */ | |
2897 | }; |
|
2907 | }; | |
2898 |
|
2908 |
@@ -127,14 +127,17 b' class BaseIndexObject(object):' | |||||
127 | r = (offset_type(0, gettype(r[0])),) + r[1:] |
|
127 | r = (offset_type(0, gettype(r[0])),) + r[1:] | |
128 | return r |
|
128 | return r | |
129 |
|
129 | |||
130 |
def e |
|
130 | def pack_header(self, header): | |
|
131 | """pack header information as binary""" | |||
|
132 | v_fmt = revlog_constants.INDEX_HEADER | |||
|
133 | return v_fmt.pack(header) | |||
|
134 | ||||
|
135 | def entry_binary(self, rev): | |||
131 | """return the raw binary string representing a revision""" |
|
136 | """return the raw binary string representing a revision""" | |
132 | entry = self[rev] |
|
137 | entry = self[rev] | |
133 | p = revlog_constants.INDEX_ENTRY_V1.pack(*entry) |
|
138 | p = revlog_constants.INDEX_ENTRY_V1.pack(*entry) | |
134 | if rev == 0: |
|
139 | if rev == 0: | |
135 |
|
|
140 | p = p[revlog_constants.INDEX_HEADER.size :] | |
136 | v_bin = v_fmt.pack(header) |
|
|||
137 | p = v_bin + p[v_fmt.size :] |
|
|||
138 | return p |
|
141 | return p | |
139 |
|
142 | |||
140 |
|
143 | |||
@@ -286,14 +289,12 b' class Index2Mixin(object):' | |||||
286 | msg = b"cannot rewrite entries outside of this transaction" |
|
289 | msg = b"cannot rewrite entries outside of this transaction" | |
287 | raise KeyError(msg) |
|
290 | raise KeyError(msg) | |
288 |
|
291 | |||
289 |
def entry_binary(self, rev |
|
292 | def entry_binary(self, rev): | |
290 | """return the raw binary string representing a revision""" |
|
293 | """return the raw binary string representing a revision""" | |
291 | entry = self[rev] |
|
294 | entry = self[rev] | |
292 | p = revlog_constants.INDEX_ENTRY_V2.pack(*entry) |
|
295 | p = revlog_constants.INDEX_ENTRY_V2.pack(*entry) | |
293 | if rev == 0: |
|
296 | if rev == 0: | |
294 |
|
|
297 | p = p[revlog_constants.INDEX_HEADER.size :] | |
295 | v_bin = v_fmt.pack(header) |
|
|||
296 | p = v_bin + p[v_fmt.size :] |
|
|||
297 | return p |
|
298 | return p | |
298 |
|
299 | |||
299 |
|
300 |
@@ -266,7 +266,7 b' class revlogoldindex(list):' | |||||
266 | return (0, 0, 0, -1, -1, -1, -1, sha1nodeconstants.nullid) |
|
266 | return (0, 0, 0, -1, -1, -1, -1, sha1nodeconstants.nullid) | |
267 | return list.__getitem__(self, i) |
|
267 | return list.__getitem__(self, i) | |
268 |
|
268 | |||
269 |
def entry_binary(self, rev |
|
269 | def entry_binary(self, rev): | |
270 | """return the raw binary string representing a revision""" |
|
270 | """return the raw binary string representing a revision""" | |
271 | entry = self[rev] |
|
271 | entry = self[rev] | |
272 | if gettype(entry[0]): |
|
272 | if gettype(entry[0]): | |
@@ -284,6 +284,10 b' class revlogoldindex(list):' | |||||
284 | ) |
|
284 | ) | |
285 | return INDEX_ENTRY_V0.pack(*e2) |
|
285 | return INDEX_ENTRY_V0.pack(*e2) | |
286 |
|
286 | |||
|
287 | def pack_header(self, header): | |||
|
288 | """Pack header information in binary""" | |||
|
289 | return b'' | |||
|
290 | ||||
287 |
|
291 | |||
288 | def parse_index_v0(data, inline): |
|
292 | def parse_index_v0(data, inline): | |
289 | s = INDEX_ENTRY_V0.size |
|
293 | s = INDEX_ENTRY_V0.size | |
@@ -2041,7 +2045,10 b' class revlog(object):' | |||||
2041 | self.version &= ~FLAG_INLINE_DATA |
|
2045 | self.version &= ~FLAG_INLINE_DATA | |
2042 | self._inline = False |
|
2046 | self._inline = False | |
2043 | for i in self: |
|
2047 | for i in self: | |
2044 |
e = self.index.entry_binary(i |
|
2048 | e = self.index.entry_binary(i) | |
|
2049 | if i == 0: | |||
|
2050 | header = self.index.pack_header(self.version) | |||
|
2051 | e = header + e | |||
2045 | fp.write(e) |
|
2052 | fp.write(e) | |
2046 |
|
2053 | |||
2047 | # the temp file replace the real index when we exit the context |
|
2054 | # the temp file replace the real index when we exit the context | |
@@ -2363,7 +2370,10 b' class revlog(object):' | |||||
2363 | e = e[:8] |
|
2370 | e = e[:8] | |
2364 |
|
2371 | |||
2365 | self.index.append(e) |
|
2372 | self.index.append(e) | |
2366 |
entry = self.index.entry_binary(curr |
|
2373 | entry = self.index.entry_binary(curr) | |
|
2374 | if curr == 0: | |||
|
2375 | header = self.index.pack_header(self.version) | |||
|
2376 | entry = header + entry | |||
2367 | self._writeentry( |
|
2377 | self._writeentry( | |
2368 | transaction, |
|
2378 | transaction, | |
2369 | ifh, |
|
2379 | ifh, | |
@@ -3216,5 +3226,8 b' class revlog(object):' | |||||
3216 | for i, entry in enumerate(new_entries): |
|
3226 | for i, entry in enumerate(new_entries): | |
3217 | rev = startrev + i |
|
3227 | rev = startrev + i | |
3218 | self.index.replace_sidedata_info(rev, entry[8], entry[9]) |
|
3228 | self.index.replace_sidedata_info(rev, entry[8], entry[9]) | |
3219 |
packed = self.index.entry_binary(rev |
|
3229 | packed = self.index.entry_binary(rev) | |
|
3230 | if rev == 0: | |||
|
3231 | header = self.index.pack_header(self.version) | |||
|
3232 | packed = header + packed | |||
3220 | fp.write(packed) |
|
3233 | fp.write(packed) |
@@ -177,6 +177,11 b' py_class!(pub class MixedIndex |py| {' | |||||
177 | self.call_cindex(py, "entry_binary", args, kw) |
|
177 | self.call_cindex(py, "entry_binary", args, kw) | |
178 | } |
|
178 | } | |
179 |
|
179 | |||
|
180 | /// return a binary packed version of the header | |||
|
181 | def pack_header(&self, *args, **kw) -> PyResult<PyObject> { | |||
|
182 | self.call_cindex(py, "pack_header", args, kw) | |||
|
183 | } | |||
|
184 | ||||
180 | /// get an index entry |
|
185 | /// get an index entry | |
181 | def get(&self, *args, **kw) -> PyResult<PyObject> { |
|
186 | def get(&self, *args, **kw) -> PyResult<PyObject> { | |
182 | self.call_cindex(py, "get", args, kw) |
|
187 | self.call_cindex(py, "get", args, kw) |
General Comments 0
You need to be logged in to leave comments.
Login now