annotate Tools/scripts/linktree.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 6cfe2982de42
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
687
e15bea971a5b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
e15bea971a5b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 # linktree
e15bea971a5b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 #
e15bea971a5b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 # Make a copy of a directory tree with symbolic links to all files in the
e15bea971a5b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 # original tree.
e15bea971a5b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 # All symbolic links go to a special symbolic link at the top, so you
e15bea971a5b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 # can easily fix things if the original source tree moves.
e15bea971a5b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 # See also "mkreal".
e15bea971a5b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 #
e15bea971a5b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 # usage: mklinks oldtree newtree
e15bea971a5b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12
755
2dd5dbf28a2d change posix to os
Guido van Rossum <guido@python.org>
parents: 687
diff changeset
13 import sys, os
687
e15bea971a5b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
14
e15bea971a5b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 LINK = '.LINK' # Name of special symlink at the top.
e15bea971a5b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16
e15bea971a5b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 debug = 0
e15bea971a5b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
18
e15bea971a5b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 def main():
15930
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
20 if not 3 <= len(sys.argv) <= 4:
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 42084
diff changeset
21 print('usage:', sys.argv[0], 'oldtree newtree [linkto]')
15930
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
22 return 2
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
23 oldtree, newtree = sys.argv[1], sys.argv[2]
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
24 if len(sys.argv) > 3:
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
25 link = sys.argv[3]
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
26 link_may_fail = 1
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
27 else:
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
28 link = LINK
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
29 link_may_fail = 0
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
30 if not os.path.isdir(oldtree):
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 42084
diff changeset
31 print(oldtree + ': not a directory')
15930
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
32 return 1
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
33 try:
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
34 os.mkdir(newtree, 0o777)
81017
6cfe2982de42 Use OESeeror instead of os.error (#16720)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 59522
diff changeset
35 except OSError as msg:
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 42084
diff changeset
36 print(newtree + ': cannot mkdir:', msg)
15930
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
37 return 1
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
38 linkname = os.path.join(newtree, link)
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
39 try:
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
40 os.symlink(os.path.join(os.pardir, oldtree), linkname)
81017
6cfe2982de42 Use OESeeror instead of os.error (#16720)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 59522
diff changeset
41 except OSError as msg:
15930
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
42 if not link_may_fail:
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 42084
diff changeset
43 print(linkname + ': cannot symlink:', msg)
15930
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
44 return 1
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
45 else:
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 42084
diff changeset
46 print(linkname + ': warning: cannot symlink:', msg)
15930
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
47 linknames(oldtree, newtree, link)
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
48 return 0
687
e15bea971a5b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49
e15bea971a5b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 def linknames(old, new, link):
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 42084
diff changeset
51 if debug: print('linknames', (old, new, link))
15930
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
52 try:
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
53 names = os.listdir(old)
81017
6cfe2982de42 Use OESeeror instead of os.error (#16720)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 59522
diff changeset
54 except OSError as msg:
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 42084
diff changeset
55 print(old + ': warning: cannot listdir:', msg)
15930
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
56 return
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
57 for name in names:
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
58 if name not in (os.curdir, os.pardir):
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
59 oldname = os.path.join(old, name)
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
60 linkname = os.path.join(link, name)
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
61 newname = os.path.join(new, name)
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 42084
diff changeset
62 if debug > 1: print(oldname, newname, linkname)
15930
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
63 if os.path.isdir(oldname) and \
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
64 not os.path.islink(oldname):
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
65 try:
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
66 os.mkdir(newname, 0o777)
15930
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
67 ok = 1
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
68 except:
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 42084
diff changeset
69 print(newname + \
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 42084
diff changeset
70 ': warning: cannot mkdir:', msg)
15930
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
71 ok = 0
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
72 if ok:
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
73 linkname = os.path.join(os.pardir,
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
74 linkname)
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
75 linknames(oldname, newname, linkname)
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
76 else:
14a27acc755a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 7735
diff changeset
77 os.symlink(linkname, newname)
687
e15bea971a5b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
78
33074
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 15930
diff changeset
79 if __name__ == '__main__':
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 15930
diff changeset
80 sys.exit(main())