Remove python version of the patches code
authormpm@selenic.com
Fri, 20 May 2005 17:49:25 -0800
changeset 125 8913e13196e1
parent 124 0f6c49138f67
child 126 f6d1f8a84372
Remove python version of the patches code
mercurial/mdiff.py
--- 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