Mercurial > hg
annotate mercurial/win32.py @ 24709:69154e0ae384
strip: properly clear resolve state with --keep (issue4593)
Normal updates automatically clean up the resolve state, but strip
--keep does a "manual" update that bypasses the normal machinery. This
adds a mergestate reset.
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Mon, 13 Apr 2015 07:42:25 -0500 |
parents | 232bf0028596 |
children | 328739ea70c3 |
rev | line source |
---|---|
8226
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
1 # win32.py - utility functions that use win32 API |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
2 # |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
3 # Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
4 # |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
10263 | 6 # GNU General Public License version 2 or any later version. |
8227
0a9542703300
turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents:
8226
diff
changeset
|
7 |
24652
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
8 import ctypes, errno, msvcrt, os, subprocess, random |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
9 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
10 _kernel32 = ctypes.windll.kernel32 |
14345
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
11 _advapi32 = ctypes.windll.advapi32 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
12 _user32 = ctypes.windll.user32 |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
13 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
14 _BOOL = ctypes.c_long |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
15 _WORD = ctypes.c_ushort |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
16 _DWORD = ctypes.c_ulong |
14345
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
17 _UINT = ctypes.c_uint |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
18 _LONG = ctypes.c_long |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
19 _LPCSTR = _LPSTR = ctypes.c_char_p |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
20 _HANDLE = ctypes.c_void_p |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
21 _HWND = _HANDLE |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
22 |
14345
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
23 _INVALID_HANDLE_VALUE = _HANDLE(-1).value |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
24 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
25 # GetLastError |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
26 _ERROR_SUCCESS = 0 |
21193
07f9825865de
win32: add missing definition of _ERROR_NO_MORE_FILES caught by pyflakes
Yuya Nishihara <yuya@tcha.org>
parents:
20528
diff
changeset
|
27 _ERROR_NO_MORE_FILES = 18 |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
28 _ERROR_INVALID_PARAMETER = 87 |
24652
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
29 _ERROR_BROKEN_PIPE = 109 |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
30 _ERROR_INSUFFICIENT_BUFFER = 122 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
31 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
32 # WPARAM is defined as UINT_PTR (unsigned type) |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
33 # LPARAM is defined as LONG_PTR (signed type) |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
34 if ctypes.sizeof(ctypes.c_long) == ctypes.sizeof(ctypes.c_void_p): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
35 _WPARAM = ctypes.c_ulong |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
36 _LPARAM = ctypes.c_long |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
37 elif ctypes.sizeof(ctypes.c_longlong) == ctypes.sizeof(ctypes.c_void_p): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
38 _WPARAM = ctypes.c_ulonglong |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
39 _LPARAM = ctypes.c_longlong |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
40 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
41 class _FILETIME(ctypes.Structure): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
42 _fields_ = [('dwLowDateTime', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
43 ('dwHighDateTime', _DWORD)] |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
44 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
45 class _BY_HANDLE_FILE_INFORMATION(ctypes.Structure): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
46 _fields_ = [('dwFileAttributes', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
47 ('ftCreationTime', _FILETIME), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
48 ('ftLastAccessTime', _FILETIME), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
49 ('ftLastWriteTime', _FILETIME), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
50 ('dwVolumeSerialNumber', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
51 ('nFileSizeHigh', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
52 ('nFileSizeLow', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
53 ('nNumberOfLinks', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
54 ('nFileIndexHigh', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
55 ('nFileIndexLow', _DWORD)] |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
56 |
18959
2f6418d8a4c9
check-code: catch trailing space in comments
Mads Kiilerich <madski@unity3d.com>
parents:
18175
diff
changeset
|
57 # CreateFile |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
58 _FILE_SHARE_READ = 0x00000001 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
59 _FILE_SHARE_WRITE = 0x00000002 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
60 _FILE_SHARE_DELETE = 0x00000004 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
61 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
62 _OPEN_EXISTING = 3 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
63 |
17006
6fc7fd72ba3e
win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents:
16807
diff
changeset
|
64 _FILE_FLAG_BACKUP_SEMANTICS = 0x02000000 |
6fc7fd72ba3e
win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents:
16807
diff
changeset
|
65 |
13776
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
66 # SetFileAttributes |
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
67 _FILE_ATTRIBUTE_NORMAL = 0x80 |
13795
43b5fe18ea6c
set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13776
diff
changeset
|
68 _FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x2000 |
13776
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
69 |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
70 # Process Security and Access Rights |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
71 _PROCESS_QUERY_INFORMATION = 0x0400 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
72 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
73 # GetExitCodeProcess |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
74 _STILL_ACTIVE = 259 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
75 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
76 class _STARTUPINFO(ctypes.Structure): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
77 _fields_ = [('cb', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
78 ('lpReserved', _LPSTR), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
79 ('lpDesktop', _LPSTR), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
80 ('lpTitle', _LPSTR), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
81 ('dwX', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
82 ('dwY', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
83 ('dwXSize', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
84 ('dwYSize', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
85 ('dwXCountChars', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
86 ('dwYCountChars', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
87 ('dwFillAttribute', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
88 ('dwFlags', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
89 ('wShowWindow', _WORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
90 ('cbReserved2', _WORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
91 ('lpReserved2', ctypes.c_char_p), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
92 ('hStdInput', _HANDLE), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
93 ('hStdOutput', _HANDLE), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
94 ('hStdError', _HANDLE)] |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
95 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
96 class _PROCESS_INFORMATION(ctypes.Structure): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
97 _fields_ = [('hProcess', _HANDLE), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
98 ('hThread', _HANDLE), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
99 ('dwProcessId', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
100 ('dwThreadId', _DWORD)] |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
101 |
17050
e780fb37168b
win32: specify _CREATE_NO_WINDOW on spawndetached()
Adrian Buehlmann <adrian@cadifra.com>
parents:
17006
diff
changeset
|
102 _CREATE_NO_WINDOW = 0x08000000 |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
103 _SW_HIDE = 0 |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
104 |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
105 class _COORD(ctypes.Structure): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
106 _fields_ = [('X', ctypes.c_short), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
107 ('Y', ctypes.c_short)] |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
108 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
109 class _SMALL_RECT(ctypes.Structure): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
110 _fields_ = [('Left', ctypes.c_short), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
111 ('Top', ctypes.c_short), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
112 ('Right', ctypes.c_short), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
113 ('Bottom', ctypes.c_short)] |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
114 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
115 class _CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
116 _fields_ = [('dwSize', _COORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
117 ('dwCursorPosition', _COORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
118 ('wAttributes', _WORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
119 ('srWindow', _SMALL_RECT), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
120 ('dwMaximumWindowSize', _COORD)] |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
121 |
14344
e1db8a00188b
win32.py: more explicit definition of _STD_ERROR_HANDLE
Adrian Buehlmann <adrian@cadifra.com>
parents:
14237
diff
changeset
|
122 _STD_ERROR_HANDLE = _DWORD(-12).value |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
123 |
20425
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
124 # CreateToolhelp32Snapshot, Process32First, Process32Next |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
125 _TH32CS_SNAPPROCESS = 0x00000002 |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
126 _MAX_PATH = 260 |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
127 |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
128 class _tagPROCESSENTRY32(ctypes.Structure): |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
129 _fields_ = [('dwsize', _DWORD), |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
130 ('cntUsage', _DWORD), |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
131 ('th32ProcessID', _DWORD), |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
132 ('th32DefaultHeapID', ctypes.c_void_p), |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
133 ('th32ModuleID', _DWORD), |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
134 ('cntThreads', _DWORD), |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
135 ('th32ParentProcessID', _DWORD), |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
136 ('pcPriClassBase', _LONG), |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
137 ('dwFlags', _DWORD), |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
138 ('szExeFile', ctypes.c_char * _MAX_PATH)] |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
139 |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
140 def __init__(self): |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
141 super(_tagPROCESSENTRY32, self).__init__() |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
142 self.dwsize = ctypes.sizeof(self) |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
143 |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
144 |
14345
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
145 # types of parameters of C functions used (required by pypy) |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
146 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
147 _kernel32.CreateFileA.argtypes = [_LPCSTR, _DWORD, _DWORD, ctypes.c_void_p, |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
148 _DWORD, _DWORD, _HANDLE] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
149 _kernel32.CreateFileA.restype = _HANDLE |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
150 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
151 _kernel32.GetFileInformationByHandle.argtypes = [_HANDLE, ctypes.c_void_p] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
152 _kernel32.GetFileInformationByHandle.restype = _BOOL |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
153 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
154 _kernel32.CloseHandle.argtypes = [_HANDLE] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
155 _kernel32.CloseHandle.restype = _BOOL |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
156 |
15095
ec222a29bdf0
win32: quietly ignore missing CreateHardLinkA for Wine
Matt Mackall <mpm@selenic.com>
parents:
14345
diff
changeset
|
157 try: |
ec222a29bdf0
win32: quietly ignore missing CreateHardLinkA for Wine
Matt Mackall <mpm@selenic.com>
parents:
14345
diff
changeset
|
158 _kernel32.CreateHardLinkA.argtypes = [_LPCSTR, _LPCSTR, ctypes.c_void_p] |
ec222a29bdf0
win32: quietly ignore missing CreateHardLinkA for Wine
Matt Mackall <mpm@selenic.com>
parents:
14345
diff
changeset
|
159 _kernel32.CreateHardLinkA.restype = _BOOL |
ec222a29bdf0
win32: quietly ignore missing CreateHardLinkA for Wine
Matt Mackall <mpm@selenic.com>
parents:
14345
diff
changeset
|
160 except AttributeError: |
ec222a29bdf0
win32: quietly ignore missing CreateHardLinkA for Wine
Matt Mackall <mpm@selenic.com>
parents:
14345
diff
changeset
|
161 pass |
14345
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
162 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
163 _kernel32.SetFileAttributesA.argtypes = [_LPCSTR, _DWORD] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
164 _kernel32.SetFileAttributesA.restype = _BOOL |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
165 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
166 _kernel32.OpenProcess.argtypes = [_DWORD, _BOOL, _DWORD] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
167 _kernel32.OpenProcess.restype = _HANDLE |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
168 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
169 _kernel32.GetExitCodeProcess.argtypes = [_HANDLE, ctypes.c_void_p] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
170 _kernel32.GetExitCodeProcess.restype = _BOOL |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
171 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
172 _kernel32.GetLastError.argtypes = [] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
173 _kernel32.GetLastError.restype = _DWORD |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
174 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
175 _kernel32.GetModuleFileNameA.argtypes = [_HANDLE, ctypes.c_void_p, _DWORD] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
176 _kernel32.GetModuleFileNameA.restype = _DWORD |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
177 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
178 _kernel32.CreateProcessA.argtypes = [_LPCSTR, _LPCSTR, ctypes.c_void_p, |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
179 ctypes.c_void_p, _BOOL, _DWORD, ctypes.c_void_p, _LPCSTR, ctypes.c_void_p, |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
180 ctypes.c_void_p] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
181 _kernel32.CreateProcessA.restype = _BOOL |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
182 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
183 _kernel32.ExitProcess.argtypes = [_UINT] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
184 _kernel32.ExitProcess.restype = None |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
185 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
186 _kernel32.GetCurrentProcessId.argtypes = [] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
187 _kernel32.GetCurrentProcessId.restype = _DWORD |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
188 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
189 _SIGNAL_HANDLER = ctypes.WINFUNCTYPE(_BOOL, _DWORD) |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
190 _kernel32.SetConsoleCtrlHandler.argtypes = [_SIGNAL_HANDLER, _BOOL] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
191 _kernel32.SetConsoleCtrlHandler.restype = _BOOL |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
192 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
193 _kernel32.GetStdHandle.argtypes = [_DWORD] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
194 _kernel32.GetStdHandle.restype = _HANDLE |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
195 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
196 _kernel32.GetConsoleScreenBufferInfo.argtypes = [_HANDLE, ctypes.c_void_p] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
197 _kernel32.GetConsoleScreenBufferInfo.restype = _BOOL |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
198 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
199 _advapi32.GetUserNameA.argtypes = [ctypes.c_void_p, ctypes.c_void_p] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
200 _advapi32.GetUserNameA.restype = _BOOL |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
201 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
202 _user32.GetWindowThreadProcessId.argtypes = [_HANDLE, ctypes.c_void_p] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
203 _user32.GetWindowThreadProcessId.restype = _DWORD |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
204 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
205 _user32.ShowWindow.argtypes = [_HANDLE, ctypes.c_int] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
206 _user32.ShowWindow.restype = _BOOL |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
207 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
208 _WNDENUMPROC = ctypes.WINFUNCTYPE(_BOOL, _HWND, _LPARAM) |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
209 _user32.EnumWindows.argtypes = [_WNDENUMPROC, _LPARAM] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
210 _user32.EnumWindows.restype = _BOOL |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
211 |
20425
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
212 _kernel32.CreateToolhelp32Snapshot.argtypes = [_DWORD, _DWORD] |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
213 _kernel32.CreateToolhelp32Snapshot.restype = _BOOL |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
214 |
24652
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
215 _kernel32.PeekNamedPipe.argtypes = [_HANDLE, ctypes.c_void_p, _DWORD, |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
216 ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p] |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
217 _kernel32.PeekNamedPipe.restype = _BOOL |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
218 |
20425
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
219 _kernel32.Process32First.argtypes = [_HANDLE, ctypes.c_void_p] |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
220 _kernel32.Process32First.restype = _BOOL |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
221 |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
222 _kernel32.Process32Next.argtypes = [_HANDLE, ctypes.c_void_p] |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
223 _kernel32.Process32Next.restype = _BOOL |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
224 |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
225 def _raiseoserror(name): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
226 err = ctypes.WinError() |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
227 raise OSError(err.errno, '%s: %s' % (name, err.strerror)) |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
228 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
229 def _getfileinfo(name): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
230 fh = _kernel32.CreateFileA(name, 0, |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
231 _FILE_SHARE_READ | _FILE_SHARE_WRITE | _FILE_SHARE_DELETE, |
17006
6fc7fd72ba3e
win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents:
16807
diff
changeset
|
232 None, _OPEN_EXISTING, _FILE_FLAG_BACKUP_SEMANTICS, None) |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
233 if fh == _INVALID_HANDLE_VALUE: |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
234 _raiseoserror(name) |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
235 try: |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
236 fi = _BY_HANDLE_FILE_INFORMATION() |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
237 if not _kernel32.GetFileInformationByHandle(fh, ctypes.byref(fi)): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
238 _raiseoserror(name) |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
239 return fi |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
240 finally: |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
241 _kernel32.CloseHandle(fh) |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
242 |
14235
b9e1b041744f
rename util.os_link to oslink
Adrian Buehlmann <adrian@cadifra.com>
parents:
14230
diff
changeset
|
243 def oslink(src, dst): |
13976
9ca1ff3d4f8c
win32: Wine doesn't know about hardlinks
Matt Mackall <mpm@selenic.com>
parents:
13795
diff
changeset
|
244 try: |
9ca1ff3d4f8c
win32: Wine doesn't know about hardlinks
Matt Mackall <mpm@selenic.com>
parents:
13795
diff
changeset
|
245 if not _kernel32.CreateHardLinkA(dst, src, None): |
9ca1ff3d4f8c
win32: Wine doesn't know about hardlinks
Matt Mackall <mpm@selenic.com>
parents:
13795
diff
changeset
|
246 _raiseoserror(src) |
9ca1ff3d4f8c
win32: Wine doesn't know about hardlinks
Matt Mackall <mpm@selenic.com>
parents:
13795
diff
changeset
|
247 except AttributeError: # Wine doesn't support this function |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
248 _raiseoserror(src) |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
249 |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
250 def nlinks(name): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
251 '''return number of hardlinks for the given file''' |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
252 return _getfileinfo(name).nNumberOfLinks |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
253 |
17006
6fc7fd72ba3e
win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents:
16807
diff
changeset
|
254 def samefile(path1, path2): |
6fc7fd72ba3e
win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents:
16807
diff
changeset
|
255 '''Returns whether path1 and path2 refer to the same file or directory.''' |
6fc7fd72ba3e
win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents:
16807
diff
changeset
|
256 res1 = _getfileinfo(path1) |
6fc7fd72ba3e
win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents:
16807
diff
changeset
|
257 res2 = _getfileinfo(path2) |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
258 return (res1.dwVolumeSerialNumber == res2.dwVolumeSerialNumber |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
259 and res1.nFileIndexHigh == res2.nFileIndexHigh |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
260 and res1.nFileIndexLow == res2.nFileIndexLow) |
10218
750b7a4f01f6
Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents:
9198
diff
changeset
|
261 |
17006
6fc7fd72ba3e
win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents:
16807
diff
changeset
|
262 def samedevice(path1, path2): |
6fc7fd72ba3e
win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents:
16807
diff
changeset
|
263 '''Returns whether path1 and path2 are on the same device.''' |
6fc7fd72ba3e
win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents:
16807
diff
changeset
|
264 res1 = _getfileinfo(path1) |
6fc7fd72ba3e
win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents:
16807
diff
changeset
|
265 res2 = _getfileinfo(path2) |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
266 return res1.dwVolumeSerialNumber == res2.dwVolumeSerialNumber |
10218
750b7a4f01f6
Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents:
9198
diff
changeset
|
267 |
24652
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
268 def peekpipe(pipe): |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
269 handle = msvcrt.get_osfhandle(pipe.fileno()) |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
270 avail = _DWORD() |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
271 |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
272 if not _kernel32.PeekNamedPipe(handle, None, 0, None, ctypes.byref(avail), |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
273 None): |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
274 err = _kernel32.GetLastError() |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
275 if err == _ERROR_BROKEN_PIPE: |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
276 return 0 |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
277 raise ctypes.WinError(err) |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
278 |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
279 return avail.value |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
280 |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
281 def testpid(pid): |
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
282 '''return True if pid is still running or unable to |
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
283 determine, False otherwise''' |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
284 h = _kernel32.OpenProcess(_PROCESS_QUERY_INFORMATION, False, pid) |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
285 if h: |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
286 try: |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
287 status = _DWORD() |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
288 if _kernel32.GetExitCodeProcess(h, ctypes.byref(status)): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
289 return status.value == _STILL_ACTIVE |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
290 finally: |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
291 _kernel32.CloseHandle(h) |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
292 return _kernel32.GetLastError() != _ERROR_INVALID_PARAMETER |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
293 |
14236
e949a008999d
rename util.executable_path to executablepath
Adrian Buehlmann <adrian@cadifra.com>
parents:
14235
diff
changeset
|
294 def executablepath(): |
13376
60b5c6c3fd12
win32: new function executable_path
Adrian Buehlmann <adrian@cadifra.com>
parents:
13375
diff
changeset
|
295 '''return full path of hg.exe''' |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
296 size = 600 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
297 buf = ctypes.create_string_buffer(size + 1) |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
298 len = _kernel32.GetModuleFileNameA(None, ctypes.byref(buf), size) |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
299 if len == 0: |
24494
f2b87f4856bf
win32: add comment about WinError
Adrian Buehlmann <adrian@cadifra.com>
parents:
24418
diff
changeset
|
300 raise ctypes.WinError() # Note: WinError is a function |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
301 elif len == size: |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
302 raise ctypes.WinError(_ERROR_INSUFFICIENT_BUFFER) |
13376
60b5c6c3fd12
win32: new function executable_path
Adrian Buehlmann <adrian@cadifra.com>
parents:
13375
diff
changeset
|
303 return buf.value |
60b5c6c3fd12
win32: new function executable_path
Adrian Buehlmann <adrian@cadifra.com>
parents:
13375
diff
changeset
|
304 |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7778
diff
changeset
|
305 def getuser(): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7778
diff
changeset
|
306 '''return name of current user''' |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
307 size = _DWORD(300) |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
308 buf = ctypes.create_string_buffer(size.value + 1) |
14345
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
309 if not _advapi32.GetUserNameA(ctypes.byref(buf), ctypes.byref(size)): |
24418
a2285e2fc949
win32: 'raise ctypes.WinError' -> 'raise ctypes.WinError()'
Matt Harbison <matt_harbison@yahoo.com>
parents:
21226
diff
changeset
|
310 raise ctypes.WinError() |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
311 return buf.value |
4672
272c0a09b203
Handle CTRL+C in serve under Windows.
Marcos Chaves <marcos.nospam@gmail.com>
parents:
4407
diff
changeset
|
312 |
14237
4d684d8210a1
rename util.set_signal_handler to setsignalhandler
Adrian Buehlmann <adrian@cadifra.com>
parents:
14236
diff
changeset
|
313 _signalhandler = [] |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
314 |
14237
4d684d8210a1
rename util.set_signal_handler to setsignalhandler
Adrian Buehlmann <adrian@cadifra.com>
parents:
14236
diff
changeset
|
315 def setsignalhandler(): |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
316 '''Register a termination handler for console events including |
4672
272c0a09b203
Handle CTRL+C in serve under Windows.
Marcos Chaves <marcos.nospam@gmail.com>
parents:
4407
diff
changeset
|
317 CTRL+C. python signal handlers do not work well with socket |
272c0a09b203
Handle CTRL+C in serve under Windows.
Marcos Chaves <marcos.nospam@gmail.com>
parents:
4407
diff
changeset
|
318 operations. |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
319 ''' |
4672
272c0a09b203
Handle CTRL+C in serve under Windows.
Marcos Chaves <marcos.nospam@gmail.com>
parents:
4407
diff
changeset
|
320 def handler(event): |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
321 _kernel32.ExitProcess(1) |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
322 |
14237
4d684d8210a1
rename util.set_signal_handler to setsignalhandler
Adrian Buehlmann <adrian@cadifra.com>
parents:
14236
diff
changeset
|
323 if _signalhandler: |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
324 return # already registered |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
325 h = _SIGNAL_HANDLER(handler) |
14237
4d684d8210a1
rename util.set_signal_handler to setsignalhandler
Adrian Buehlmann <adrian@cadifra.com>
parents:
14236
diff
changeset
|
326 _signalhandler.append(h) # needed to prevent garbage collection |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
327 if not _kernel32.SetConsoleCtrlHandler(h, True): |
24418
a2285e2fc949
win32: 'raise ctypes.WinError' -> 'raise ctypes.WinError()'
Matt Harbison <matt_harbison@yahoo.com>
parents:
21226
diff
changeset
|
328 raise ctypes.WinError() |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
329 |
10240
3af4b39afe2a
cmdutil: hide child window created by win32 spawndetached()
Patrick Mezard <pmezard@gmail.com>
parents:
10219
diff
changeset
|
330 def hidewindow(): |
3af4b39afe2a
cmdutil: hide child window created by win32 spawndetached()
Patrick Mezard <pmezard@gmail.com>
parents:
10219
diff
changeset
|
331 |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
332 def callback(hwnd, pid): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
333 wpid = _DWORD() |
14345
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
334 _user32.GetWindowThreadProcessId(hwnd, ctypes.byref(wpid)) |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
335 if pid == wpid.value: |
14345
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
336 _user32.ShowWindow(hwnd, _SW_HIDE) |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
337 return False # stop enumerating windows |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
338 return True |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
339 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
340 pid = _kernel32.GetCurrentProcessId() |
14345
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
341 _user32.EnumWindows(_WNDENUMPROC(callback), pid) |
11012
81631f0cf13b
win32: detect console width on Windows
Patrick Mezard <pmezard@gmail.com>
parents:
10388
diff
changeset
|
342 |
12689
c52c629ce19e
termwidth: move to ui.ui from util
Augie Fackler <durin42@gmail.com>
parents:
12401
diff
changeset
|
343 def termwidth(): |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
344 # cmd.exe does not handle CR like a unix console, the CR is |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
345 # counted in the line length. On 80 columns consoles, if 80 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
346 # characters are written, the following CR won't apply on the |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
347 # current line but on the new one. Keep room for it. |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
348 width = 79 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
349 # Query stderr to avoid problems with redirections |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
350 screenbuf = _kernel32.GetStdHandle( |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
351 _STD_ERROR_HANDLE) # don't close the handle returned |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
352 if screenbuf is None or screenbuf == _INVALID_HANDLE_VALUE: |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
353 return width |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
354 csbi = _CONSOLE_SCREEN_BUFFER_INFO() |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
355 if not _kernel32.GetConsoleScreenBufferInfo( |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
356 screenbuf, ctypes.byref(csbi)): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
357 return width |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
358 width = csbi.srWindow.Right - csbi.srWindow.Left |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
359 return width |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
360 |
20425
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
361 def _1stchild(pid): |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
362 '''return the 1st found child of the given pid |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
363 |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
364 None is returned when no child is found''' |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
365 pe = _tagPROCESSENTRY32() |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
366 |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
367 # create handle to list all processes |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
368 ph = _kernel32.CreateToolhelp32Snapshot(_TH32CS_SNAPPROCESS, 0) |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
369 if ph == _INVALID_HANDLE_VALUE: |
24418
a2285e2fc949
win32: 'raise ctypes.WinError' -> 'raise ctypes.WinError()'
Matt Harbison <matt_harbison@yahoo.com>
parents:
21226
diff
changeset
|
370 raise ctypes.WinError() |
20425
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
371 try: |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
372 r = _kernel32.Process32First(ph, ctypes.byref(pe)) |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
373 # loop over all processes |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
374 while r: |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
375 if pe.th32ParentProcessID == pid: |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
376 # return first child found |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
377 return pe.th32ProcessID |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
378 r = _kernel32.Process32Next(ph, ctypes.byref(pe)) |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
379 finally: |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
380 _kernel32.CloseHandle(ph) |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
381 if _kernel32.GetLastError() != _ERROR_NO_MORE_FILES: |
24418
a2285e2fc949
win32: 'raise ctypes.WinError' -> 'raise ctypes.WinError()'
Matt Harbison <matt_harbison@yahoo.com>
parents:
21226
diff
changeset
|
382 raise ctypes.WinError() |
20425
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
383 return None # no child found |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
384 |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
385 class _tochildpid(int): # pid is _DWORD, which always matches in an int |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
386 '''helper for spawndetached, returns the child pid on conversion to string |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
387 |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
388 Does not resolve the child pid immediately because the child may not yet be |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
389 started. |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
390 ''' |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
391 def childpid(self): |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
392 '''returns the child pid of the first found child of the process |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
393 with this pid''' |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
394 return _1stchild(self) |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
395 def __str__(self): |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
396 # run when the pid is written to the file |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
397 ppid = self.childpid() |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
398 if ppid is None: |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
399 # race, child has exited since check |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
400 # fall back to this pid. Its process will also have disappeared, |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
401 # raising the same error type later as when the child pid would |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
402 # be returned. |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
403 return " %d" % self |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
404 return str(ppid) |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
405 |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
406 def spawndetached(args): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
407 # No standard library function really spawns a fully detached |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
408 # process under win32 because they allocate pipes or other objects |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
409 # to handle standard streams communications. Passing these objects |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
410 # to the child process requires handle inheritance to be enabled |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
411 # which makes really detached processes impossible. |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
412 si = _STARTUPINFO() |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
413 si.cb = ctypes.sizeof(_STARTUPINFO) |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
414 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
415 pi = _PROCESS_INFORMATION() |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
416 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
417 env = '' |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
418 for k in os.environ: |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
419 env += "%s=%s\0" % (k, os.environ[k]) |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
420 if not env: |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
421 env = '\0' |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
422 env += '\0' |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
423 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
424 args = subprocess.list2cmdline(args) |
17428
72803c8edaa4
avoid using abbreviations that look like spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17051
diff
changeset
|
425 # Not running the command in shell mode makes Python 2.6 hang when |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
426 # writing to hgweb output socket. |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
427 comspec = os.environ.get("COMSPEC", "cmd.exe") |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
428 args = comspec + " /c " + args |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
429 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
430 res = _kernel32.CreateProcessA( |
17050
e780fb37168b
win32: specify _CREATE_NO_WINDOW on spawndetached()
Adrian Buehlmann <adrian@cadifra.com>
parents:
17006
diff
changeset
|
431 None, args, None, None, False, _CREATE_NO_WINDOW, |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
432 env, os.getcwd(), ctypes.byref(si), ctypes.byref(pi)) |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
433 if not res: |
24418
a2285e2fc949
win32: 'raise ctypes.WinError' -> 'raise ctypes.WinError()'
Matt Harbison <matt_harbison@yahoo.com>
parents:
21226
diff
changeset
|
434 raise ctypes.WinError() |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
435 |
20425
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
436 # _tochildpid because the process is the child of COMSPEC |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
437 return _tochildpid(pi.dwProcessId) |
13775
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
438 |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
439 def unlink(f): |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
440 '''try to implement POSIX' unlink semantics on Windows''' |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
441 |
21226
4898c37e03c0
win32: backout 1a9ebc83a74c
Steve Borho <steve@borho.org>
parents:
21193
diff
changeset
|
442 if os.path.isdir(f): |
4898c37e03c0
win32: backout 1a9ebc83a74c
Steve Borho <steve@borho.org>
parents:
21193
diff
changeset
|
443 # use EPERM because it is POSIX prescribed value, even though |
4898c37e03c0
win32: backout 1a9ebc83a74c
Steve Borho <steve@borho.org>
parents:
21193
diff
changeset
|
444 # unlink(2) on directories returns EISDIR on Linux |
4898c37e03c0
win32: backout 1a9ebc83a74c
Steve Borho <steve@borho.org>
parents:
21193
diff
changeset
|
445 raise IOError(errno.EPERM, |
4898c37e03c0
win32: backout 1a9ebc83a74c
Steve Borho <steve@borho.org>
parents:
21193
diff
changeset
|
446 "Unlinking directory not permitted: '%s'" % f) |
19159
1b329f8c7b24
windows: check target type before actual unlinking to follow POSIX semantics
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18959
diff
changeset
|
447 |
13775
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
448 # POSIX allows to unlink and rename open files. Windows has serious |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
449 # problems with doing that: |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
450 # - Calling os.unlink (or os.rename) on a file f fails if f or any |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
451 # hardlinked copy of f has been opened with Python's open(). There is no |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
452 # way such a file can be deleted or renamed on Windows (other than |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
453 # scheduling the delete or rename for the next reboot). |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
454 # - Calling os.unlink on a file that has been opened with Mercurial's |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
455 # posixfile (or comparable methods) will delay the actual deletion of |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
456 # the file for as long as the file is held open. The filename is blocked |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
457 # during that time and cannot be used for recreating a new file under |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
458 # that same name ("zombie file"). Directories containing such zombie files |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
459 # cannot be removed or moved. |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
460 # A file that has been opened with posixfile can be renamed, so we rename |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
461 # f to a random temporary name before calling os.unlink on it. This allows |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
462 # callers to recreate f immediately while having other readers do their |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
463 # implicit zombie filename blocking on a temporary name. |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
464 |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
465 for tries in xrange(10): |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
466 temp = '%s-%08x' % (f, random.randint(0, 0xffffffff)) |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
467 try: |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
468 os.rename(f, temp) # raises OSError EEXIST if temp exists |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
469 break |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
470 except OSError, e: |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
471 if e.errno != errno.EEXIST: |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
472 raise |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
473 else: |
18175
fd3f8b87b682
win32: clean up use of two-argument raise
Augie Fackler <raf@durin42.com>
parents:
17428
diff
changeset
|
474 raise IOError(errno.EEXIST, "No usable temporary filename found") |
13775
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
475 |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
476 try: |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
477 os.unlink(temp) |
13776
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
478 except OSError: |
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
479 # The unlink might have failed because the READONLY attribute may heave |
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
480 # been set on the original file. Rename works fine with READONLY set, |
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
481 # but not os.unlink. Reset all attributes and try again. |
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
482 _kernel32.SetFileAttributesA(temp, _FILE_ATTRIBUTE_NORMAL) |
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
483 try: |
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
484 os.unlink(temp) |
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
485 except OSError: |
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
486 # The unlink might have failed due to some very rude AV-Scanners. |
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
487 # Leaking a tempfile is the lesser evil than aborting here and |
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
488 # leaving some potentially serious inconsistencies. |
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
489 pass |
13795
43b5fe18ea6c
set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13776
diff
changeset
|
490 |
43b5fe18ea6c
set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13776
diff
changeset
|
491 def makedir(path, notindexed): |
43b5fe18ea6c
set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13776
diff
changeset
|
492 os.mkdir(path) |
43b5fe18ea6c
set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13776
diff
changeset
|
493 if notindexed: |
43b5fe18ea6c
set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13776
diff
changeset
|
494 _kernel32.SetFileAttributesA(path, _FILE_ATTRIBUTE_NOT_CONTENT_INDEXED) |