Show More
@@ -192,4 +192,5 b' def patch(a, bin):' | |||||
192 | return mpatch.patches(a, [bin]) |
|
192 | return mpatch.patches(a, [bin]) | |
193 |
|
193 | |||
194 | patches = mpatch.patches |
|
194 | patches = mpatch.patches | |
|
195 | patchedsize = mpatch.patchedsize | |||
195 | textdiff = bdiff.bdiff |
|
196 | textdiff = bdiff.bdiff |
@@ -354,8 +354,44 b' cleanup:' | |||||
354 | return result; |
|
354 | return result; | |
355 | } |
|
355 | } | |
356 |
|
356 | |||
|
357 | /* calculate size of a patched file directly */ | |||
|
358 | static PyObject * | |||
|
359 | patchedsize(PyObject *self, PyObject *args) | |||
|
360 | { | |||
|
361 | long orig, start, end, len, outlen = 0, last = 0; | |||
|
362 | int patchlen; | |||
|
363 | char *bin, *binend; | |||
|
364 | char decode[12]; /* for dealing with alignment issues */ | |||
|
365 | ||||
|
366 | if (!PyArg_ParseTuple(args, "ls#", &orig, &bin, &patchlen)) | |||
|
367 | return NULL; | |||
|
368 | ||||
|
369 | binend = bin + patchlen; | |||
|
370 | ||||
|
371 | while (bin < binend) { | |||
|
372 | memcpy(decode, bin, 12); | |||
|
373 | start = ntohl(*(uint32_t *)decode); | |||
|
374 | end = ntohl(*(uint32_t *)(decode + 4)); | |||
|
375 | len = ntohl(*(uint32_t *)(decode + 8)); | |||
|
376 | bin += 12 + len; | |||
|
377 | outlen += start - last; | |||
|
378 | last = end; | |||
|
379 | outlen += len; | |||
|
380 | } | |||
|
381 | ||||
|
382 | if (bin != binend) { | |||
|
383 | if (!PyErr_Occurred()) | |||
|
384 | PyErr_SetString(mpatch_Error, "patch cannot be decoded"); | |||
|
385 | return NULL; | |||
|
386 | } | |||
|
387 | ||||
|
388 | outlen += orig - last; | |||
|
389 | return Py_BuildValue("l", outlen); | |||
|
390 | } | |||
|
391 | ||||
357 | static PyMethodDef methods[] = { |
|
392 | static PyMethodDef methods[] = { | |
358 | {"patches", patches, METH_VARARGS, "apply a series of patches\n"}, |
|
393 | {"patches", patches, METH_VARARGS, "apply a series of patches\n"}, | |
|
394 | {"patchedsize", patchedsize, METH_VARARGS, "calculed patched size\n"}, | |||
359 | {NULL, NULL} |
|
395 | {NULL, NULL} | |
360 | }; |
|
396 | }; | |
361 |
|
397 |
@@ -342,8 +342,40 b' class revlog(object):' | |||||
342 | if self.version != 0: |
|
342 | if self.version != 0: | |
343 | return self.ngoffset(self.index[rev][0]) |
|
343 | return self.ngoffset(self.index[rev][0]) | |
344 | return self.index[rev][0] |
|
344 | return self.index[rev][0] | |
|
345 | ||||
345 | def end(self, rev): return self.start(rev) + self.length(rev) |
|
346 | def end(self, rev): return self.start(rev) + self.length(rev) | |
346 |
|
347 | |||
|
348 | def size(self, rev): | |||
|
349 | """return the length of the uncompressed text for a given revision""" | |||
|
350 | l = -1 | |||
|
351 | if self.version != 0: | |||
|
352 | l = self.index[rev][2] | |||
|
353 | if l >= 0: | |||
|
354 | return l | |||
|
355 | ||||
|
356 | t = self.revision(self.node(rev)) | |||
|
357 | return len(t) | |||
|
358 | ||||
|
359 | # alternate implementation, The advantage to this code is it | |||
|
360 | # will be faster for a single revision. But, the results are not | |||
|
361 | # cached, so finding the size of every revision will be slower. | |||
|
362 | """ | |||
|
363 | if self.cache and self.cache[1] == rev: | |||
|
364 | return len(self.cache[2]) | |||
|
365 | ||||
|
366 | base = self.base(rev) | |||
|
367 | if self.cache and self.cache[1] >= base and self.cache[1] < rev: | |||
|
368 | base = self.cache[1] | |||
|
369 | text = self.cache[2] | |||
|
370 | else: | |||
|
371 | text = self.revision(self.node(base)) | |||
|
372 | ||||
|
373 | l = len(text) | |||
|
374 | for x in xrange(base + 1, rev + 1): | |||
|
375 | l = mdiff.patchedsize(l, self.chunk(x)) | |||
|
376 | return l | |||
|
377 | """ | |||
|
378 | ||||
347 | def length(self, rev): |
|
379 | def length(self, rev): | |
348 | if rev < 0: |
|
380 | if rev < 0: | |
349 | return 0 |
|
381 | return 0 | |
@@ -904,7 +936,7 b' class revlog(object):' | |||||
904 | node = None |
|
936 | node = None | |
905 |
|
937 | |||
906 | base = prev = -1 |
|
938 | base = prev = -1 | |
907 |
start = end = |
|
939 | start = end = textlen = 0 | |
908 | if r: |
|
940 | if r: | |
909 | end = self.end(t) |
|
941 | end = self.end(t) | |
910 |
|
942 | |||
@@ -949,8 +981,9 b' class revlog(object):' | |||||
949 | if chain == prev: |
|
981 | if chain == prev: | |
950 | tempd = compress(delta) |
|
982 | tempd = compress(delta) | |
951 | cdelta = tempd[0] + tempd[1] |
|
983 | cdelta = tempd[0] + tempd[1] | |
|
984 | textlen = mdiff.patchedsize(textlen, delta) | |||
952 |
|
985 | |||
953 |
if chain != prev or (end - start + len(cdelta)) > |
|
986 | if chain != prev or (end - start + len(cdelta)) > textlen * 2: | |
954 | # flush our writes here so we can read it in revision |
|
987 | # flush our writes here so we can read it in revision | |
955 | if dfh: |
|
988 | if dfh: | |
956 | dfh.flush() |
|
989 | dfh.flush() | |
@@ -960,12 +993,12 b' class revlog(object):' | |||||
960 | chk = self.addrevision(text, transaction, link, p1, p2) |
|
993 | chk = self.addrevision(text, transaction, link, p1, p2) | |
961 | if chk != node: |
|
994 | if chk != node: | |
962 | raise RevlogError(_("consistency error adding group")) |
|
995 | raise RevlogError(_("consistency error adding group")) | |
963 |
|
|
996 | textlen = len(text) | |
964 | else: |
|
997 | else: | |
965 | if self.version == 0: |
|
998 | if self.version == 0: | |
966 | e = (end, len(cdelta), base, link, p1, p2, node) |
|
999 | e = (end, len(cdelta), base, link, p1, p2, node) | |
967 | else: |
|
1000 | else: | |
968 |
e = (self.offset_type(end, 0), len(cdelta), |
|
1001 | e = (self.offset_type(end, 0), len(cdelta), textlen, base, | |
969 | link, self.rev(p1), self.rev(p2), node) |
|
1002 | link, self.rev(p1), self.rev(p2), node) | |
970 | self.index.append(e) |
|
1003 | self.index.append(e) | |
971 | self.nodemap[node] = r |
|
1004 | self.nodemap[node] = r |
General Comments 0
You need to be logged in to leave comments.
Login now