annotate Tools/scripts/diff.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 70bd6f7e013b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
71557
65d5ecefd50d Fix missing or wrong shebangs and missing executable bits for scripts (#10318)
Éric Araujo <merwok@netwok.org>
parents: 33666
diff changeset
1 #!/usr/bin/env python3
33319
6d3bdd19beeb Patch #914575: difflib side by side diff support, diff.py s/b/s HTML option.
Martin v. Löwis <martin@v.loewis.de>
parents: 33074
diff changeset
2 """ Command line interface to difflib.py providing diffs in four formats:
29386
cd5ecc5b38eb Added a command line interface for difflib.py
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3
cd5ecc5b38eb Added a command line interface for difflib.py
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4 * ndiff: lists every line and highlights interline changes.
33319
6d3bdd19beeb Patch #914575: difflib side by side diff support, diff.py s/b/s HTML option.
Martin v. Löwis <martin@v.loewis.de>
parents: 33074
diff changeset
5 * context: highlights clusters of changes in a before/after format.
29386
cd5ecc5b38eb Added a command line interface for difflib.py
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
6 * unified: highlights clusters of changes in an inline format.
33319
6d3bdd19beeb Patch #914575: difflib side by side diff support, diff.py s/b/s HTML option.
Martin v. Löwis <martin@v.loewis.de>
parents: 33074
diff changeset
7 * html: generates side by side comparison with change highlights.
29386
cd5ecc5b38eb Added a command line interface for difflib.py
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
8
cd5ecc5b38eb Added a command line interface for difflib.py
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
9 """
cd5ecc5b38eb Added a command line interface for difflib.py
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
10
cd5ecc5b38eb Added a command line interface for difflib.py
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
11 import sys, os, time, difflib, optparse
77572
ec95b94ea831 Issue #7582: Use ISO timestamp in diff.py
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 71557
diff changeset
12 from datetime import datetime, timezone
ec95b94ea831 Issue #7582: Use ISO timestamp in diff.py
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 71557
diff changeset
13
ec95b94ea831 Issue #7582: Use ISO timestamp in diff.py
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 71557
diff changeset
14 def file_mtime(path):
ec95b94ea831 Issue #7582: Use ISO timestamp in diff.py
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 71557
diff changeset
15 t = datetime.fromtimestamp(os.stat(path).st_mtime,
ec95b94ea831 Issue #7582: Use ISO timestamp in diff.py
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 71557
diff changeset
16 timezone.utc)
ec95b94ea831 Issue #7582: Use ISO timestamp in diff.py
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 71557
diff changeset
17 return t.astimezone().isoformat()
29386
cd5ecc5b38eb Added a command line interface for difflib.py
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
18
33074
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
19 def main():
29386
cd5ecc5b38eb Added a command line interface for difflib.py
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
20
33074
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
21 usage = "usage: %prog [options] fromfile tofile"
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
22 parser = optparse.OptionParser(usage)
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
23 parser.add_option("-c", action="store_true", default=False, help='Produce a context format diff (default)')
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
24 parser.add_option("-u", action="store_true", default=False, help='Produce a unified format diff')
33319
6d3bdd19beeb Patch #914575: difflib side by side diff support, diff.py s/b/s HTML option.
Martin v. Löwis <martin@v.loewis.de>
parents: 33074
diff changeset
25 parser.add_option("-m", action="store_true", default=False, help='Produce HTML side by side diff (can use -c and -l in conjunction)')
33074
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
26 parser.add_option("-n", action="store_true", default=False, help='Produce a ndiff format diff')
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
27 parser.add_option("-l", "--lines", type="int", default=3, help='Set number of context lines (default 3)')
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
28 (options, args) = parser.parse_args()
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
29
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
30 if len(args) == 0:
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
31 parser.print_help()
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
32 sys.exit(1)
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
33 if len(args) != 2:
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
34 parser.error("need to specify both a fromfile and tofile")
29386
cd5ecc5b38eb Added a command line interface for difflib.py
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
35
33074
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
36 n = options.lines
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
37 fromfile, tofile = args
29386
cd5ecc5b38eb Added a command line interface for difflib.py
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
38
77572
ec95b94ea831 Issue #7582: Use ISO timestamp in diff.py
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 71557
diff changeset
39 fromdate = file_mtime(fromfile)
ec95b94ea831 Issue #7582: Use ISO timestamp in diff.py
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 71557
diff changeset
40 todate = file_mtime(tofile)
87448
70bd6f7e013b Issue #15204: Deprecated the 'U' mode in file-like objects.
Serhiy Storchaka <storchaka@gmail.com>
parents: 77572
diff changeset
41 with open(fromfile) as ff:
77572
ec95b94ea831 Issue #7582: Use ISO timestamp in diff.py
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 71557
diff changeset
42 fromlines = ff.readlines()
87448
70bd6f7e013b Issue #15204: Deprecated the 'U' mode in file-like objects.
Serhiy Storchaka <storchaka@gmail.com>
parents: 77572
diff changeset
43 with open(tofile) as tf:
77572
ec95b94ea831 Issue #7582: Use ISO timestamp in diff.py
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 71557
diff changeset
44 tolines = tf.readlines()
29386
cd5ecc5b38eb Added a command line interface for difflib.py
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
45
33074
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
46 if options.u:
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
47 diff = difflib.unified_diff(fromlines, tolines, fromfile, tofile, fromdate, todate, n=n)
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
48 elif options.n:
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
49 diff = difflib.ndiff(fromlines, tolines)
33319
6d3bdd19beeb Patch #914575: difflib side by side diff support, diff.py s/b/s HTML option.
Martin v. Löwis <martin@v.loewis.de>
parents: 33074
diff changeset
50 elif options.m:
6d3bdd19beeb Patch #914575: difflib side by side diff support, diff.py s/b/s HTML option.
Martin v. Löwis <martin@v.loewis.de>
parents: 33074
diff changeset
51 diff = difflib.HtmlDiff().make_file(fromlines,tolines,fromfile,tofile,context=options.c,numlines=n)
33074
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
52 else:
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
53 diff = difflib.context_diff(fromlines, tolines, fromfile, tofile, fromdate, todate, n=n)
29386
cd5ecc5b38eb Added a command line interface for difflib.py
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
54
33074
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
55 sys.stdout.writelines(diff)
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
56
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
57 if __name__ == '__main__':
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 32538
diff changeset
58 main()