diff options
-rwxr-xr-x | Lib/plat-mac/bundlebuilder.py | 3 | ||||
-rw-r--r-- | Lib/plat-mac/macresource.py | 47 |
2 files changed, 45 insertions, 5 deletions
diff --git a/Lib/plat-mac/bundlebuilder.py b/Lib/plat-mac/bundlebuilder.py index d8c5557..9d50f91 100755 --- a/Lib/plat-mac/bundlebuilder.py +++ b/Lib/plat-mac/bundlebuilder.py @@ -36,6 +36,7 @@ from copy import deepcopy import getopt from plistlib import Plist from types import FunctionType as function +import macresource class BundleBuilderError(Exception): pass @@ -188,6 +189,8 @@ class BundleBuilder(Defaults): dst = pathjoin(self.bundlepath, dst) if self.symlink: symlink(src, dst, mkdirs=1) + elif os.path.splitext(src)[1] == '.rsrc': + macresource.install(src, dst, mkdirs=1) else: copy(src, dst, mkdirs=1) diff --git a/Lib/plat-mac/macresource.py b/Lib/plat-mac/macresource.py index 7e99c00..16eed00 100644 --- a/Lib/plat-mac/macresource.py +++ b/Lib/plat-mac/macresource.py @@ -3,6 +3,8 @@ from Carbon import Res import os import sys +import MacOS +import macostools class ArgumentError(TypeError): pass class ResourceFileNotFoundError(ImportError): pass @@ -99,16 +101,51 @@ def open_error_resource(): mapping.""" need('Estr', 1, filename="errors.rsrc", modname=__name__) -def _decode(pathname, verbose=0): +def _decode(pathname, verbose=0, newpathname=None): # Decode an AppleSingle resource file, return the new pathname. - newpathname = pathname + '.df.rsrc' - if os.path.exists(newpathname) and \ + if not newpathname: + newpathname = pathname + '.df.rsrc' + if os.path.exists(newpathname) and \ os.stat(newpathname).st_mtime >= os.stat(pathname).st_mtime: - return newpathname + return newpathname if verbose: print 'Decoding', pathname import applesingle applesingle.decode(pathname, newpathname, resonly=1) return newpathname -
\ No newline at end of file +def install(src, dst, mkdirs=0): + """Copy a resource file. The result will always be a datafork-based + resource file, whether the source is datafork-based, resource-fork + based or AppleSingle-encoded.""" + if mkdirs: + macostools.mkdirs(os.path.split(dst)[0]) + try: + refno = Res.FSOpenResourceFile(src, u'', 1) + except Res.Error, arg: + if arg[0] != -199: + # -199 is "bad resource map" + raise + else: + # Resource-fork based. Simply copy. + Res.CloseResFile(refno) + macostools.copy(src, dst) + + try: + refno = Res.FSpOpenResFile(src, 1) + except Res.Error, arg: + if not arg[0] in (-37, -39): + raise + else: + Res.CloseResFile(refno) + BUFSIZ=0x80000 # Copy in 0.5Mb chunks + ifp = MacOS.openrf(src, '*rb') + ofp = open(dst, 'wb') + d = ifp.read(BUFSIZ) + while d: + ofp.write(d) + d = ifp.read(BUFSIZ) + ifp.close() + ofp.close() + + _decode(src, newpathname=dst) |