1 | #! /usr/bin/env python
|
---|
2 |
|
---|
3 | # linktree
|
---|
4 | #
|
---|
5 | # Make a copy of a directory tree with symbolic links to all files in the
|
---|
6 | # original tree.
|
---|
7 | # All symbolic links go to a special symbolic link at the top, so you
|
---|
8 | # can easily fix things if the original source tree moves.
|
---|
9 | # See also "mkreal".
|
---|
10 | #
|
---|
11 | # usage: mklinks oldtree newtree
|
---|
12 |
|
---|
13 | import sys, os
|
---|
14 |
|
---|
15 | LINK = '.LINK' # Name of special symlink at the top.
|
---|
16 |
|
---|
17 | debug = 0
|
---|
18 |
|
---|
19 | def main():
|
---|
20 | if not 3 <= len(sys.argv) <= 4:
|
---|
21 | print 'usage:', sys.argv[0], 'oldtree newtree [linkto]'
|
---|
22 | return 2
|
---|
23 | oldtree, newtree = sys.argv[1], sys.argv[2]
|
---|
24 | if len(sys.argv) > 3:
|
---|
25 | link = sys.argv[3]
|
---|
26 | link_may_fail = 1
|
---|
27 | else:
|
---|
28 | link = LINK
|
---|
29 | link_may_fail = 0
|
---|
30 | if not os.path.isdir(oldtree):
|
---|
31 | print oldtree + ': not a directory'
|
---|
32 | return 1
|
---|
33 | try:
|
---|
34 | os.mkdir(newtree, 0777)
|
---|
35 | except os.error, msg:
|
---|
36 | print newtree + ': cannot mkdir:', msg
|
---|
37 | return 1
|
---|
38 | linkname = os.path.join(newtree, link)
|
---|
39 | try:
|
---|
40 | os.symlink(os.path.join(os.pardir, oldtree), linkname)
|
---|
41 | except os.error, msg:
|
---|
42 | if not link_may_fail:
|
---|
43 | print linkname + ': cannot symlink:', msg
|
---|
44 | return 1
|
---|
45 | else:
|
---|
46 | print linkname + ': warning: cannot symlink:', msg
|
---|
47 | linknames(oldtree, newtree, link)
|
---|
48 | return 0
|
---|
49 |
|
---|
50 | def linknames(old, new, link):
|
---|
51 | if debug: print 'linknames', (old, new, link)
|
---|
52 | try:
|
---|
53 | names = os.listdir(old)
|
---|
54 | except os.error, msg:
|
---|
55 | print old + ': warning: cannot listdir:', msg
|
---|
56 | return
|
---|
57 | for name in names:
|
---|
58 | if name not in (os.curdir, os.pardir):
|
---|
59 | oldname = os.path.join(old, name)
|
---|
60 | linkname = os.path.join(link, name)
|
---|
61 | newname = os.path.join(new, name)
|
---|
62 | if debug > 1: print oldname, newname, linkname
|
---|
63 | if os.path.isdir(oldname) and \
|
---|
64 | not os.path.islink(oldname):
|
---|
65 | try:
|
---|
66 | os.mkdir(newname, 0777)
|
---|
67 | ok = 1
|
---|
68 | except:
|
---|
69 | print newname + \
|
---|
70 | ': warning: cannot mkdir:', msg
|
---|
71 | ok = 0
|
---|
72 | if ok:
|
---|
73 | linkname = os.path.join(os.pardir,
|
---|
74 | linkname)
|
---|
75 | linknames(oldname, newname, linkname)
|
---|
76 | else:
|
---|
77 | os.symlink(linkname, newname)
|
---|
78 |
|
---|
79 | if __name__ == '__main__':
|
---|
80 | sys.exit(main())
|
---|