mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			240 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			240 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#
 | 
						|
# binhextree - Recursively descend a directory and
 | 
						|
# pack all resource files.
 | 
						|
#
 | 
						|
# Actually it doesn't binhex anymore, it only copies projects.
 | 
						|
#
 | 
						|
# Jack Jansen, CWI, August 1995.
 | 
						|
#
 | 
						|
 | 
						|
import os
 | 
						|
import binhex
 | 
						|
import sys
 | 
						|
import macostools
 | 
						|
import macfs
 | 
						|
 | 
						|
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'
 | 
						|
# From which folders to put projects there
 | 
						|
CWDIRDIRS=['build.mac', 'build.macstand', 'build.macfreeze', 'PlugIns']
 | 
						|
 | 
						|
# Helper routines
 | 
						|
def binhexit(path, name):
 | 
						|
	dstfile = path + '.hqx'
 | 
						|
	if os.path.exists(dstfile):
 | 
						|
		print 'Compare', path,'...',
 | 
						|
		if binhexcompare(path, dstfile):
 | 
						|
			print 'Identical, skipped.'
 | 
						|
			return
 | 
						|
		else:
 | 
						|
			print 'Not up-to-date.'
 | 
						|
	print 'Binhexing', path
 | 
						|
	binhex.binhex(path, dstfile)
 | 
						|
	
 | 
						|
def binhexcompare(source, hqxfile):
 | 
						|
	"""(source, hqxfile) - Check whether the two files match (forks only)"""
 | 
						|
	ifp = binhex.HexBin(hqxfile)
 | 
						|
 | 
						|
	sfp = open(source, 'rb')
 | 
						|
	while 1:
 | 
						|
		d = ifp.read(128000)
 | 
						|
		d2 = sfp.read(128000)
 | 
						|
		if d <> d2:
 | 
						|
			return 0
 | 
						|
		if not d: break
 | 
						|
	sfp.close()
 | 
						|
	ifp.close_data()
 | 
						|
	
 | 
						|
	d = ifp.read_rsrc(128000)
 | 
						|
	if d:
 | 
						|
		sfp = binhex.openrsrc(source, 'rb')
 | 
						|
		d2 = sfp.read(128000)
 | 
						|
		if d <> d2:
 | 
						|
			return 0
 | 
						|
		while 1:
 | 
						|
			d = ifp.read_rsrc(128000)
 | 
						|
			d2 = sfp.read(128000)
 | 
						|
			if d <> d2:
 | 
						|
				return 0
 | 
						|
			if not d: break
 | 
						|
	return 1
 | 
						|
 | 
						|
# Project files to handle
 | 
						|
project_files = {}
 | 
						|
 | 
						|
def hexbincwprojects(creator):
 | 
						|
	"""Compact and hexbin all files remembered with a given creator"""
 | 
						|
	cw_running = 0
 | 
						|
	for fss in project_files[creator]:
 | 
						|
		srcfile = fss.as_pathname()
 | 
						|
		
 | 
						|
		old_style = 0
 | 
						|
		if srcfile[-1] == 'µ':
 | 
						|
			dstfile = srcfile[:-1]+'mu.hqx'
 | 
						|
			old_style = 1
 | 
						|
		elif srcfile[-3] == '.mu':
 | 
						|
			dstfile = srcfile + '.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
 | 
						|
		if old_style:
 | 
						|
			if not cw_running:
 | 
						|
				try:
 | 
						|
					mgr = MwShell(creator, start=1)
 | 
						|
				except 'foo':
 | 
						|
					print 'Not handled:', creator
 | 
						|
					return
 | 
						|
				cw_running = 1
 | 
						|
			mgr.open(fss)
 | 
						|
			mgr.Reset_File_Paths()
 | 
						|
			mgr.Remove_Binaries()
 | 
						|
			mgr.Close_Project()
 | 
						|
		
 | 
						|
		print 'Binhexing', dstfile
 | 
						|
		binhex.binhex(srcfile, dstfile)
 | 
						|
	if cw_running:
 | 
						|
		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 path[:len(dstdir)] == dstdir:
 | 
						|
		return
 | 
						|
	srcdir = os.path.split(path)[0]
 | 
						|
	srcdir = os.path.split(srcdir)[1]
 | 
						|
	if srcdir in CWDIRDIRS:
 | 
						|
		if not os.path.exists(dstdir):
 | 
						|
			print dstdir
 | 
						|
			print 'No CW-project dir, skip', name
 | 
						|
			return
 | 
						|
		dstfile = os.path.join(dstdir, os.path.join(srcdir, name))
 | 
						|
	else:
 | 
						|
		if path[-2:] == '.µ':
 | 
						|
			dstfile = path[:-2]+ '.mu'
 | 
						|
		elif path[-4:] == '.prj':
 | 
						|
			dstfile = None
 | 
						|
		else:
 | 
						|
			return
 | 
						|
 | 
						|
	if dstfile:
 | 
						|
		# 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)
 | 
						|
	else:
 | 
						|
		dstfile = path
 | 
						|
	
 | 
						|
	fss = macfs.FSSpec(dstfile)
 | 
						|
	creator = fss.GetCreatorType()[0]
 | 
						|
	
 | 
						|
	if project_files.has_key(creator):
 | 
						|
		project_files[creator].append(fss)
 | 
						|
	else:
 | 
						|
		project_files[creator] = [fss]	
 | 
						|
	
 | 
						|
def copycwexpfile(path, name):
 | 
						|
	"""Copy CW export file"""
 | 
						|
	global project_files
 | 
						|
	
 | 
						|
	dstdir = os.path.join(TOP, CWDIR)
 | 
						|
	if path[:len(dstdir)] == dstdir:
 | 
						|
		return
 | 
						|
	srcdir = os.path.split(path)[0]
 | 
						|
	srcdir = os.path.split(srcdir)[1]
 | 
						|
	if srcdir in CWDIRDIRS:
 | 
						|
		if not os.path.exists(dstdir):
 | 
						|
			print dstdir
 | 
						|
			print 'No CW-project dir, skip', name
 | 
						|
			return
 | 
						|
		dstfile = os.path.join(dstdir, os.path.join(srcdir, name))
 | 
						|
	else:
 | 
						|
		if path[-6:] != '.µ.exp':
 | 
						|
			return
 | 
						|
		dstfile = path[:-6] + '.mu.exp'
 | 
						|
	if dstfile[-6:] == '.µ.exp':
 | 
						|
		dstfile = dstfile[:-6]+'.mu.exp'
 | 
						|
 | 
						|
	# 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)	
 | 
						|
 | 
						|
extensions = [
 | 
						|
##	('.rsrc', binhexit),
 | 
						|
##	('.gif', binhexit),
 | 
						|
	('.µ', copycwproject),
 | 
						|
	('.prj', copycwproject),
 | 
						|
	('.prj.exp', copycwexpfile),
 | 
						|
	('.µ.exp', copycwexpfile)
 | 
						|
	]
 | 
						|
 | 
						|
def walker(arg, top, names):
 | 
						|
	lnames = names[:]
 | 
						|
	for n in lnames:
 | 
						|
		if n[0] == '(' and n[-1] == ')':
 | 
						|
			names.remove(n)
 | 
						|
			continue
 | 
						|
		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()
 | 
						|
	
 |