comparison mercurial/mdiff.py @ 64:b3e2ddff0159

Diff in subdirectories from Jake Edge Dates in diff Fix O(n^2) behaviour of manifest diff Add a/ and b/ to work with patch -p1
author mpm@selenic.com
date Thu, 12 May 2005 17:54:55 -0800
parents 9197c26a414b
children 47c9a869adee
comparison
equal deleted inserted replaced
63:1c590d34bf61 64:b3e2ddff0159
1 #!/usr/bin/python 1 #!/usr/bin/python
2 import difflib, struct 2 import difflib, struct
3 from cStringIO import StringIO 3 from cStringIO import StringIO
4 4
5 def unidiff(a, b, fn): 5 def unidiff(a, ad, b, bd, fn):
6 if not a and not b: return "" 6 if not a and not b: return ""
7 a = a.splitlines(1) 7 a = a.splitlines(1)
8 b = b.splitlines(1) 8 b = b.splitlines(1)
9 l = list(difflib.unified_diff(a, b, fn, fn)) 9 l = list(difflib.unified_diff(a, b, "a/" + fn, "b/" + fn, ad, bd))
10 return "".join(l) 10 return "".join(l)
11 11
12 def textdiff(a, b): 12 def textdiff(a, b):
13 return diff(a.splitlines(1), b.splitlines(1)) 13 return diff(a.splitlines(1), b.splitlines(1))
14 14
27 yield "delete", si, la, lb, lb 27 yield "delete", si, la, lb, lb
28 else: 28 else:
29 la += 1 29 la += 1
30 lb += 1 30 lb += 1
31 31
32 si = lb 32 if lb < len(b):
33 while lb < len(b): 33 yield "insert", la, la, lb, len(b)
34 lb += 1
35 yield "insert", la, la, si, lb
36 34
37 si = la 35 if la < len(a):
38 while la < len(a): 36 yield "delete", la, len(a), lb, lb
39 la += 1
40 yield "delete", si, la, lb, lb
41 37
42 def diff(a, b, sorted=0): 38 def diff(a, b, sorted=0):
43 bin = [] 39 bin = []
44 p = [0] 40 p = [0]
45 for i in a: p.append(p[-1] + len(i)) 41 for i in a: p.append(p[-1] + len(i))
58 54
59 def patch(a, bin): 55 def patch(a, bin):
60 last = pos = 0 56 last = pos = 0
61 r = [] 57 r = []
62 58
59 c = 0
63 while pos < len(bin): 60 while pos < len(bin):
64 p1, p2, l = struct.unpack(">lll", bin[pos:pos + 12]) 61 p1, p2, l = struct.unpack(">lll", bin[pos:pos + 12])
65 pos += 12 62 pos += 12
66 r.append(a[last:p1]) 63 r.append(a[last:p1])
67 r.append(bin[pos:pos + l]) 64 r.append(bin[pos:pos + l])
68 pos += l 65 pos += l
69 last = p2 66 last = p2
67 c += 1
70 r.append(a[last:]) 68 r.append(a[last:])
71 69
72 return "".join(r) 70 return "".join(r)
73 71
74 72