##// END OF EJS Templates
mdiff: make diffblocks() return all blocks, matching and changed...
Patrick Mezard -
r15526:e6519c62 default
parent child Browse files
Show More
@@ -75,12 +75,13 def wsclean(opts, text, blank=True):
75 text = re.sub('\n+', '\n', text).strip('\n')
75 text = re.sub('\n+', '\n', text).strip('\n')
76 return text
76 return text
77
77
78 def diffblocks(text1, text2, opts=None, lines1=None, lines2=None):
78 def allblocks(text1, text2, opts=None, lines1=None, lines2=None):
79 """Return changed blocks between text1 and text2, the blocks in-between
79 """Return (block, type) tuples, where block is an mdiff.blocks
80 those emitted by bdiff.blocks. Take in account the whitespace normalization
80 line entry. type is '=' for blocks matching exactly one another
81 rules defined by opts.
81 (bdiff blocks), '!' for non-matching blocks and '~' for blocks
82 line1 and line2 are text1 and text2 split with splitnewlines() if they are
82 matching only after having filtered blank lines.
83 already available.
83 line1 and line2 are text1 and text2 split with splitnewlines() if
84 they are already available.
84 """
85 """
85 if opts is None:
86 if opts is None:
86 opts = defaultopts
87 opts = defaultopts
@@ -107,13 +108,15 def diffblocks(text1, text2, opts=None,
107
108
108 # bdiff sometimes gives huge matches past eof, this check eats them,
109 # bdiff sometimes gives huge matches past eof, this check eats them,
109 # and deals with the special first match case described above
110 # and deals with the special first match case described above
110 if not old and not new:
111 if old or new:
111 continue
112 type = '!'
112
113 if opts.ignoreblanklines:
113 if opts.ignoreblanklines:
114 if wsclean(opts, "".join(old)) == wsclean(opts, "".join(new)):
114 cold = wsclean(opts, "".join(old))
115 continue
115 cnew = wsclean(opts, "".join(new))
116 yield s
116 if cold == cnew:
117 type = '~'
118 yield s, type
119 yield s1, '='
117
120
118 def diffline(revs, a, b, opts):
121 def diffline(revs, a, b, opts):
119 parts = ['diff']
122 parts = ['diff']
@@ -241,7 +244,9 def _unidiff(t1, t2, l1, l2, opts=defaul
241 # them into diff output.
244 # them into diff output.
242 #
245 #
243 hunk = None
246 hunk = None
244 for s in diffblocks(t1, t2, opts, l1, l2):
247 for s, stype in allblocks(t1, t2, opts, l1, l2):
248 if stype != '!':
249 continue
245 delta = []
250 delta = []
246 a1, a2, b1, b2 = s
251 a1, a2, b1, b2 = s
247 old = l1[a1:a2]
252 old = l1[a1:a2]
General Comments 0
You need to be logged in to leave comments. Login now