mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			156 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #
 | |
| # binhextree - Recursively descend a directory and
 | |
| # pack all resource files.
 | |
| #
 | |
| # Jack Jansen, CWI, August 1995.
 | |
| #
 | |
| # To do:
 | |
| # - Also do project files (.µ and .º), after using AppleEvents to the
 | |
| #   various builders to clean the projects
 | |
| # - Don't hexbin (and clean) if there exists a .hqx file that is newer.
 | |
| #
 | |
| 
 | |
| import os
 | |
| import binhex
 | |
| import sys
 | |
| import macostools
 | |
| import macfs
 | |
| 
 | |
| import addpack
 | |
| addpack.addpack('Tools')
 | |
| addpack.addpack('bgen')
 | |
| addpack.addpack('AE')
 | |
| import aetools
 | |
| from Metrowerks_Shell_Suite import Metrowerks_Shell_Suite
 | |
| from Required_Suite import Required_Suite 
 | |
| 
 | |
| class MwShell(aetools.TalkTo, Metrowerks_Shell_Suite, Required_Suite):
 | |
| 	pass
 | |
| 
 | |
| # Top-level directory
 | |
| TOP=''
 | |
| 
 | |
| # Where to put CW projects, relative to TOP
 | |
| CWDIR=':Mac:mwerks:projects'
 | |
| 
 | |
| # Helper routines
 | |
| def binhexit(path, name):
 | |
| 	dstfile = path + '.hqx'
 | |
| 	if os.path.exists(dstfile) and \
 | |
| 			os.stat(dstfile)[8] > os.stat(path)[8]:
 | |
| 		print 'Skip', path,'- Up-to-date'
 | |
| 		return
 | |
| 	print 'Binhexing', path
 | |
| 	binhex.binhex(path, dstfile)
 | |
| 	
 | |
| # Project files to handle
 | |
| project_files = {}
 | |
| 
 | |
| def hexbincwprojects(creator):
 | |
| 	"""Compact and hexbin all files remembered with a given creator"""
 | |
| 	print 'Please start project mgr with signature', creator,'-'
 | |
| 	sys.stdin.readline()
 | |
| 	try:
 | |
| 		mgr = MwShell(creator)
 | |
| 	except 'foo':
 | |
| 		print 'Not handled:', creator
 | |
| 		return
 | |
| 	for fss in project_files[creator]:
 | |
| 		srcfile = fss.as_pathname()
 | |
| 		
 | |
| 		if srcfile[-1] == 'µ':
 | |
| 			dstfile = srcfile[:-1]+'mu.hqx'
 | |
| 		elif ord(srcfile[-1]) >= 128:
 | |
| 			dstfile = srcfile[:-1]+`ord(srcfile[-1])`+'.hqx'
 | |
| 		else:
 | |
| 			dstfile = srcfile + '.hqx'
 | |
| 			
 | |
| 		if os.path.exists(dstfile) and \
 | |
| 				os.stat(dstfile)[8] > os.stat(srcfile)[8]:
 | |
| 			print 'Skip', dstfile,'- Up-to-date'
 | |
| 			continue
 | |
| 		print 'Compacting', dstfile
 | |
| 		mgr.open(fss)
 | |
| 		mgr.Reset_File_Paths()
 | |
| 		mgr.Remove_Binaries()
 | |
| 		mgr.Close_Project()
 | |
| 		
 | |
| 		print 'Binhexing', dstfile
 | |
| 		binhex.binhex(srcfile, dstfile)
 | |
| 	mgr.quit()
 | |
| 	
 | |
| def copycwproject(path, name):
 | |
| 	"""Copy CW project (if needed) and remember for hexbinning"""
 | |
| 	global project_files
 | |
| 	
 | |
| 	dstdir = os.path.join(TOP, CWDIR)
 | |
| 	if not os.path.exists(dstdir):
 | |
| 		print dstdir
 | |
| 		print 'No CW-project dir, skip', name
 | |
| 		return
 | |
| 	dstfile = os.path.join(dstdir, name)
 | |
| 	# Check that we're not in the dest directory
 | |
| 	if dstfile == path:
 | |
| 		return
 | |
| 
 | |
| 	# If the destination doesn't exists or is older that the source
 | |
| 	# we copy and remember it
 | |
| 	
 | |
| 	if os.path.exists(dstfile) and \
 | |
| 			os.stat(dstfile)[8] > os.stat(path)[8]:
 | |
| 		print 'Not copying', path,'- Up-to-date'
 | |
| 	else:
 | |
| 		print 'Copy', path
 | |
| 		macostools.copy(path, dstfile)
 | |
| 	
 | |
| 	fss = macfs.FSSpec(dstfile)
 | |
| 	creator = fss.GetCreatorType()[0]
 | |
| 	
 | |
| 	if project_files.has_key(creator):
 | |
| 		project_files[creator].append(fss)
 | |
| 	else:
 | |
| 		project_files[creator] = [fss]	
 | |
| 	
 | |
| 
 | |
| extensions = [
 | |
| 	('.rsrc', binhexit),
 | |
| 	('.µ', copycwproject)
 | |
| 	]
 | |
| 
 | |
| def walker(arg, top, names):
 | |
| 	for n in names:
 | |
| 		for ext, handler in extensions:
 | |
| 			if n[-len(ext):] == ext:
 | |
| 				name = os.path.join(top, n)
 | |
| 				handler(name, n)
 | |
| 				
 | |
| def dodir(name):
 | |
| 	global TOP, project_files
 | |
| 	TOP = name
 | |
| 	os.path.walk(name, walker, None)
 | |
| 	
 | |
| 	for creator in project_files.keys():
 | |
| 		hexbincwprojects(creator)
 | |
| 	project_files = {}
 | |
| 				
 | |
| def main():
 | |
| 	if len(sys.argv) > 1:
 | |
| 		for dir in sys.argv[1:]:
 | |
| 			dodir(dir)
 | |
| 	elif os.name == 'mac':
 | |
| 		import macfs
 | |
| 		dir, ok = macfs.GetDirectory('Folder to search:')
 | |
| 		if not ok:
 | |
| 			sys.exit(0)
 | |
| 		dodir(dir.as_pathname())
 | |
| 	else:
 | |
| 		print 'Usage: hexbintree dir ...'
 | |
| 		sys.exit(1)
 | |
| 	if os.name == 'mac':
 | |
| 		sys.exit(1)   # Keep window
 | |
| 	else:
 | |
| 		sys.exit(0)
 | |
| 		
 | |
| if __name__ == '__main__':
 | |
| 	main()
 | |
| 	
 | 
