##// END OF EJS Templates
osutil: use absolute_import
Gregory Szorc -
r27338:810337ae default
parent child Browse files
Show More
@@ -1,170 +1,173 b''
1 1 # osutil.py - pure Python version of osutil.c
2 2 #
3 3 # Copyright 2009 Matt Mackall <mpm@selenic.com> and others
4 4 #
5 5 # This software may be used and distributed according to the terms of the
6 6 # GNU General Public License version 2 or any later version.
7 7
8 from __future__ import absolute_import
9
8 10 import os
9 11 import stat as statmod
10 12
11 13 def _mode_to_kind(mode):
12 14 if statmod.S_ISREG(mode):
13 15 return statmod.S_IFREG
14 16 if statmod.S_ISDIR(mode):
15 17 return statmod.S_IFDIR
16 18 if statmod.S_ISLNK(mode):
17 19 return statmod.S_IFLNK
18 20 if statmod.S_ISBLK(mode):
19 21 return statmod.S_IFBLK
20 22 if statmod.S_ISCHR(mode):
21 23 return statmod.S_IFCHR
22 24 if statmod.S_ISFIFO(mode):
23 25 return statmod.S_IFIFO
24 26 if statmod.S_ISSOCK(mode):
25 27 return statmod.S_IFSOCK
26 28 return mode
27 29
28 30 def listdir(path, stat=False, skip=None):
29 31 '''listdir(path, stat=False) -> list_of_tuples
30 32
31 33 Return a sorted list containing information about the entries
32 34 in the directory.
33 35
34 36 If stat is True, each element is a 3-tuple:
35 37
36 38 (name, type, stat object)
37 39
38 40 Otherwise, each element is a 2-tuple:
39 41
40 42 (name, type)
41 43 '''
42 44 result = []
43 45 prefix = path
44 46 if not prefix.endswith(os.sep):
45 47 prefix += os.sep
46 48 names = os.listdir(path)
47 49 names.sort()
48 50 for fn in names:
49 51 st = os.lstat(prefix + fn)
50 52 if fn == skip and statmod.S_ISDIR(st.st_mode):
51 53 return []
52 54 if stat:
53 55 result.append((fn, _mode_to_kind(st.st_mode), st))
54 56 else:
55 57 result.append((fn, _mode_to_kind(st.st_mode)))
56 58 return result
57 59
58 60 if os.name != 'nt':
59 61 posixfile = open
60 62 else:
61 import ctypes, msvcrt
63 import ctypes
64 import msvcrt
62 65
63 66 _kernel32 = ctypes.windll.kernel32
64 67
65 68 _DWORD = ctypes.c_ulong
66 69 _LPCSTR = _LPSTR = ctypes.c_char_p
67 70 _HANDLE = ctypes.c_void_p
68 71
69 72 _INVALID_HANDLE_VALUE = _HANDLE(-1).value
70 73
71 74 # CreateFile
72 75 _FILE_SHARE_READ = 0x00000001
73 76 _FILE_SHARE_WRITE = 0x00000002
74 77 _FILE_SHARE_DELETE = 0x00000004
75 78
76 79 _CREATE_ALWAYS = 2
77 80 _OPEN_EXISTING = 3
78 81 _OPEN_ALWAYS = 4
79 82
80 83 _GENERIC_READ = 0x80000000
81 84 _GENERIC_WRITE = 0x40000000
82 85
83 86 _FILE_ATTRIBUTE_NORMAL = 0x80
84 87
85 88 # open_osfhandle flags
86 89 _O_RDONLY = 0x0000
87 90 _O_RDWR = 0x0002
88 91 _O_APPEND = 0x0008
89 92
90 93 _O_TEXT = 0x4000
91 94 _O_BINARY = 0x8000
92 95
93 96 # types of parameters of C functions used (required by pypy)
94 97
95 98 _kernel32.CreateFileA.argtypes = [_LPCSTR, _DWORD, _DWORD, ctypes.c_void_p,
96 99 _DWORD, _DWORD, _HANDLE]
97 100 _kernel32.CreateFileA.restype = _HANDLE
98 101
99 102 def _raiseioerror(name):
100 103 err = ctypes.WinError()
101 104 raise IOError(err.errno, '%s: %s' % (name, err.strerror))
102 105
103 106 class posixfile(object):
104 107 '''a file object aiming for POSIX-like semantics
105 108
106 109 CPython's open() returns a file that was opened *without* setting the
107 110 _FILE_SHARE_DELETE flag, which causes rename and unlink to abort.
108 111 This even happens if any hardlinked copy of the file is in open state.
109 112 We set _FILE_SHARE_DELETE here, so files opened with posixfile can be
110 113 renamed and deleted while they are held open.
111 114 Note that if a file opened with posixfile is unlinked, the file
112 115 remains but cannot be opened again or be recreated under the same name,
113 116 until all reading processes have closed the file.'''
114 117
115 118 def __init__(self, name, mode='r', bufsize=-1):
116 119 if 'b' in mode:
117 120 flags = _O_BINARY
118 121 else:
119 122 flags = _O_TEXT
120 123
121 124 m0 = mode[0]
122 125 if m0 == 'r' and '+' not in mode:
123 126 flags |= _O_RDONLY
124 127 access = _GENERIC_READ
125 128 else:
126 129 # work around http://support.microsoft.com/kb/899149 and
127 130 # set _O_RDWR for 'w' and 'a', even if mode has no '+'
128 131 flags |= _O_RDWR
129 132 access = _GENERIC_READ | _GENERIC_WRITE
130 133
131 134 if m0 == 'r':
132 135 creation = _OPEN_EXISTING
133 136 elif m0 == 'w':
134 137 creation = _CREATE_ALWAYS
135 138 elif m0 == 'a':
136 139 creation = _OPEN_ALWAYS
137 140 flags |= _O_APPEND
138 141 else:
139 142 raise ValueError("invalid mode: %s" % mode)
140 143
141 144 fh = _kernel32.CreateFileA(name, access,
142 145 _FILE_SHARE_READ | _FILE_SHARE_WRITE | _FILE_SHARE_DELETE,
143 146 None, creation, _FILE_ATTRIBUTE_NORMAL, None)
144 147 if fh == _INVALID_HANDLE_VALUE:
145 148 _raiseioerror(name)
146 149
147 150 fd = msvcrt.open_osfhandle(fh, flags)
148 151 if fd == -1:
149 152 _kernel32.CloseHandle(fh)
150 153 _raiseioerror(name)
151 154
152 155 f = os.fdopen(fd, mode, bufsize)
153 156 # unfortunately, f.name is '<fdopen>' at this point -- so we store
154 157 # the name on this wrapper. We cannot just assign to f.name,
155 158 # because that attribute is read-only.
156 159 object.__setattr__(self, 'name', name)
157 160 object.__setattr__(self, '_file', f)
158 161
159 162 def __iter__(self):
160 163 return self._file
161 164
162 165 def __getattr__(self, name):
163 166 return getattr(self._file, name)
164 167
165 168 def __setattr__(self, name, value):
166 169 '''mimics the read-only attributes of Python file objects
167 170 by raising 'TypeError: readonly attribute' if someone tries:
168 171 f = posixfile('foo.txt')
169 172 f.name = 'bla' '''
170 173 return self._file.__setattr__(name, value)
@@ -1,215 +1,214 b''
1 1 #require test-repo
2 2
3 3 $ cd "$TESTDIR"/..
4 4
5 5 $ hg files 'set:(**.py)' | xargs python contrib/check-py3-compat.py
6 6 contrib/casesmash.py not using absolute_import
7 7 contrib/check-code.py not using absolute_import
8 8 contrib/check-code.py requires print_function
9 9 contrib/check-config.py not using absolute_import
10 10 contrib/check-config.py requires print_function
11 11 contrib/debugcmdserver.py not using absolute_import
12 12 contrib/debugcmdserver.py requires print_function
13 13 contrib/debugshell.py not using absolute_import
14 14 contrib/fixpax.py not using absolute_import
15 15 contrib/fixpax.py requires print_function
16 16 contrib/hgclient.py not using absolute_import
17 17 contrib/hgclient.py requires print_function
18 18 contrib/hgfixes/fix_bytes.py not using absolute_import
19 19 contrib/hgfixes/fix_bytesmod.py not using absolute_import
20 20 contrib/hgfixes/fix_leftover_imports.py not using absolute_import
21 21 contrib/import-checker.py not using absolute_import
22 22 contrib/import-checker.py requires print_function
23 23 contrib/memory.py not using absolute_import
24 24 contrib/perf.py not using absolute_import
25 25 contrib/python-hook-examples.py not using absolute_import
26 26 contrib/revsetbenchmarks.py not using absolute_import
27 27 contrib/revsetbenchmarks.py requires print_function
28 28 contrib/showstack.py not using absolute_import
29 29 contrib/synthrepo.py not using absolute_import
30 30 contrib/win32/hgwebdir_wsgi.py not using absolute_import
31 31 doc/check-seclevel.py not using absolute_import
32 32 doc/gendoc.py not using absolute_import
33 33 doc/hgmanpage.py not using absolute_import
34 34 hgext/__init__.py not using absolute_import
35 35 hgext/acl.py not using absolute_import
36 36 hgext/blackbox.py not using absolute_import
37 37 hgext/bugzilla.py not using absolute_import
38 38 hgext/censor.py not using absolute_import
39 39 hgext/children.py not using absolute_import
40 40 hgext/churn.py not using absolute_import
41 41 hgext/clonebundles.py not using absolute_import
42 42 hgext/color.py not using absolute_import
43 43 hgext/convert/__init__.py not using absolute_import
44 44 hgext/convert/bzr.py not using absolute_import
45 45 hgext/convert/common.py not using absolute_import
46 46 hgext/convert/convcmd.py not using absolute_import
47 47 hgext/convert/cvs.py not using absolute_import
48 48 hgext/convert/cvsps.py not using absolute_import
49 49 hgext/convert/darcs.py not using absolute_import
50 50 hgext/convert/filemap.py not using absolute_import
51 51 hgext/convert/git.py not using absolute_import
52 52 hgext/convert/gnuarch.py not using absolute_import
53 53 hgext/convert/hg.py not using absolute_import
54 54 hgext/convert/monotone.py not using absolute_import
55 55 hgext/convert/p4.py not using absolute_import
56 56 hgext/convert/subversion.py not using absolute_import
57 57 hgext/convert/transport.py not using absolute_import
58 58 hgext/eol.py not using absolute_import
59 59 hgext/extdiff.py not using absolute_import
60 60 hgext/factotum.py not using absolute_import
61 61 hgext/fetch.py not using absolute_import
62 62 hgext/gpg.py not using absolute_import
63 63 hgext/graphlog.py not using absolute_import
64 64 hgext/hgcia.py not using absolute_import
65 65 hgext/hgk.py not using absolute_import
66 66 hgext/highlight/__init__.py not using absolute_import
67 67 hgext/highlight/highlight.py not using absolute_import
68 68 hgext/histedit.py not using absolute_import
69 69 hgext/keyword.py not using absolute_import
70 70 hgext/largefiles/__init__.py not using absolute_import
71 71 hgext/largefiles/basestore.py not using absolute_import
72 72 hgext/largefiles/lfcommands.py not using absolute_import
73 73 hgext/largefiles/lfutil.py not using absolute_import
74 74 hgext/largefiles/localstore.py not using absolute_import
75 75 hgext/largefiles/overrides.py not using absolute_import
76 76 hgext/largefiles/proto.py not using absolute_import
77 77 hgext/largefiles/remotestore.py not using absolute_import
78 78 hgext/largefiles/reposetup.py not using absolute_import
79 79 hgext/largefiles/uisetup.py not using absolute_import
80 80 hgext/largefiles/wirestore.py not using absolute_import
81 81 hgext/mq.py not using absolute_import
82 82 hgext/notify.py not using absolute_import
83 83 hgext/pager.py not using absolute_import
84 84 hgext/patchbomb.py not using absolute_import
85 85 hgext/purge.py not using absolute_import
86 86 hgext/rebase.py not using absolute_import
87 87 hgext/record.py not using absolute_import
88 88 hgext/relink.py not using absolute_import
89 89 hgext/schemes.py not using absolute_import
90 90 hgext/share.py not using absolute_import
91 91 hgext/shelve.py not using absolute_import
92 92 hgext/strip.py not using absolute_import
93 93 hgext/transplant.py not using absolute_import
94 94 hgext/win32mbcs.py not using absolute_import
95 95 hgext/win32text.py not using absolute_import
96 96 hgext/zeroconf/Zeroconf.py not using absolute_import
97 97 hgext/zeroconf/Zeroconf.py requires print_function
98 98 hgext/zeroconf/__init__.py not using absolute_import
99 99 i18n/check-translation.py not using absolute_import
100 100 i18n/polib.py not using absolute_import
101 101 mercurial/byterange.py not using absolute_import
102 102 mercurial/cmdutil.py not using absolute_import
103 103 mercurial/commands.py not using absolute_import
104 104 mercurial/commandserver.py not using absolute_import
105 105 mercurial/context.py not using absolute_import
106 106 mercurial/dirstate.py not using absolute_import
107 107 mercurial/dispatch.py requires print_function
108 108 mercurial/encoding.py not using absolute_import
109 109 mercurial/exchange.py not using absolute_import
110 110 mercurial/help.py not using absolute_import
111 111 mercurial/httpclient/__init__.py not using absolute_import
112 112 mercurial/httpclient/_readers.py not using absolute_import
113 113 mercurial/httpclient/socketutil.py not using absolute_import
114 114 mercurial/httpconnection.py not using absolute_import
115 115 mercurial/keepalive.py not using absolute_import
116 116 mercurial/keepalive.py requires print_function
117 117 mercurial/localrepo.py not using absolute_import
118 118 mercurial/lsprof.py requires print_function
119 119 mercurial/lsprofcalltree.py not using absolute_import
120 120 mercurial/lsprofcalltree.py requires print_function
121 121 mercurial/mail.py requires print_function
122 122 mercurial/manifest.py not using absolute_import
123 123 mercurial/mdiff.py not using absolute_import
124 124 mercurial/patch.py not using absolute_import
125 mercurial/pure/osutil.py not using absolute_import
126 125 mercurial/pure/parsers.py not using absolute_import
127 126 mercurial/pvec.py not using absolute_import
128 127 mercurial/py3kcompat.py not using absolute_import
129 128 mercurial/revlog.py not using absolute_import
130 129 mercurial/scmposix.py not using absolute_import
131 130 mercurial/scmutil.py not using absolute_import
132 131 mercurial/scmwindows.py not using absolute_import
133 132 mercurial/similar.py not using absolute_import
134 133 mercurial/store.py not using absolute_import
135 134 mercurial/util.py not using absolute_import
136 135 mercurial/windows.py not using absolute_import
137 136 setup.py not using absolute_import
138 137 tests/filterpyflakes.py requires print_function
139 138 tests/generate-working-copy-states.py requires print_function
140 139 tests/get-with-headers.py requires print_function
141 140 tests/heredoctest.py requires print_function
142 141 tests/hypothesishelpers.py not using absolute_import
143 142 tests/hypothesishelpers.py requires print_function
144 143 tests/killdaemons.py not using absolute_import
145 144 tests/md5sum.py not using absolute_import
146 145 tests/mockblackbox.py not using absolute_import
147 146 tests/printenv.py not using absolute_import
148 147 tests/readlink.py not using absolute_import
149 148 tests/readlink.py requires print_function
150 149 tests/revlog-formatv0.py not using absolute_import
151 150 tests/run-tests.py not using absolute_import
152 151 tests/seq.py not using absolute_import
153 152 tests/seq.py requires print_function
154 153 tests/silenttestrunner.py not using absolute_import
155 154 tests/silenttestrunner.py requires print_function
156 155 tests/sitecustomize.py not using absolute_import
157 156 tests/svn-safe-append.py not using absolute_import
158 157 tests/svnxml.py not using absolute_import
159 158 tests/test-ancestor.py requires print_function
160 159 tests/test-atomictempfile.py not using absolute_import
161 160 tests/test-batching.py not using absolute_import
162 161 tests/test-batching.py requires print_function
163 162 tests/test-bdiff.py not using absolute_import
164 163 tests/test-bdiff.py requires print_function
165 164 tests/test-context.py not using absolute_import
166 165 tests/test-context.py requires print_function
167 166 tests/test-demandimport.py not using absolute_import
168 167 tests/test-demandimport.py requires print_function
169 168 tests/test-dispatch.py not using absolute_import
170 169 tests/test-dispatch.py requires print_function
171 170 tests/test-doctest.py not using absolute_import
172 171 tests/test-duplicateoptions.py not using absolute_import
173 172 tests/test-duplicateoptions.py requires print_function
174 173 tests/test-filecache.py not using absolute_import
175 174 tests/test-filecache.py requires print_function
176 175 tests/test-filelog.py not using absolute_import
177 176 tests/test-filelog.py requires print_function
178 177 tests/test-hg-parseurl.py not using absolute_import
179 178 tests/test-hg-parseurl.py requires print_function
180 179 tests/test-hgweb-auth.py not using absolute_import
181 180 tests/test-hgweb-auth.py requires print_function
182 181 tests/test-hgwebdir-paths.py not using absolute_import
183 182 tests/test-hybridencode.py not using absolute_import
184 183 tests/test-hybridencode.py requires print_function
185 184 tests/test-lrucachedict.py not using absolute_import
186 185 tests/test-lrucachedict.py requires print_function
187 186 tests/test-manifest.py not using absolute_import
188 187 tests/test-minirst.py not using absolute_import
189 188 tests/test-minirst.py requires print_function
190 189 tests/test-parseindex2.py not using absolute_import
191 190 tests/test-parseindex2.py requires print_function
192 191 tests/test-pathencode.py not using absolute_import
193 192 tests/test-pathencode.py requires print_function
194 193 tests/test-propertycache.py not using absolute_import
195 194 tests/test-propertycache.py requires print_function
196 195 tests/test-revlog-ancestry.py not using absolute_import
197 196 tests/test-revlog-ancestry.py requires print_function
198 197 tests/test-run-tests.py not using absolute_import
199 198 tests/test-simplemerge.py not using absolute_import
200 199 tests/test-status-inprocess.py not using absolute_import
201 200 tests/test-status-inprocess.py requires print_function
202 201 tests/test-symlink-os-yes-fs-no.py not using absolute_import
203 202 tests/test-trusted.py not using absolute_import
204 203 tests/test-trusted.py requires print_function
205 204 tests/test-ui-color.py not using absolute_import
206 205 tests/test-ui-color.py requires print_function
207 206 tests/test-ui-config.py not using absolute_import
208 207 tests/test-ui-config.py requires print_function
209 208 tests/test-ui-verbosity.py not using absolute_import
210 209 tests/test-ui-verbosity.py requires print_function
211 210 tests/test-url.py not using absolute_import
212 211 tests/test-url.py requires print_function
213 212 tests/test-walkrepo.py requires print_function
214 213 tests/test-wireproto.py requires print_function
215 214 tests/tinyproxy.py requires print_function
General Comments 0
You need to be logged in to leave comments. Login now