summaryrefslogtreecommitdiffstats
path: root/Mac/Unsupported/binhextree.py
diff options
context:
space:
mode:
authorJack Jansen <jack.jansen@cwi.nl>2000-08-20 20:10:39 (GMT)
committerJack Jansen <jack.jansen@cwi.nl>2000-08-20 20:10:39 (GMT)
commit51f357049b6a83167e46af5e07e8ce1ea1be7b2f (patch)
tree15e09e0fdb0f060733d49d4fb8cc0fc5a37c8b7e /Mac/Unsupported/binhextree.py
parent742ca0385a7c42f5672db82a093f29a22f3dd7a7 (diff)
downloadcpython-51f357049b6a83167e46af5e07e8ce1ea1be7b2f.zip
cpython-51f357049b6a83167e46af5e07e8ce1ea1be7b2f.tar.gz
cpython-51f357049b6a83167e46af5e07e8ce1ea1be7b2f.tar.bz2
Moved to unsupported: it doesn't work anymore and it has outlived its usefulness so I don't want to fix it.
Diffstat (limited to 'Mac/Unsupported/binhextree.py')
-rw-r--r--Mac/Unsupported/binhextree.py240
1 files changed, 240 insertions, 0 deletions
diff --git a/Mac/Unsupported/binhextree.py b/Mac/Unsupported/binhextree.py
new file mode 100644
index 0000000..1d6996e
--- /dev/null
+++ b/Mac/Unsupported/binhextree.py
@@ -0,0 +1,240 @@
+#
+# 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()
+