##// END OF EJS Templates
mdiff: extract blocks whitespace normalization in diffblocks()...
Patrick Mezard -
r15525:935bf2e7 default
parent child Browse files
Show More
@@ -75,6 +75,46 def wsclean(opts, text, blank=True):
75 75 text = re.sub('\n+', '\n', text).strip('\n')
76 76 return text
77 77
78 def diffblocks(text1, text2, opts=None, lines1=None, lines2=None):
79 """Return changed blocks between text1 and text2, the blocks in-between
80 those emitted by bdiff.blocks. Take in account the whitespace normalization
81 rules defined by opts.
82 line1 and line2 are text1 and text2 split with splitnewlines() if they are
83 already available.
84 """
85 if opts is None:
86 opts = defaultopts
87 if lines1 is None:
88 lines1 = splitnewlines(text1)
89 if lines2 is None:
90 lines2 = splitnewlines(text2)
91 if opts.ignorews or opts.ignorewsamount:
92 text1 = wsclean(opts, text1, False)
93 text2 = wsclean(opts, text2, False)
94 diff = bdiff.blocks(text1, text2)
95 for i, s1 in enumerate(diff):
96 # The first match is special.
97 # we've either found a match starting at line 0 or a match later
98 # in the file. If it starts later, old and new below will both be
99 # empty and we'll continue to the next match.
100 if i > 0:
101 s = diff[i - 1]
102 else:
103 s = [0, 0, 0, 0]
104 s = [s[1], s1[0], s[3], s1[2]]
105 old = lines1[s[0]:s[1]]
106 new = lines2[s[2]:s[3]]
107
108 # bdiff sometimes gives huge matches past eof, this check eats them,
109 # and deals with the special first match case described above
110 if not old and not new:
111 continue
112
113 if opts.ignoreblanklines:
114 if wsclean(opts, "".join(old)) == wsclean(opts, "".join(new)):
115 continue
116 yield s
117
78 118 def diffline(revs, a, b, opts):
79 119 parts = ['diff']
80 120 if opts.git:
@@ -200,39 +240,13 def _unidiff(t1, t2, l1, l2, opts=defaul
200 240 # below finds the spaces between those matching sequences and translates
201 241 # them into diff output.
202 242 #
203 if opts.ignorews or opts.ignorewsamount:
204 t1 = wsclean(opts, t1, False)
205 t2 = wsclean(opts, t2, False)
206
207 diff = bdiff.blocks(t1, t2)
208 243 hunk = None
209 for i, s1 in enumerate(diff):
210 # The first match is special.
211 # we've either found a match starting at line 0 or a match later
212 # in the file. If it starts later, old and new below will both be
213 # empty and we'll continue to the next match.
214 if i > 0:
215 s = diff[i - 1]
216 else:
217 s = [0, 0, 0, 0]
244 for s in diffblocks(t1, t2, opts, l1, l2):
218 245 delta = []
219 a1 = s[1]
220 a2 = s1[0]
221 b1 = s[3]
222 b2 = s1[2]
223
246 a1, a2, b1, b2 = s
224 247 old = l1[a1:a2]
225 248 new = l2[b1:b2]
226 249
227 # bdiff sometimes gives huge matches past eof, this check eats them,
228 # and deals with the special first match case described above
229 if not old and not new:
230 continue
231
232 if opts.ignoreblanklines:
233 if wsclean(opts, "".join(old)) == wsclean(opts, "".join(new)):
234 continue
235
236 250 astart = contextstart(a1)
237 251 bstart = contextstart(b1)
238 252 prev = None
General Comments 0
You need to be logged in to leave comments. Login now