1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
#!/usr/bin/env python
"""
Simple driver around python's difflib that implements a basic ``diff`` like
tool. This exists to provide a simple ``diff`` like tool that will run on
Windows where only the ``fc`` tool is available.
"""
import argparse
import difflib
import os
import sys
def main(args):
parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter,
description=__doc__
)
# Open in binary mode so python doesn't try and do
# universal line endings for us.
parser.add_argument('from-file',
type=argparse.FileType('rb'),
)
parser.add_argument('to-file',
type=argparse.FileType('rb'),
)
parser.add_argument('-U','--unified=',
type=int,
default=3,
help='Number of context lines to show. '
'Default %(default)s'
)
parser.add_argument('--strip-trailing-cr',
action='store_true',
help='strip trailing carriage return when comparing'
)
parser.add_argument('--ignore-all-space','-w',
action='store_true',
help='Ignore all whitespace characters when comparing'
)
parsedArgs = parser.parse_args(args)
fromFile, fromFileName = preProcess(getattr(parsedArgs,'from-file'),
parsedArgs.strip_trailing_cr,
parsedArgs.ignore_all_space
)
toFile, toFileName = preProcess(getattr(parsedArgs,'to-file'),
parsedArgs.strip_trailing_cr,
parsedArgs.ignore_all_space
)
result = difflib.unified_diff(fromFile,
toFile,
fromFileName,
toFileName,
n=getattr(parsedArgs,'unified='),
)
# Force lazy computation to happen now
result = list(result)
if len(result) == 0:
# Files are identical
return 0
else:
for l in result:
sys.stdout.write(l)
return 1
def preProcess(openFile, stripTrailingCR=False, ignoreAllSpace=False):
"""
Helper function to read lines in a file and do any necessary
pre-processing
"""
original = openFile.readlines()
# Translation table deletes white space characters Note we don't remove
# newline characters because this will create a mess when outputting the
# diff. Is this the right behaviour?
deleteChars=' \t'
translationTable = str.maketrans('','', deleteChars)
copy = [ ]
for line in original:
newLine = str(line.decode())
if stripTrailingCR:
if newLine[-2:] == '\r\n' or newLine[-2:] == '\n\r':
newLine = newLine[:-2] + '\n'
if ignoreAllSpace:
newLine = newLine.translate(translationTable)
copy.append(newLine)
return (copy, openFile.name)
def getFileName(openFile):
return openFile.name
if __name__ == '__main__':
sys.exit(main(sys.argv[1:]))
|