linktree.py 1.87 KB
Newer Older
1
#! /usr/bin/env python
Guido van Rossum's avatar
Guido van Rossum committed
2 3 4 5 6 7 8 9 10 11 12

# linktree
#
# Make a copy of a directory tree with symbolic links to all files in the
# original tree.
# All symbolic links go to a special symbolic link at the top, so you
# can easily fix things if the original source tree moves.
# See also "mkreal".
#
# usage: mklinks oldtree newtree

Guido van Rossum's avatar
Guido van Rossum committed
13
import sys, os
Guido van Rossum's avatar
Guido van Rossum committed
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

LINK = '.LINK' # Name of special symlink at the top.

debug = 0

def main():
	if not 3 <= len(sys.argv) <= 4:
		print 'usage:', sys.argv[0], 'oldtree newtree [linkto]'
		return 2
	oldtree, newtree = sys.argv[1], sys.argv[2]
	if len(sys.argv) > 3:
		link = sys.argv[3]
		link_may_fail = 1
	else:
		link = LINK
		link_may_fail = 0
Guido van Rossum's avatar
Guido van Rossum committed
30
	if not os.path.isdir(oldtree):
Guido van Rossum's avatar
Guido van Rossum committed
31 32 33
		print oldtree + ': not a directory'
		return 1
	try:
Guido van Rossum's avatar
Guido van Rossum committed
34 35
		os.mkdir(newtree, 0777)
	except os.error, msg:
Guido van Rossum's avatar
Guido van Rossum committed
36 37
		print newtree + ': cannot mkdir:', msg
		return 1
Guido van Rossum's avatar
Guido van Rossum committed
38
	linkname = os.path.join(newtree, link)
Guido van Rossum's avatar
Guido van Rossum committed
39
	try:
Guido van Rossum's avatar
Guido van Rossum committed
40 41
		os.symlink(os.path.join(os.pardir, oldtree), linkname)
	except os.error, msg:
Guido van Rossum's avatar
Guido van Rossum committed
42 43 44 45 46 47 48 49 50 51 52
		if not link_may_fail:
			print linkname + ': cannot symlink:', msg
			return 1
		else:
			print linkname + ': warning: cannot symlink:', msg
	linknames(oldtree, newtree, link)
	return 0

def linknames(old, new, link):
	if debug: print 'linknames', (old, new, link)
	try:
Guido van Rossum's avatar
Guido van Rossum committed
53 54
		names = os.listdir(old)
	except os.error, msg:
Guido van Rossum's avatar
Guido van Rossum committed
55 56 57
		print old + ': warning: cannot listdir:', msg
		return
	for name in names:
Guido van Rossum's avatar
Guido van Rossum committed
58 59 60 61
	    if name not in (os.curdir, os.pardir):
		oldname = os.path.join(old, name)
		linkname = os.path.join(link, name)
		newname = os.path.join(new, name)
Guido van Rossum's avatar
Guido van Rossum committed
62
		if debug > 1: print oldname, newname, linkname
Guido van Rossum's avatar
Guido van Rossum committed
63
		if os.path.isdir(oldname) and not os.path.islink(oldname):
Guido van Rossum's avatar
Guido van Rossum committed
64
			try:
Guido van Rossum's avatar
Guido van Rossum committed
65
				os.mkdir(newname, 0777)
Guido van Rossum's avatar
Guido van Rossum committed
66 67 68 69 70
				ok = 1
			except:
				print newname + ': warning: cannot mkdir:', msg
				ok = 0
			if ok:
Guido van Rossum's avatar
Guido van Rossum committed
71
				linkname = os.path.join(os.pardir, linkname)
Guido van Rossum's avatar
Guido van Rossum committed
72 73
				linknames(oldname, newname, linkname)
		else:
Guido van Rossum's avatar
Guido van Rossum committed
74
			os.symlink(linkname, newname)
Guido van Rossum's avatar
Guido van Rossum committed
75 76

sys.exit(main())