| 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())
|
|---|