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