| #! /usr/bin/env python | 
 |  | 
 | # mkreal | 
 | # | 
 | # turn a symlink to a directory into a real directory | 
 |  | 
 | import sys | 
 | import os | 
 | from stat import * | 
 |  | 
 | join = os.path.join | 
 |  | 
 | error = 'mkreal error' | 
 |  | 
 | BUFSIZE = 32*1024 | 
 |  | 
 | def mkrealfile(name): | 
 | 	st = os.stat(name) # Get the mode | 
 | 	mode = S_IMODE(st[ST_MODE]) | 
 | 	linkto = os.readlink(name) # Make sure again it's a symlink | 
 | 	f_in = open(name, 'r') # This ensures it's a file | 
 | 	os.unlink(name) | 
 | 	f_out = open(name, 'w') | 
 | 	while 1: | 
 | 		buf = f_in.read(BUFSIZE) | 
 | 		if not buf: break | 
 | 		f_out.write(buf) | 
 | 	del f_out # Flush data to disk before changing mode | 
 | 	os.chmod(name, mode) | 
 |  | 
 | def mkrealdir(name): | 
 | 	st = os.stat(name) # Get the mode | 
 | 	mode = S_IMODE(st[ST_MODE]) | 
 | 	linkto = os.readlink(name) | 
 | 	files = os.listdir(name) | 
 | 	os.unlink(name) | 
 | 	os.mkdir(name, mode) | 
 | 	os.chmod(name, mode) | 
 | 	linkto = join(os.pardir, linkto) | 
 | 	# | 
 | 	for file in files: | 
 | 		if file not in (os.curdir, os.pardir): | 
 | 			os.symlink(join(linkto, file), join(name, file)) | 
 |  | 
 | def main(): | 
 | 	sys.stdout = sys.stderr | 
 | 	progname = os.path.basename(sys.argv[0]) | 
 | 	if progname == '-c': progname = 'mkreal' | 
 | 	args = sys.argv[1:] | 
 | 	if not args: | 
 | 		print 'usage:', progname, 'path ...' | 
 | 		sys.exit(2) | 
 | 	status = 0 | 
 | 	for name in args: | 
 | 		if not os.path.islink(name): | 
 | 			print progname+':', name+':', 'not a symlink' | 
 | 			status = 1 | 
 | 		else: | 
 | 			if os.path.isdir(name): | 
 | 				mkrealdir(name) | 
 | 			else: | 
 | 				mkrealfile(name) | 
 | 	sys.exit(status) | 
 |  | 
 | main() |