mirror of https://github.com/abinit/abinit.git
111 lines
3.7 KiB
Python
Executable File
111 lines
3.7 KiB
Python
Executable File
#!/usr/bin/env python
|
|
""" Command line interface to difflib.py providing diffs in four formats:
|
|
|
|
* ndiff: lists every line and highlights interline changes.
|
|
* context: highlights clusters of changes in a before/after format.
|
|
* unified: highlights clusters of changes in an inline format.
|
|
* html: generates side by side comparison with change highlights.
|
|
"""
|
|
from __future__ import print_function, division, absolute_import, unicode_literals
|
|
|
|
import sys
|
|
import os
|
|
import time
|
|
import difflib
|
|
import argparse
|
|
|
|
|
|
def abinit_line_junk(line):
|
|
return (
|
|
line.startswith('-')
|
|
or line.startswith('+')
|
|
or line.isspace()
|
|
)
|
|
|
|
|
|
def abinit_char_junk(c):
|
|
return c.isspace() or c.isdigit()
|
|
|
|
|
|
def main():
|
|
# Configure the option parser
|
|
parser = argparse.ArgumentParser()
|
|
|
|
parser.add_argument('-c', action='store_true', default=False,
|
|
help='Produce a context format diff (default)')
|
|
|
|
parser.add_argument('-u', action='store_true', default=False,
|
|
help='Produce a unified format diff')
|
|
|
|
hlp = 'Produce HTML side by side diff (can use -c and -l in conjunction)'
|
|
parser.add_argument('-m', action='store_true', default=False, help=hlp)
|
|
|
|
hlp = 'Produce HTML table of side by side diff (can use -c and -l in conjunction)'
|
|
parser.add_argument('-t', action='store_true', default=False, help=hlp)
|
|
|
|
parser.add_argument('-n', action='store_true', default=False,
|
|
help='Produce a ndiff format diff')
|
|
parser.add_argument('-l', '--lines', type=int, default=3,
|
|
help='Set number of context lines (default 3)')
|
|
|
|
parser.add_argument('-f', '--file', type=str, default='',
|
|
help='Write diff to file FILE. stdout is used if not specified', metavar='FILE')
|
|
|
|
parser.add_argument('-j', '--abinit-junk', action='store_true', default=False,
|
|
help='Use Abinit output specific heuristic instead of builtin heuristic to syncronise lines.')
|
|
|
|
parser.add_argument('fromfile', help='Reference file')
|
|
parser.add_argument('tofile', help='Compared file')
|
|
|
|
options = parser.parse_args()
|
|
|
|
n = options.lines
|
|
fromfile, tofile = options.fromfile, options.tofile
|
|
|
|
# we're passing these as arguments to the diff function
|
|
fromdate = time.ctime(os.stat(fromfile).st_mtime)
|
|
todate = time.ctime(os.stat(tofile).st_mtime)
|
|
fromlines = open(fromfile, "rt").readlines()
|
|
tolines = open(tofile, "rt").readlines()
|
|
|
|
if options.abinit_junk:
|
|
line_junk = abinit_line_junk
|
|
char_junk = abinit_char_junk
|
|
else:
|
|
line_junk = None
|
|
char_junk = None
|
|
|
|
if options.u:
|
|
diff = difflib.unified_diff(fromlines, tolines, fromfile, tofile,
|
|
fromdate, todate, n=n)
|
|
elif options.n:
|
|
diff = difflib.ndiff(fromlines, tolines, linejunk=line_junk,
|
|
charjunk=char_junk)
|
|
|
|
elif options.m:
|
|
diff = difflib.HtmlDiff(linejunk=line_junk, charjunk=char_junk).make_file(
|
|
fromlines, tolines, fromfile, tofile, context=options.c,
|
|
numlines=n
|
|
)
|
|
elif options.t:
|
|
diff = difflib.HtmlDiff(linejunk=line_junk, charjunk=char_junk).make_table(
|
|
fromlines, tolines, fromfile, tofile, context=options.c,
|
|
numlines=n
|
|
)
|
|
else:
|
|
diff = difflib.context_diff(fromlines, tolines, fromfile, tofile,
|
|
fromdate, todate, n=n)
|
|
|
|
# writelines because diff is a generator
|
|
if options.file:
|
|
with open(options.file, "w") as fh:
|
|
fh.writelines(diff)
|
|
else:
|
|
sys.stdout.writelines(diff)
|
|
|
|
sys.exit(0)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|