annotate Tools/scripts/ndiff.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
59522
fcfe324663a6 convert shebang lines: python -> python3
Benjamin Peterson <benjamin@python.org>
parents: 42427
diff changeset
1 #! /usr/bin/env python3
8228
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
19200
50fb4683a461 SF patch #445412 extract ndiff functionality to difflib, from
Tim Peters <tim.peters@gmail.com>
parents: 16551
diff changeset
3 # Module ndiff version 1.7.0
15497
f3bf5f082a3f SF bug 124051: ndiff "?" lines can be confusing. Well, they still can, but
Tim Peters <tim.peters@gmail.com>
parents: 15367
diff changeset
4 # Released to the public domain 08-Dec-2000,
f3bf5f082a3f SF bug 124051: ndiff "?" lines can be confusing. Well, they still can, but
Tim Peters <tim.peters@gmail.com>
parents: 15367
diff changeset
5 # by Tim Peters (tim.one@home.com).
10486
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
6
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
7 # Provided as-is; use at your own risk; no warranty; no promises; enjoy!
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
8
19200
50fb4683a461 SF patch #445412 extract ndiff functionality to difflib, from
Tim Peters <tim.peters@gmail.com>
parents: 16551
diff changeset
9 # ndiff.py is now simply a front-end to the difflib.ndiff() function.
50fb4683a461 SF patch #445412 extract ndiff functionality to difflib, from
Tim Peters <tim.peters@gmail.com>
parents: 16551
diff changeset
10 # Originally, it contained the difflib.SequenceMatcher class as well.
50fb4683a461 SF patch #445412 extract ndiff functionality to difflib, from
Tim Peters <tim.peters@gmail.com>
parents: 16551
diff changeset
11 # This completes the raiding of reusable code from this formerly
50fb4683a461 SF patch #445412 extract ndiff functionality to difflib, from
Tim Peters <tim.peters@gmail.com>
parents: 16551
diff changeset
12 # self-contained script.
50fb4683a461 SF patch #445412 extract ndiff functionality to difflib, from
Tim Peters <tim.peters@gmail.com>
parents: 16551
diff changeset
13
10486
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
14 """ndiff [-q] file1 file2
10487
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
15 or
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
16 ndiff (-r1 | -r2) < ndiff_output > file1_or_file2
10486
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
17
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
18 Print a human-friendly file difference report to stdout. Both inter-
10487
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
19 and intra-line differences are noted. In the second form, recreate file1
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
20 (-r1) or file2 (-r2) on stdout, from an ndiff report on stdin.
10486
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
21
10487
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
22 In the first form, if -q ("quiet") is not specified, the first two lines
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
23 of output are
10486
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
24
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
25 -: file1
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
26 +: file2
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
27
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
28 Each remaining line begins with a two-letter code:
8228
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
29
10486
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
30 "- " line unique to file1
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
31 "+ " line unique to file2
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
32 " " line common to both files
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
33 "? " line not present in either input file
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
34
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
35 Lines beginning with "? " attempt to guide the eye to intraline
15367
8275d8643e79 Hack ndiff to display lines w/ leading tabs more intuitively. This synchs
Tim Peters <tim.peters@gmail.com>
parents: 10487
diff changeset
36 differences, and were not present in either input file. These lines can be
8275d8643e79 Hack ndiff to display lines w/ leading tabs more intuitively. This synchs
Tim Peters <tim.peters@gmail.com>
parents: 10487
diff changeset
37 confusing if the source files contain tab characters.
10486
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
38
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
39 The first file can be recovered by retaining only lines that begin with
10487
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
40 " " or "- ", and deleting those 2-character prefixes; use ndiff with -r1.
8228
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
41
15367
8275d8643e79 Hack ndiff to display lines w/ leading tabs more intuitively. This synchs
Tim Peters <tim.peters@gmail.com>
parents: 10487
diff changeset
42 The second file can be recovered similarly, but by retaining only " " and
8275d8643e79 Hack ndiff to display lines w/ leading tabs more intuitively. This synchs
Tim Peters <tim.peters@gmail.com>
parents: 10487
diff changeset
43 "+ " lines; use ndiff with -r2; or, on Unix, the second file can be
10487
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
44 recovered by piping the output through
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
45
10486
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
46 sed -n '/^[+ ] /s/^..//p'
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
47 """
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
48
19200
50fb4683a461 SF patch #445412 extract ndiff functionality to difflib, from
Tim Peters <tim.peters@gmail.com>
parents: 16551
diff changeset
49 __version__ = 1, 7, 0
8228
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
50
19200
50fb4683a461 SF patch #445412 extract ndiff functionality to difflib, from
Tim Peters <tim.peters@gmail.com>
parents: 16551
diff changeset
51 import difflib, sys
15367
8275d8643e79 Hack ndiff to display lines w/ leading tabs more intuitively. This synchs
Tim Peters <tim.peters@gmail.com>
parents: 10487
diff changeset
52
10487
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
53 def fail(msg):
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
54 out = sys.stderr.write
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
55 out(msg + "\n\n")
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
56 out(__doc__)
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
57 return 0
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
58
8228
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 # open a file & return the file object; gripe and return 0 if it
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 # couldn't be opened
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 def fopen(fname):
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 try:
87448
70bd6f7e013b Issue #15204: Deprecated the 'U' mode in file-like objects.
Serhiy Storchaka <storchaka@gmail.com>
parents: 59522
diff changeset
63 return open(fname)
40587
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 33666
diff changeset
64 except IOError as detail:
10487
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
65 return fail("couldn't open " + fname + ": " + str(detail))
8228
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
66
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 # open two files & spray the diff to stdout; return false iff a problem
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 def fcompare(f1name, f2name):
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 f1 = fopen(f1name)
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 f2 = fopen(f2name)
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 if not f1 or not f2:
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 return 0
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
73
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 a = f1.readlines(); f1.close()
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 b = f2.readlines(); f2.close()
20038
8a6f2ee6eaba Make difflib.ndiff() and difflib.Differ.compare() generators. This
Tim Peters <tim.peters@gmail.com>
parents: 19200
diff changeset
76 for line in difflib.ndiff(a, b):
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 40587
diff changeset
77 print(line, end=' ')
8228
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
78
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 return 1
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
80
10486
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
81 # crack args (sys.argv[1:] is normal) & compare;
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
82 # return false iff a problem
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
83
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
84 def main(args):
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
85 import getopt
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
86 try:
10487
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
87 opts, args = getopt.getopt(args, "qr:")
40587
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 33666
diff changeset
88 except getopt.error as detail:
10487
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
89 return fail(str(detail))
10486
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
90 noisy = 1
10487
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
91 qseen = rseen = 0
10486
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
92 for opt, val in opts:
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
93 if opt == "-q":
10487
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
94 qseen = 1
10486
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
95 noisy = 0
10487
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
96 elif opt == "-r":
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
97 rseen = 1
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
98 whichfile = val
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
99 if qseen and rseen:
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
100 return fail("can't specify both -q and -r")
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
101 if rseen:
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
102 if args:
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
103 return fail("no args allowed with -r option")
29105
19c414186b9e Prevent script from allowing '-r12'
Andrew M. Kuchling <amk@amk.ca>
parents: 20045
diff changeset
104 if whichfile in ("1", "2"):
10487
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
105 restore(whichfile)
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
106 return 1
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
107 return fail("-r value must be 1 or 2")
10486
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
108 if len(args) != 2:
10487
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
109 return fail("need 2 filename args")
10486
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
110 f1name, f2name = args
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
111 if noisy:
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 40587
diff changeset
112 print('-:', f1name)
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 40587
diff changeset
113 print('+:', f2name)
8228
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 return fcompare(f1name, f2name)
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
115
19200
50fb4683a461 SF patch #445412 extract ndiff functionality to difflib, from
Tim Peters <tim.peters@gmail.com>
parents: 16551
diff changeset
116 # read ndiff output from stdin, and print file1 (which=='1') or
50fb4683a461 SF patch #445412 extract ndiff functionality to difflib, from
Tim Peters <tim.peters@gmail.com>
parents: 16551
diff changeset
117 # file2 (which=='2') to stdout
50fb4683a461 SF patch #445412 extract ndiff functionality to difflib, from
Tim Peters <tim.peters@gmail.com>
parents: 16551
diff changeset
118
10487
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
119 def restore(which):
19200
50fb4683a461 SF patch #445412 extract ndiff functionality to difflib, from
Tim Peters <tim.peters@gmail.com>
parents: 16551
diff changeset
120 restored = difflib.restore(sys.stdin.readlines(), which)
20045
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20039
diff changeset
121 sys.stdout.writelines(restored)
10487
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
122
8228
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 if __name__ == '__main__':
10486
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
124 args = sys.argv[1:]
10487
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
125 if "-profile" in args:
8228
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
126 import profile, pstats
10487
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
127 args.remove("-profile")
8228
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
128 statf = "ndiff.pro"
10486
30c94cd49a68 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 8285
diff changeset
129 profile.run("main(args)", statf)
8228
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 stats = pstats.Stats(statf)
9d642a735a13 Adding Tim Peters' ndiff utility.
Guido van Rossum <guido@python.org>
parents:
diff changeset
131 stats.strip_dirs().sort_stats('time').print_stats()
10487
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
132 else:
05e97f6a3638 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 10486
diff changeset
133 main(args)