Benjamin Peterson | 90f5ba5 | 2010-03-11 22:53:45 +0000 | [diff] [blame] | 1 | #! /usr/bin/env python3 |
Guido van Rossum | 2ba9f30 | 1992-03-02 16:20:32 +0000 | [diff] [blame] | 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 | |
Guido van Rossum | e7b88e7 | 1992-03-30 11:13:59 +0000 | [diff] [blame] | 13 | import sys, os |
Guido van Rossum | 2ba9f30 | 1992-03-02 16:20:32 +0000 | [diff] [blame] | 14 | |
| 15 | LINK = '.LINK' # Name of special symlink at the top. |
| 16 | |
| 17 | debug = 0 |
| 18 | |
| 19 | def main(): |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 20 | if not 3 <= len(sys.argv) <= 4: |
Collin Winter | 6afaeb7 | 2007-08-03 17:06:41 +0000 | [diff] [blame] | 21 | print('usage:', sys.argv[0], 'oldtree newtree [linkto]') |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 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): |
Collin Winter | 6afaeb7 | 2007-08-03 17:06:41 +0000 | [diff] [blame] | 31 | print(oldtree + ': not a directory') |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 32 | return 1 |
| 33 | try: |
Guido van Rossum | cd16bf6 | 2007-06-13 18:07:49 +0000 | [diff] [blame] | 34 | os.mkdir(newtree, 0o777) |
Andrew Svetlov | 8b33dd8 | 2012-12-24 19:58:48 +0200 | [diff] [blame] | 35 | except OSError as msg: |
Collin Winter | 6afaeb7 | 2007-08-03 17:06:41 +0000 | [diff] [blame] | 36 | print(newtree + ': cannot mkdir:', msg) |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 37 | return 1 |
| 38 | linkname = os.path.join(newtree, link) |
| 39 | try: |
| 40 | os.symlink(os.path.join(os.pardir, oldtree), linkname) |
Andrew Svetlov | 8b33dd8 | 2012-12-24 19:58:48 +0200 | [diff] [blame] | 41 | except OSError as msg: |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 42 | if not link_may_fail: |
Collin Winter | 6afaeb7 | 2007-08-03 17:06:41 +0000 | [diff] [blame] | 43 | print(linkname + ': cannot symlink:', msg) |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 44 | return 1 |
| 45 | else: |
Collin Winter | 6afaeb7 | 2007-08-03 17:06:41 +0000 | [diff] [blame] | 46 | print(linkname + ': warning: cannot symlink:', msg) |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 47 | linknames(oldtree, newtree, link) |
| 48 | return 0 |
Guido van Rossum | 2ba9f30 | 1992-03-02 16:20:32 +0000 | [diff] [blame] | 49 | |
| 50 | def linknames(old, new, link): |
Collin Winter | 6afaeb7 | 2007-08-03 17:06:41 +0000 | [diff] [blame] | 51 | if debug: print('linknames', (old, new, link)) |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 52 | try: |
| 53 | names = os.listdir(old) |
Andrew Svetlov | 8b33dd8 | 2012-12-24 19:58:48 +0200 | [diff] [blame] | 54 | except OSError as msg: |
Collin Winter | 6afaeb7 | 2007-08-03 17:06:41 +0000 | [diff] [blame] | 55 | print(old + ': warning: cannot listdir:', msg) |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 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) |
Collin Winter | 6afaeb7 | 2007-08-03 17:06:41 +0000 | [diff] [blame] | 62 | if debug > 1: print(oldname, newname, linkname) |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 63 | if os.path.isdir(oldname) and \ |
| 64 | not os.path.islink(oldname): |
| 65 | try: |
Guido van Rossum | cd16bf6 | 2007-06-13 18:07:49 +0000 | [diff] [blame] | 66 | os.mkdir(newname, 0o777) |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 67 | ok = 1 |
| 68 | except: |
Collin Winter | 6afaeb7 | 2007-08-03 17:06:41 +0000 | [diff] [blame] | 69 | print(newname + \ |
| 70 | ': warning: cannot mkdir:', msg) |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 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) |
Guido van Rossum | 2ba9f30 | 1992-03-02 16:20:32 +0000 | [diff] [blame] | 78 | |
Andrew M. Kuchling | e236b38 | 2004-08-09 17:27:55 +0000 | [diff] [blame] | 79 | if __name__ == '__main__': |
| 80 | sys.exit(main()) |