Commit 2b52eb4b authored by Tim Peters's avatar Tim Peters

SF bug 124051: ndiff "?" lines can be confusing. Well, they still can, but

after implementing it I liked Gregor's two-"?" line idea a lot.
parent a3d22678
#! /usr/bin/env python #! /usr/bin/env python
# Module ndiff version 1.5.0 # Module ndiff version 1.6.0
# Released to the public domain 08-Oct-2000, # Released to the public domain 08-Dec-2000,
# by Tim Peters (tim_one@email.msn.com). # by Tim Peters (tim.one@home.com).
# Provided as-is; use at your own risk; no warranty; no promises; enjoy! # Provided as-is; use at your own risk; no warranty; no promises; enjoy!
...@@ -408,13 +408,6 @@ def dump(tag, x, lo, hi): ...@@ -408,13 +408,6 @@ def dump(tag, x, lo, hi):
for i in xrange(lo, hi): for i in xrange(lo, hi):
print tag, x[i], print tag, x[i],
# figure out which mark to stick under characters in lines that
# have changed (blank = same, - = deleted, + = inserted, ^ = replaced)
_combine = { ' ': ' ',
'. ': '-',
' .': '+',
'..': '^' }
def plain_replace(a, alo, ahi, b, blo, bhi): def plain_replace(a, alo, ahi, b, blo, bhi):
assert alo < ahi and blo < bhi assert alo < ahi and blo < bhi
# dump the shorter block first -- reduces the burden on short-term # dump the shorter block first -- reduces the burden on short-term
...@@ -491,30 +484,24 @@ def fancy_replace(a, alo, ahi, b, blo, bhi): ...@@ -491,30 +484,24 @@ def fancy_replace(a, alo, ahi, b, blo, bhi):
# do intraline marking on the synch pair # do intraline marking on the synch pair
aelt, belt = a[best_i], b[best_j] aelt, belt = a[best_i], b[best_j]
if eqi is None: if eqi is None:
# pump out a '-', '+', '?' triple for the synched lines; # pump out a '-', '?', '+', '?' quad for the synched lines
atags = btags = "" atags = btags = ""
cruncher.set_seqs(aelt, belt) cruncher.set_seqs(aelt, belt)
for tag, ai1, ai2, bj1, bj2 in cruncher.get_opcodes(): for tag, ai1, ai2, bj1, bj2 in cruncher.get_opcodes():
la, lb = ai2 - ai1, bj2 - bj1 la, lb = ai2 - ai1, bj2 - bj1
if tag == 'replace': if tag == 'replace':
atags = atags + '.' * la atags += '^' * la
btags = btags + '.' * lb btags += '^' * lb
elif tag == 'delete': elif tag == 'delete':
atags = atags + '.' * la atags += '-' * la
elif tag == 'insert': elif tag == 'insert':
btags = btags + '.' * lb btags += '+' * lb
elif tag == 'equal': elif tag == 'equal':
atags = atags + ' ' * la atags += ' ' * la
btags = btags + ' ' * lb btags += ' ' * lb
else: else:
raise ValueError, 'unknown tag ' + `tag` raise ValueError, 'unknown tag ' + `tag`
la, lb = len(atags), len(btags) printq(aelt, belt, atags, btags)
if la < lb:
atags = atags + ' ' * (lb - la)
elif lb < la:
btags = btags + ' ' * (la - lb)
combined = map(lambda x,y: _combine[x+y], atags, btags)
printq(aelt, belt, string.rstrip(string.join(combined, '')))
else: else:
# the synch pair is identical # the synch pair is identical
print ' ', aelt, print ' ', aelt,
...@@ -534,12 +521,16 @@ def fancy_helper(a, alo, ahi, b, blo, bhi): ...@@ -534,12 +521,16 @@ def fancy_helper(a, alo, ahi, b, blo, bhi):
# Crap to deal with leading tabs in "?" output. Can hurt, but will # Crap to deal with leading tabs in "?" output. Can hurt, but will
# probably help most of the time. # probably help most of the time.
def printq(aline, bline, qline): def printq(aline, bline, atags, btags):
common = min(count_leading(aline, "\t"), common = min(count_leading(aline, "\t"),
count_leading(bline, "\t")) count_leading(bline, "\t"))
common = min(common, count_leading(qline[:common], " ")) common = min(common, count_leading(atags[:common], " "))
qline = "\t" * common + qline[common:] print "-", aline,
print '-', aline, '+', bline, '?', qline if count_leading(atags, " ") < len(atags):
print "?", "\t" * common + atags[common:]
print "+", bline,
if count_leading(btags, " ") < len(btags):
print "?", "\t" * common + btags[common:]
def count_leading(line, ch): def count_leading(line, ch):
i, n = 0, len(line) i, n = 0, len(line)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment