Mercurial > cpython-lru_cache-weakref
annotate Tools/scripts/diff.py @ 82004:b414b2dfd3d3 3.3
merge #17091: update docstring for _thread.Lock.acquire.
| author | R David Murray <rdmurray@bitdance.com> |
|---|---|
| date | Mon, 04 Feb 2013 10:22:39 -0500 |
| parents | ec95b94ea831 |
| children | 70bd6f7e013b |
| 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) |
|
ec95b94ea831
Issue #7582: Use ISO timestamp in diff.py
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
71557
diff
changeset
|
41 with open(fromfile, 'U') as ff: |
|
ec95b94ea831
Issue #7582: Use ISO timestamp in diff.py
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
71557
diff
changeset
|
42 fromlines = ff.readlines() |
|
ec95b94ea831
Issue #7582: Use ISO timestamp in diff.py
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
71557
diff
changeset
|
43 with open(tofile, 'U') as tf: |
|
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() |
