| 
									
										
										
										
											1995-08-14 12:38:42 +00:00
										 |  |  | """macostools - Various utility functions for MacOS.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | mkalias(src, dst) - Create a finder alias 'dst' pointing to 'src' | 
					
						
							|  |  |  | copy(src, dst) - Full copy of 'src' to 'dst' | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-12 21:42:13 +00:00
										 |  |  | from warnings import warnpy3k | 
					
						
							|  |  |  | warnpy3k("In 3.x, the macostools module is removed.") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-25 12:15:04 +00:00
										 |  |  | from Carbon import Res | 
					
						
							| 
									
										
										
										
											2003-01-28 23:53:40 +00:00
										 |  |  | from Carbon import File, Files | 
					
						
							| 
									
										
										
										
											1995-08-14 12:38:42 +00:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											1996-03-12 13:33:34 +00:00
										 |  |  | import MacOS | 
					
						
							|  |  |  | try: | 
					
						
							| 
									
										
										
										
											2003-01-28 23:53:40 +00:00
										 |  |  |     openrf = MacOS.openrf | 
					
						
							| 
									
										
										
										
											1996-03-12 13:33:34 +00:00
										 |  |  | except AttributeError: | 
					
						
							| 
									
										
										
										
											2005-07-22 18:39:19 +00:00
										 |  |  |     # Backward compatibility | 
					
						
							| 
									
										
										
										
											2003-01-28 23:53:40 +00:00
										 |  |  |     openrf = open | 
					
						
							| 
									
										
										
										
											1995-08-14 12:38:42 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Error = 'macostools.Error' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-28 23:53:40 +00:00
										 |  |  | BUFSIZ=0x80000      # Copy in 0.5Mb chunks | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | COPY_FLAGS = (Files.kIsStationary|Files.kNameLocked|Files.kHasBundle| | 
					
						
							|  |  |  |               Files.kIsInvisible|Files.kIsAlias) | 
					
						
							| 
									
										
										
										
											1995-08-14 12:38:42 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Not guaranteed to be correct or stay correct (Apple doesn't tell you | 
					
						
							|  |  |  | # how to do this), but it seems to work. | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											1997-08-08 15:00:59 +00:00
										 |  |  | def mkalias(src, dst, relative=None): | 
					
						
							| 
									
										
										
										
											2003-01-28 23:53:40 +00:00
										 |  |  |     """Create a finder alias""" | 
					
						
							|  |  |  |     srcfsr = File.FSRef(src) | 
					
						
							|  |  |  |     # The next line will fail under unix-Python if the destination | 
					
						
							|  |  |  |     # doesn't exist yet. We should change this code to be fsref-based. | 
					
						
							|  |  |  |     dstdir, dstname = os.path.split(dst) | 
					
						
							|  |  |  |     if not dstdir: dstdir = os.curdir | 
					
						
							|  |  |  |     dstdirfsr = File.FSRef(dstdir) | 
					
						
							|  |  |  |     if relative: | 
					
						
							|  |  |  |         relativefsr = File.FSRef(relative) | 
					
						
							|  |  |  |         # ik mag er geen None in stoppen :-( | 
					
						
							|  |  |  |         alias = File.FSNewAlias(relativefsr, srcfsr) | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         alias = srcfsr.FSNewAliasMinimal() | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     dstfsr, dstfss = Res.FSCreateResourceFile(dstdirfsr, unicode(dstname), | 
					
						
							| 
									
										
										
										
											2003-01-28 23:53:40 +00:00
										 |  |  |         File.FSGetResourceForkName()) | 
					
						
							|  |  |  |     h = Res.FSOpenResourceFile(dstfsr, File.FSGetResourceForkName(), 3) | 
					
						
							|  |  |  |     resource = Res.Resource(alias.data) | 
					
						
							|  |  |  |     resource.AddResource('alis', 0, '') | 
					
						
							|  |  |  |     Res.CloseResFile(h) | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-28 23:53:40 +00:00
										 |  |  |     dstfinfo = dstfss.FSpGetFInfo() | 
					
						
							|  |  |  |     dstfinfo.Flags = dstfinfo.Flags|0x8000    # Alias flag | 
					
						
							|  |  |  |     dstfss.FSpSetFInfo(dstfinfo) | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-08-31 13:40:03 +00:00
										 |  |  | def mkdirs(dst): | 
					
						
							| 
									
										
										
										
											2003-01-28 23:53:40 +00:00
										 |  |  |     """Make directories leading to 'dst' if they don't exist yet""" | 
					
						
							|  |  |  |     if dst == '' or os.path.exists(dst): | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     head, tail = os.path.split(dst) | 
					
						
							|  |  |  |     if os.sep == ':' and not ':' in head: | 
					
						
							|  |  |  |         head = head + ':' | 
					
						
							|  |  |  |     mkdirs(head) | 
					
						
							|  |  |  |     os.mkdir(dst, 0777) | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-14 17:06:32 +00:00
										 |  |  | def touched(dst): | 
					
						
							| 
									
										
										
										
											2003-01-28 23:53:40 +00:00
										 |  |  |     """Tell the finder a file has changed. No-op on MacOSX.""" | 
					
						
							| 
									
										
										
										
											2003-03-07 15:36:49 +00:00
										 |  |  |     import warnings | 
					
						
							| 
									
										
										
										
											2007-05-20 23:17:38 +00:00
										 |  |  |     warnings.warn("macostools.touched() has been deprecated", | 
					
						
							|  |  |  |                     DeprecationWarning, 2) | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-14 17:06:32 +00:00
										 |  |  | def touched_ae(dst): | 
					
						
							| 
									
										
										
										
											2003-01-28 23:53:40 +00:00
										 |  |  |     """Tell the finder a file has changed""" | 
					
						
							|  |  |  |     pardir = os.path.split(dst)[0] | 
					
						
							|  |  |  |     if not pardir: | 
					
						
							|  |  |  |         pardir = os.curdir | 
					
						
							|  |  |  |     import Finder | 
					
						
							|  |  |  |     f = Finder.Finder() | 
					
						
							|  |  |  |     f.update(File.FSRef(pardir)) | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-03-06 22:46:25 +00:00
										 |  |  | def copy(src, dst, createpath=0, copydates=1, forcetype=None): | 
					
						
							| 
									
										
										
										
											2003-01-28 23:53:40 +00:00
										 |  |  |     """Copy a file, including finder info, resource fork, etc""" | 
					
						
							|  |  |  |     src = File.pathname(src) | 
					
						
							|  |  |  |     dst = File.pathname(dst) | 
					
						
							|  |  |  |     if createpath: | 
					
						
							|  |  |  |         mkdirs(os.path.split(dst)[0]) | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-28 23:53:40 +00:00
										 |  |  |     ifp = open(src, 'rb') | 
					
						
							|  |  |  |     ofp = open(dst, 'wb') | 
					
						
							|  |  |  |     d = ifp.read(BUFSIZ) | 
					
						
							|  |  |  |     while d: | 
					
						
							|  |  |  |         ofp.write(d) | 
					
						
							|  |  |  |         d = ifp.read(BUFSIZ) | 
					
						
							|  |  |  |     ifp.close() | 
					
						
							|  |  |  |     ofp.close() | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-28 23:53:40 +00:00
										 |  |  |     ifp = openrf(src, '*rb') | 
					
						
							|  |  |  |     ofp = openrf(dst, '*wb') | 
					
						
							|  |  |  |     d = ifp.read(BUFSIZ) | 
					
						
							|  |  |  |     while d: | 
					
						
							|  |  |  |         ofp.write(d) | 
					
						
							|  |  |  |         d = ifp.read(BUFSIZ) | 
					
						
							|  |  |  |     ifp.close() | 
					
						
							|  |  |  |     ofp.close() | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-28 23:53:40 +00:00
										 |  |  |     srcfss = File.FSSpec(src) | 
					
						
							|  |  |  |     dstfss = File.FSSpec(dst) | 
					
						
							|  |  |  |     sf = srcfss.FSpGetFInfo() | 
					
						
							|  |  |  |     df = dstfss.FSpGetFInfo() | 
					
						
							|  |  |  |     df.Creator, df.Type = sf.Creator, sf.Type | 
					
						
							| 
									
										
										
										
											2008-03-29 15:24:25 +00:00
										 |  |  |     if forcetype is not None: | 
					
						
							| 
									
										
										
										
											2003-01-28 23:53:40 +00:00
										 |  |  |         df.Type = forcetype | 
					
						
							|  |  |  |     df.Flags = (sf.Flags & COPY_FLAGS) | 
					
						
							|  |  |  |     dstfss.FSpSetFInfo(df) | 
					
						
							|  |  |  |     if copydates: | 
					
						
							|  |  |  |         srcfsr = File.FSRef(src) | 
					
						
							|  |  |  |         dstfsr = File.FSRef(dst) | 
					
						
							|  |  |  |         catinfo, _, _, _ = srcfsr.FSGetCatalogInfo(Files.kFSCatInfoAllDates) | 
					
						
							|  |  |  |         dstfsr.FSSetCatalogInfo(Files.kFSCatInfoAllDates, catinfo) | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-09-15 22:13:26 +00:00
										 |  |  | def copytree(src, dst, copydates=1): | 
					
						
							| 
									
										
										
										
											2003-01-28 23:53:40 +00:00
										 |  |  |     """Copy a complete file tree to a new destination""" | 
					
						
							|  |  |  |     if os.path.isdir(src): | 
					
						
							|  |  |  |         mkdirs(dst) | 
					
						
							|  |  |  |         files = os.listdir(src) | 
					
						
							|  |  |  |         for f in files: | 
					
						
							|  |  |  |             copytree(os.path.join(src, f), os.path.join(dst, f), copydates) | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         copy(src, dst, 1, copydates) |