comparison mercurial/mdiff.py @ 2251:35fb62a3a673 0.9

fix speed regression in mdiff caused by line split bugfix.
author Vadim Gelfer <vadim.gelfer@gmail.com>
date Wed, 10 May 2006 13:39:12 -0700
parents b914f0557832
children fe1689273f84
comparison
equal deleted inserted replaced
2250:45aef5ddcdbe 2251:35fb62a3a673
7 7
8 from demandload import demandload 8 from demandload import demandload
9 import struct, bdiff, util, mpatch 9 import struct, bdiff, util, mpatch
10 demandload(globals(), "re") 10 demandload(globals(), "re")
11 11
12 12 def splitnewlines(text):
13 def splitnewlines(text, keepends=False):
14 '''like str.splitlines, but only split on newlines.''' 13 '''like str.splitlines, but only split on newlines.'''
15 i = 0 14 lines = [l + '\n' for l in text.split('\n')]
16 lines = [] 15 if lines:
17 while True: 16 if lines[-1] == '\n':
18 n = text.find('\n', i) 17 lines.pop()
19 if n == -1: 18 else:
20 last = text[i:] 19 lines[-1] = lines[-1][:-1]
21 if last: 20 return lines
22 lines.append(last)
23 return lines
24 lines.append(text[i:keepends and n+1 or n])
25 i = n + 1
26 21
27 def unidiff(a, ad, b, bd, fn, r=None, text=False, 22 def unidiff(a, ad, b, bd, fn, r=None, text=False,
28 showfunc=False, ignorews=False): 23 showfunc=False, ignorews=False):
29 24
30 if not a and not b: return "" 25 if not a and not b: return ""
31 epoch = util.datestr((0, 0)) 26 epoch = util.datestr((0, 0))
32 27
33 if not text and (util.binary(a) or util.binary(b)): 28 if not text and (util.binary(a) or util.binary(b)):
34 l = ['Binary file %s has changed\n' % fn] 29 l = ['Binary file %s has changed\n' % fn]
35 elif not a: 30 elif not a:
36 b = splitnewlines(b, keepends=True) 31 b = splitnewlines(b)
37 if a is None: 32 if a is None:
38 l1 = "--- %s\t%s\n" % ("/dev/null", epoch) 33 l1 = "--- %s\t%s\n" % ("/dev/null", epoch)
39 else: 34 else:
40 l1 = "--- %s\t%s\n" % ("a/" + fn, ad) 35 l1 = "--- %s\t%s\n" % ("a/" + fn, ad)
41 l2 = "+++ %s\t%s\n" % ("b/" + fn, bd) 36 l2 = "+++ %s\t%s\n" % ("b/" + fn, bd)
42 l3 = "@@ -0,0 +1,%d @@\n" % len(b) 37 l3 = "@@ -0,0 +1,%d @@\n" % len(b)
43 l = [l1, l2, l3] + ["+" + e for e in b] 38 l = [l1, l2, l3] + ["+" + e for e in b]
44 elif not b: 39 elif not b:
45 a = splitnewlines(a, keepends=True) 40 a = splitnewlines(a)
46 l1 = "--- %s\t%s\n" % ("a/" + fn, ad) 41 l1 = "--- %s\t%s\n" % ("a/" + fn, ad)
47 if b is None: 42 if b is None:
48 l2 = "+++ %s\t%s\n" % ("/dev/null", epoch) 43 l2 = "+++ %s\t%s\n" % ("/dev/null", epoch)
49 else: 44 else:
50 l2 = "+++ %s\t%s\n" % ("b/" + fn, bd) 45 l2 = "+++ %s\t%s\n" % ("b/" + fn, bd)
51 l3 = "@@ -1,%d +0,0 @@\n" % len(a) 46 l3 = "@@ -1,%d +0,0 @@\n" % len(a)
52 l = [l1, l2, l3] + ["-" + e for e in a] 47 l = [l1, l2, l3] + ["-" + e for e in a]
53 else: 48 else:
54 al = splitnewlines(a, keepends=True) 49 al = splitnewlines(a)
55 bl = splitnewlines(b, keepends=True) 50 bl = splitnewlines(b)
56 l = list(bunidiff(a, b, al, bl, "a/" + fn, "b/" + fn, 51 l = list(bunidiff(a, b, al, bl, "a/" + fn, "b/" + fn,
57 showfunc=showfunc, ignorews=ignorews)) 52 showfunc=showfunc, ignorews=ignorews))
58 if not l: return "" 53 if not l: return ""
59 # difflib uses a space, rather than a tab 54 # difflib uses a space, rather than a tab
60 l[0] = "%s\t%s\n" % (l[0][:-2], ad) 55 l[0] = "%s\t%s\n" % (l[0][:-2], ad)