When installing resource files whose name ends in .rsrc use the

"copy anything to a data fork based resource file" trick of macresource.
Fixes #688007.
This commit is contained in:
Jack Jansen 2003-02-17 16:47:12 +00:00
parent 3d3b74677a
commit 946c19445c
2 changed files with 45 additions and 5 deletions

View File

@ -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)

View File

@ -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
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)