Mercurial > hg
changeset 125:8913e13196e1
Remove python version of the patches code
author | mpm@selenic.com |
---|---|
date | Fri, 20 May 2005 17:49:25 -0800 |
parents | 0f6c49138f67 |
children | f6d1f8a84372 |
files | mercurial/mdiff.py |
diffstat | 1 files changed, 1 insertions(+), 80 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/mdiff.py Fri May 20 17:47:13 2005 -0800 +++ b/mercurial/mdiff.py Fri May 20 17:49:25 2005 -0800 @@ -1,7 +1,5 @@ #!/usr/bin/python -import difflib, struct, mmap - -devzero = file("/dev/zero") +import difflib, struct, mmap, mpatchs def unidiff(a, ad, b, bd, fn): if not a and not b: return "" @@ -63,82 +61,5 @@ pos += l return "".join(t) -# This attempts to apply a series of patches in time proportional to -# the total size of the patches, rather than patches * len(text). This -# means rather than shuffling strings around, we shuffle around -# pointers to fragments with fragment lists. -# -# When the fragment lists get too long, we collapse them. To do this -# efficiently, we do all our operations inside a buffer created by -# mmap and simply use memmove. This avoids creating a bunch of large -# temporary string buffers. - -def patches(a, bins): - if not bins: return a - - plens = [len(x) for x in bins] - pl = sum(plens) - bl = len(a) + pl - tl = bl + bl + pl # enough for the patches and two working texts - b1, b2 = 0, bl - - if not tl: return a - - m = mmap.mmap(devzero.fileno(), tl, mmap.MAP_PRIVATE) - - # load our original text - m.write(a) - frags = [(len(a), b1)] - - # copy all the patches into our segment so we can memmove from them - pos = b2 + bl - m.seek(pos) - for p in bins: m.write(p) - - def pull(dst, src, l): # pull l bytes from src - while l: - f = src.pop(0) - if f[0] > l: # do we need to split? - src.insert(0, (f[0] - l, f[1] + l)) - dst.append((l, f[1])) - return - dst.append(f) - l -= f[0] - - def collect(buf, list): - start = buf - for l, p in list: - m.move(buf, p, l) - buf += l - return (buf - start, start) - - for plen in plens: - # if our list gets too long, execute it - if len(frags) > 128: - b2, b1 = b1, b2 - frags = [collect(b1, frags)] - - new = [] - end = pos + plen - last = 0 - while pos < end: - p1, p2, l = struct.unpack(">lll", m[pos:pos + 12]) - pull(new, frags, p1 - last) # what didn't change - pull([], frags, p2 - p1) # what got deleted - new.append((l, pos + 12)) # what got added - pos += l + 12 - last = p2 - frags = new + frags # what was left at the end - - t = collect(b2, frags) - - return m[t[1]:t[1] + t[0]] - def patch(a, bin): return patches(a, [bin]) - -try: - import mpatch - patches = mpatch.patches -except: - pass