#! /usr/local/bin/python

# 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

import sys, os

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
	if not os.path.isdir(oldtree):
		print oldtree + ': not a directory'
		return 1
	try:
		os.mkdir(newtree, 0777)
	except os.error, msg:
		print newtree + ': cannot mkdir:', msg
		return 1
	linkname = os.path.join(newtree, link)
	try:
		os.symlink(os.path.join(os.pardir, oldtree), linkname)
	except os.error, msg:
		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:
		names = os.listdir(old)
	except os.error, msg:
		print old + ': warning: cannot listdir:', msg
		return
	for name in names:
	    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)
		if debug > 1: print oldname, newname, linkname
		if os.path.isdir(oldname) and not os.path.islink(oldname):
			try:
				os.mkdir(newname, 0777)
				ok = 1
			except:
				print newname + ': warning: cannot mkdir:', msg
				ok = 0
			if ok:
				linkname = os.path.join(os.pardir, linkname)
				linknames(oldname, newname, linkname)
		else:
			os.symlink(linkname, newname)

sys.exit(main())
