# # 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()