ยปCore Development>Code coverage>Lib/plat-mac/macostools.py

Python code coverage for Lib/plat-mac/macostools.py

#countcontent
1n/a"""macostools - Various utility functions for MacOS.
2n/a
3n/amkalias(src, dst) - Create a finder alias 'dst' pointing to 'src'
4n/acopy(src, dst) - Full copy of 'src' to 'dst'
5n/a"""
6n/a
7n/afrom warnings import warnpy3k
8n/awarnpy3k("In 3.x, the macostools module is removed.", stacklevel=2)
9n/a
10n/afrom Carbon import Res
11n/afrom Carbon import File, Files
12n/aimport os
13n/aimport errno
14n/aimport MacOS
15n/atry:
16n/a openrf = MacOS.openrf
17n/aexcept AttributeError:
18n/a # Backward compatibility
19n/a openrf = open
20n/a
21n/aError = 'macostools.Error'
22n/a
23n/aBUFSIZ=0x80000 # Copy in 0.5Mb chunks
24n/a
25n/aCOPY_FLAGS = (Files.kIsStationary|Files.kNameLocked|Files.kHasBundle|
26n/a Files.kIsInvisible|Files.kIsAlias)
27n/a
28n/a#
29n/a# Not guaranteed to be correct or stay correct (Apple doesn't tell you
30n/a# how to do this), but it seems to work.
31n/a#
32n/adef mkalias(src, dst, relative=None):
33n/a """Create a finder alias"""
34n/a srcfsr = File.FSRef(src)
35n/a # The next line will fail under unix-Python if the destination
36n/a # doesn't exist yet. We should change this code to be fsref-based.
37n/a dstdir, dstname = os.path.split(dst)
38n/a if not dstdir: dstdir = os.curdir
39n/a dstdirfsr = File.FSRef(dstdir)
40n/a if relative:
41n/a relativefsr = File.FSRef(relative)
42n/a # ik mag er geen None in stoppen :-(
43n/a alias = File.FSNewAlias(relativefsr, srcfsr)
44n/a else:
45n/a alias = srcfsr.FSNewAliasMinimal()
46n/a
47n/a dstfsr, dstfss = Res.FSCreateResourceFile(dstdirfsr, unicode(dstname),
48n/a File.FSGetResourceForkName())
49n/a h = Res.FSOpenResourceFile(dstfsr, File.FSGetResourceForkName(), 3)
50n/a resource = Res.Resource(alias.data)
51n/a resource.AddResource('alis', 0, '')
52n/a Res.CloseResFile(h)
53n/a
54n/a dstfinfo = dstfss.FSpGetFInfo()
55n/a dstfinfo.Flags = dstfinfo.Flags|0x8000 # Alias flag
56n/a dstfss.FSpSetFInfo(dstfinfo)
57n/a
58n/adef mkdirs(dst):
59n/a """Make directories leading to 'dst' if they don't exist yet"""
60n/a if dst == '' or os.path.exists(dst):
61n/a return
62n/a head, tail = os.path.split(dst)
63n/a if os.sep == ':' and not ':' in head:
64n/a head = head + ':'
65n/a mkdirs(head)
66n/a
67n/a try:
68n/a os.mkdir(dst, 0777)
69n/a except OSError, e:
70n/a # be happy if someone already created the path
71n/a if e.errno != errno.EEXIST:
72n/a raise
73n/a
74n/a
75n/adef touched(dst):
76n/a """Tell the finder a file has changed. No-op on MacOSX."""
77n/a import warnings
78n/a warnings.warn("macostools.touched() has been deprecated",
79n/a DeprecationWarning, 2)
80n/a
81n/adef touched_ae(dst):
82n/a """Tell the finder a file has changed"""
83n/a pardir = os.path.split(dst)[0]
84n/a if not pardir:
85n/a pardir = os.curdir
86n/a import Finder
87n/a f = Finder.Finder()
88n/a f.update(File.FSRef(pardir))
89n/a
90n/adef copy(src, dst, createpath=0, copydates=1, forcetype=None):
91n/a """Copy a file, including finder info, resource fork, etc"""
92n/a src = File.pathname(src)
93n/a dst = File.pathname(dst)
94n/a if createpath:
95n/a mkdirs(os.path.split(dst)[0])
96n/a
97n/a ifp = open(src, 'rb')
98n/a ofp = open(dst, 'wb')
99n/a d = ifp.read(BUFSIZ)
100n/a while d:
101n/a ofp.write(d)
102n/a d = ifp.read(BUFSIZ)
103n/a ifp.close()
104n/a ofp.close()
105n/a
106n/a ifp = openrf(src, '*rb')
107n/a ofp = openrf(dst, '*wb')
108n/a d = ifp.read(BUFSIZ)
109n/a while d:
110n/a ofp.write(d)
111n/a d = ifp.read(BUFSIZ)
112n/a ifp.close()
113n/a ofp.close()
114n/a
115n/a srcfss = File.FSSpec(src)
116n/a dstfss = File.FSSpec(dst)
117n/a sf = srcfss.FSpGetFInfo()
118n/a df = dstfss.FSpGetFInfo()
119n/a df.Creator, df.Type = sf.Creator, sf.Type
120n/a if forcetype is not None:
121n/a df.Type = forcetype
122n/a df.Flags = (sf.Flags & COPY_FLAGS)
123n/a dstfss.FSpSetFInfo(df)
124n/a if copydates:
125n/a srcfsr = File.FSRef(src)
126n/a dstfsr = File.FSRef(dst)
127n/a catinfo, _, _, _ = srcfsr.FSGetCatalogInfo(Files.kFSCatInfoAllDates)
128n/a dstfsr.FSSetCatalogInfo(Files.kFSCatInfoAllDates, catinfo)
129n/a
130n/adef copytree(src, dst, copydates=1):
131n/a """Copy a complete file tree to a new destination"""
132n/a if os.path.isdir(src):
133n/a mkdirs(dst)
134n/a files = os.listdir(src)
135n/a for f in files:
136n/a copytree(os.path.join(src, f), os.path.join(dst, f), copydates)
137n/a else:
138n/a copy(src, dst, 1, copydates)