pure Python implementation of diffhelpers.c
authorMartin Geisler <mg@daimi.au.dk>
Sat, 24 Jan 2009 00:12:19 +0100
changeset 7702 f6bb40554e34
parent 7701 4bdead043d8d
child 7703 9044d3567f6d
pure Python implementation of diffhelpers.c
mercurial/pure/diffhelpers.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial/pure/diffhelpers.py	Sat Jan 24 00:12:19 2009 +0100
@@ -0,0 +1,56 @@
+# diffhelpers.py - pure Python implementation of diffhelpers.c
+#
+# Copyright 2009 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms
+# of the GNU General Public License, incorporated herein by reference.
+
+def addlines(fp, hunk, lena, lenb, a, b):
+    while True:
+        todoa = lena - len(a)
+        todob = lenb - len(b)
+        num = max(todoa, todob)
+        if num == 0:
+            break
+        for i in xrange(num):
+            s = fp.readline()
+            c = s[0]
+            if s == "\\ No newline at end of file\n":
+                fix_newline(hunk, a, b)
+                continue
+            if c == "\n":
+                # Some patches may be missing the control char
+                # on empty lines. Supply a leading space.
+                s = " \n"
+            hunk.append(s)
+            if c == "+":
+                b.append(s[1:])
+            elif c == "-":
+                a.append(s)
+            else:
+                b.append(s[1:])
+                a.append(s)
+    return 0
+
+def fix_newline(hunk, a, b):
+    l = hunk[-1]
+    c = l[0]
+    hline = l[:-1]
+
+    if c == " " or c == "+":
+        b[-1] = l[1:-1]
+    if c == " " or c == "-":
+        a[-1] = hline
+    hunk[-1] = hline
+    return 0
+
+
+def testhunk(a, b, bstart):
+    alen = len(a)
+    blen = len(b)
+    if alen > blen - bstart:
+        return -1
+    for i in xrange(alen):
+        if a[i][1:] != b[i + bstart]:
+            return -1
+    return 0