import difflib REPLACE='replace' DELETE='delete' INSERT='insert' EQUAL='equal' def unidiff(f1, f2, ctx): sys.stdout.write("--- %s\n" % (f1,)) sys.stdout.write("+++ %s\n" % (f2,)) c1 = open(f1).readlines() c2 = open(f2).readlines() m = difflib.SequenceMatcher(None, c1, c2) ops = m.get_opcodes() i = 0 while i < len(ops): while i < len(ops) and ops[i][0] == EQUAL: i=i+1 if i == len(ops): break j = i st1 = max(0, ops[j][1]-ctx) st2 = max(0, ops[j][3]-ctx) while i < len(ops) and (ops[i][0]!=EQUAL or ops[i][2]-ops[i][1]<2*ctx): i=i+1 en1 = min(len(c1), ops[i-1][2]+ctx) en2 = min(len(c2), ops[i-1][4]+ctx) sys.stdout.write("@@ -%d,%d +%d,%d @@\n" % (st1+1, en1-st1, st2+1, en2-st2)) for k in range(st1, ops[j][1]): sys.stdout.write(" %s" % c1[k]) for (opcode, i1, i2, j1, j2) in ops[j:i]: if opcode == EQUAL: for l in range(i1, i2): sys.stdout.write(" %s" % c1[l]) if opcode == DELETE or opcode==REPLACE: for l in range(i1, i2): sys.stdout.write("-%s" % c1[l]) if opcode == INSERT or opcode==REPLACE: for l in range(j1, j2): sys.stdout.write("+%s" % c2[l]) for k in range(ops[i-1][2], en1): sys.stdout.write(" %s" % c1[k]) def __main__(args): unidiff(args[0], args[1], 3) if __name__ == '__main__': import sys __main__(sys.argv[1:])