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 |
|
|
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