comparison mercurial/mdiff.py @ 2580:a20a1bb0c396

diff: add -b/-B options
author Haakon Riiser <haakon.riiser@fys.uio.no>
date Thu, 29 Jun 2006 15:16:25 +0200
parents fe1689273f84
children 345bac2bc4ec
comparison
equal deleted inserted replaced
2579:0875cda033fd 2580:a20a1bb0c396
18 else: 18 else:
19 lines[-1] = lines[-1][:-1] 19 lines[-1] = lines[-1][:-1]
20 return lines 20 return lines
21 21
22 def unidiff(a, ad, b, bd, fn, r=None, text=False, 22 def unidiff(a, ad, b, bd, fn, r=None, text=False,
23 showfunc=False, ignorews=False): 23 showfunc=False, ignorews=False, ignorewsamount=False,
24 ignoreblanklines=False):
24 25
25 if not a and not b: return "" 26 if not a and not b: return ""
26 epoch = util.datestr((0, 0)) 27 epoch = util.datestr((0, 0))
27 28
28 if not text and (util.binary(a) or util.binary(b)): 29 if not text and (util.binary(a) or util.binary(b)):
47 l = [l1, l2, l3] + ["-" + e for e in a] 48 l = [l1, l2, l3] + ["-" + e for e in a]
48 else: 49 else:
49 al = splitnewlines(a) 50 al = splitnewlines(a)
50 bl = splitnewlines(b) 51 bl = splitnewlines(b)
51 l = list(bunidiff(a, b, al, bl, "a/" + fn, "b/" + fn, 52 l = list(bunidiff(a, b, al, bl, "a/" + fn, "b/" + fn,
52 showfunc=showfunc, ignorews=ignorews)) 53 showfunc=showfunc, ignorews=ignorews,
54 ignorewsamount=ignorewsamount,
55 ignoreblanklines=ignoreblanklines))
53 if not l: return "" 56 if not l: return ""
54 # difflib uses a space, rather than a tab 57 # difflib uses a space, rather than a tab
55 l[0] = "%s\t%s\n" % (l[0][:-2], ad) 58 l[0] = "%s\t%s\n" % (l[0][:-2], ad)
56 l[1] = "%s\t%s\n" % (l[1][:-2], bd) 59 l[1] = "%s\t%s\n" % (l[1][:-2], bd)
57 60
70 # l1 and l2 are the text broken up into lines 73 # l1 and l2 are the text broken up into lines
71 # header1 and header2 are the filenames for the diff output 74 # header1 and header2 are the filenames for the diff output
72 # context is the number of context lines 75 # context is the number of context lines
73 # showfunc enables diff -p output 76 # showfunc enables diff -p output
74 # ignorews ignores all whitespace changes in the diff 77 # ignorews ignores all whitespace changes in the diff
78 # ignorewsamount ignores changes in the amount of whitespace
79 # ignoreblanklines ignores changes whose lines are all blank
75 def bunidiff(t1, t2, l1, l2, header1, header2, context=3, showfunc=False, 80 def bunidiff(t1, t2, l1, l2, header1, header2, context=3, showfunc=False,
76 ignorews=False): 81 ignorews=False, ignorewsamount=False, ignoreblanklines=False):
77 def contextend(l, len): 82 def contextend(l, len):
78 ret = l + context 83 ret = l + context
79 if ret > len: 84 if ret > len:
80 ret = len 85 ret = len
81 return ret 86 return ret
114 119
115 header = [ "--- %s\t\n" % header1, "+++ %s\t\n" % header2 ] 120 header = [ "--- %s\t\n" % header1, "+++ %s\t\n" % header2 ]
116 121
117 if showfunc: 122 if showfunc:
118 funcre = re.compile('\w') 123 funcre = re.compile('\w')
124 if ignorewsamount:
125 wsamountre = re.compile('[ \t]+')
126 wsappendedre = re.compile(' \n')
127 if ignoreblanklines:
128 wsblanklinesre = re.compile('\n')
119 if ignorews: 129 if ignorews:
120 wsre = re.compile('[ \t]') 130 wsre = re.compile('[ \t]')
121 131
122 # bdiff.blocks gives us the matching sequences in the files. The loop 132 # bdiff.blocks gives us the matching sequences in the files. The loop
123 # below finds the spaces between those matching sequences and translates 133 # below finds the spaces between those matching sequences and translates
146 156
147 # bdiff sometimes gives huge matches past eof, this check eats them, 157 # bdiff sometimes gives huge matches past eof, this check eats them,
148 # and deals with the special first match case described above 158 # and deals with the special first match case described above
149 if not old and not new: 159 if not old and not new:
150 continue 160 continue
161
162 if ignoreblanklines:
163 wsold = wsblanklinesre.sub('', "".join(old))
164 wsnew = wsblanklinesre.sub('', "".join(new))
165 if wsold == wsnew:
166 continue
167
168 if ignorewsamount:
169 wsold = wsamountre.sub(' ', "".join(old))
170 wsold = wsappendedre.sub('\n', wsold)
171 wsnew = wsamountre.sub(' ', "".join(new))
172 wsnew = wsappendedre.sub('\n', wsnew)
173 if wsold == wsnew:
174 continue
151 175
152 if ignorews: 176 if ignorews:
153 wsold = wsre.sub('', "".join(old)) 177 wsold = wsre.sub('', "".join(old))
154 wsnew = wsre.sub('', "".join(new)) 178 wsnew = wsre.sub('', "".join(new))
155 if wsold == wsnew: 179 if wsold == wsnew: