mercurial/mdiff.py
changeset 64 b3e2ddff0159
parent 35 9197c26a414b
child 71 47c9a869adee
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