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