1995-08-14 09:38:42 -03: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 18:42:13 -03:00
|
|
|
from warnings import warnpy3k
|
2008-07-14 14:42:17 -03:00
|
|
|
warnpy3k("In 3.x, the macostools module is removed.", stacklevel=2)
|
2008-05-12 18:42:13 -03:00
|
|
|
|
2001-08-25 09:15:04 -03:00
|
|
|
from Carbon import Res
|
2003-01-28 19:53:40 -04:00
|
|
|
from Carbon import File, Files
|
1995-08-14 09:38:42 -03:00
|
|
|
import os
|
1996-03-12 09:33:34 -04:00
|
|
|
import MacOS
|
|
|
|
try:
|
2003-01-28 19:53:40 -04:00
|
|
|
openrf = MacOS.openrf
|
1996-03-12 09:33:34 -04:00
|
|
|
except AttributeError:
|
2005-07-22 15:39:19 -03:00
|
|
|
# Backward compatibility
|
2003-01-28 19:53:40 -04:00
|
|
|
openrf = open
|
1995-08-14 09:38:42 -03:00
|
|
|
|
|
|
|
Error = 'macostools.Error'
|
|
|
|
|
2003-01-28 19:53:40 -04:00
|
|
|
BUFSIZ=0x80000 # Copy in 0.5Mb chunks
|
|
|
|
|
|
|
|
COPY_FLAGS = (Files.kIsStationary|Files.kNameLocked|Files.kHasBundle|
|
|
|
|
Files.kIsInvisible|Files.kIsAlias)
|
1995-08-14 09:38:42 -03: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 12:00:59 -03:00
|
|
|
def mkalias(src, dst, relative=None):
|
2003-01-28 19:53:40 -04: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 03:16:08 -03:00
|
|
|
|
|
|
|
dstfsr, dstfss = Res.FSCreateResourceFile(dstdirfsr, unicode(dstname),
|
2003-01-28 19:53:40 -04: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 03:16:08 -03:00
|
|
|
|
2003-01-28 19:53:40 -04:00
|
|
|
dstfinfo = dstfss.FSpGetFInfo()
|
|
|
|
dstfinfo.Flags = dstfinfo.Flags|0x8000 # Alias flag
|
|
|
|
dstfss.FSpSetFInfo(dstfinfo)
|
2004-07-18 03:16:08 -03:00
|
|
|
|
1995-08-31 10:40:03 -03:00
|
|
|
def mkdirs(dst):
|
2003-01-28 19:53:40 -04: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)
|
Merged revisions 68133-68134,68141-68142,68145-68146,68148-68149,68159-68162,68166,68171-68174,68179,68195-68196,68210,68214-68215,68217-68222 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r68133 | antoine.pitrou | 2009-01-01 16:38:03 +0100 (Thu, 01 Jan 2009) | 1 line
fill in actual issue number in tests
........
r68134 | hirokazu.yamamoto | 2009-01-01 16:45:39 +0100 (Thu, 01 Jan 2009) | 2 lines
Issue #4797: IOError.filename was not set when _fileio.FileIO failed to open
file with `str' filename on Windows.
........
r68141 | benjamin.peterson | 2009-01-01 17:43:12 +0100 (Thu, 01 Jan 2009) | 1 line
fix highlighting
........
r68142 | benjamin.peterson | 2009-01-01 18:29:49 +0100 (Thu, 01 Jan 2009) | 2 lines
welcome to 2009, Python!
........
r68145 | amaury.forgeotdarc | 2009-01-02 01:03:54 +0100 (Fri, 02 Jan 2009) | 5 lines
#4801 _collections module fails to build on cygwin.
_PyObject_GC_TRACK is the macro version of PyObject_GC_Track,
and according to documentation it should not be used for extension modules.
........
r68146 | ronald.oussoren | 2009-01-02 11:44:46 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue4472: "configure --enable-shared doesn't work on OSX"
........
r68148 | ronald.oussoren | 2009-01-02 11:48:31 +0100 (Fri, 02 Jan 2009) | 2 lines
Forgot to add a NEWS item in my previous checkin
........
r68149 | ronald.oussoren | 2009-01-02 11:50:48 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue4780
........
r68159 | ronald.oussoren | 2009-01-02 15:48:17 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue 1627952
........
r68160 | ronald.oussoren | 2009-01-02 15:52:09 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue r1737832
........
r68161 | ronald.oussoren | 2009-01-02 16:00:05 +0100 (Fri, 02 Jan 2009) | 3 lines
Fix for issue 1149804
........
r68162 | ronald.oussoren | 2009-01-02 16:06:00 +0100 (Fri, 02 Jan 2009) | 3 lines
Fix for issue 4472 is incompatible with Cygwin, this patch
should fix that.
........
r68166 | benjamin.peterson | 2009-01-02 19:26:23 +0100 (Fri, 02 Jan 2009) | 1 line
document PyMemberDef
........
r68171 | georg.brandl | 2009-01-02 21:25:14 +0100 (Fri, 02 Jan 2009) | 3 lines
#4811: fix markup glitches (mostly remains of the conversion),
found by Gabriel Genellina.
........
r68172 | martin.v.loewis | 2009-01-02 21:32:55 +0100 (Fri, 02 Jan 2009) | 2 lines
Issue #4075: Use OutputDebugStringW in Py_FatalError.
........
r68173 | martin.v.loewis | 2009-01-02 21:40:14 +0100 (Fri, 02 Jan 2009) | 2 lines
Issue #4051: Prevent conflict of UNICODE macros in cPickle.
........
r68174 | benjamin.peterson | 2009-01-02 21:47:27 +0100 (Fri, 02 Jan 2009) | 1 line
fix compilation on non-Windows platforms
........
r68179 | raymond.hettinger | 2009-01-02 22:26:45 +0100 (Fri, 02 Jan 2009) | 1 line
Issue #4615. Document how to use itertools for de-duping.
........
r68195 | georg.brandl | 2009-01-03 14:45:15 +0100 (Sat, 03 Jan 2009) | 2 lines
Remove useless string literal.
........
r68196 | georg.brandl | 2009-01-03 15:29:53 +0100 (Sat, 03 Jan 2009) | 2 lines
Fix indentation.
........
r68210 | georg.brandl | 2009-01-03 20:10:12 +0100 (Sat, 03 Jan 2009) | 2 lines
Set eol-style correctly for mp_distributing.py.
........
r68214 | georg.brandl | 2009-01-03 20:44:48 +0100 (Sat, 03 Jan 2009) | 2 lines
Make indentation consistent.
........
r68215 | georg.brandl | 2009-01-03 21:15:14 +0100 (Sat, 03 Jan 2009) | 2 lines
Fix role name.
........
r68217 | georg.brandl | 2009-01-03 21:30:15 +0100 (Sat, 03 Jan 2009) | 2 lines
Add rstlint, a little tool to find subtle markup problems and inconsistencies in the Doc sources.
........
r68218 | georg.brandl | 2009-01-03 21:38:59 +0100 (Sat, 03 Jan 2009) | 2 lines
Recognize usage of the default role.
........
r68219 | georg.brandl | 2009-01-03 21:47:01 +0100 (Sat, 03 Jan 2009) | 2 lines
Fix uses of the default role.
........
r68220 | georg.brandl | 2009-01-03 21:55:06 +0100 (Sat, 03 Jan 2009) | 2 lines
Remove trailing whitespace.
........
r68221 | georg.brandl | 2009-01-03 22:04:55 +0100 (Sat, 03 Jan 2009) | 2 lines
Remove tabs from the documentation.
........
r68222 | georg.brandl | 2009-01-03 22:11:58 +0100 (Sat, 03 Jan 2009) | 2 lines
Disable the line length checker by default.
........
2009-01-03 17:55:17 -04:00
|
|
|
|
|
|
|
try:
|
|
|
|
os.mkdir(dst, 0777)
|
|
|
|
except OSError, e:
|
|
|
|
# be happy if someone already created the path
|
|
|
|
if e.errno != errno.EEXIST:
|
|
|
|
raise
|
|
|
|
|
2004-07-18 03:16:08 -03:00
|
|
|
|
2001-02-14 13:06:32 -04:00
|
|
|
def touched(dst):
|
2003-01-28 19:53:40 -04:00
|
|
|
"""Tell the finder a file has changed. No-op on MacOSX."""
|
2003-03-07 11:36:49 -04:00
|
|
|
import warnings
|
2007-05-20 20:17:38 -03:00
|
|
|
warnings.warn("macostools.touched() has been deprecated",
|
|
|
|
DeprecationWarning, 2)
|
2004-07-18 03:16:08 -03:00
|
|
|
|
2001-02-14 13:06:32 -04:00
|
|
|
def touched_ae(dst):
|
2003-01-28 19:53:40 -04: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 03:16:08 -03:00
|
|
|
|
2001-03-06 18:46:25 -04:00
|
|
|
def copy(src, dst, createpath=0, copydates=1, forcetype=None):
|
2003-01-28 19:53:40 -04: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 03:16:08 -03:00
|
|
|
|
2003-01-28 19:53:40 -04: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 03:16:08 -03:00
|
|
|
|
2003-01-28 19:53:40 -04: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 03:16:08 -03:00
|
|
|
|
2003-01-28 19:53:40 -04: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 12:24:25 -03:00
|
|
|
if forcetype is not None:
|
2003-01-28 19:53:40 -04: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 03:16:08 -03:00
|
|
|
|
1996-09-15 19:13:26 -03:00
|
|
|
def copytree(src, dst, copydates=1):
|
2003-01-28 19:53:40 -04: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)
|