annotate mercurial/win32.py @ 46136:3158522085f0

setup: exclude the git extension from py2 builds This can't be built on Windows with the py2 compiler, and while old versions can be installed via pip on Linux, I can't get the tests to run (even with py3.8) using pygit2 0.28.2. Some manually run commands work, and others spew stack traces that don't occur with the current 1.4.0 release using py3. Differential Revision: https://phab.mercurial-scm.org/D9604
author Matt Harbison <matt_harbison@yahoo.com>
date Mon, 14 Dec 2020 17:59:10 -0500
parents 89a2afe31e82
children 65f437c240f2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10219
diff changeset
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
25994
d6beeb618700 win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
8 from __future__ import absolute_import
d6beeb618700 win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
9
d6beeb618700 win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
10 import ctypes
35549
94a127152e25 win32: allocate buffer of maximum length for GetVolumeInformation()
Yuya Nishihara <yuya@tcha.org>
parents: 35512
diff changeset
11 import ctypes.wintypes as wintypes
25994
d6beeb618700 win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
12 import errno
d6beeb618700 win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
13 import msvcrt
d6beeb618700 win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
14 import os
d6beeb618700 win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
15 import random
d6beeb618700 win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
16 import subprocess
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
17
30667
5861bdbeb9a3 py3: use pycompat.getcwd instead of os.getcwd
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30637
diff changeset
18 from . import (
5861bdbeb9a3 py3: use pycompat.getcwd instead of os.getcwd
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30637
diff changeset
19 encoding,
5861bdbeb9a3 py3: use pycompat.getcwd instead of os.getcwd
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30637
diff changeset
20 pycompat,
5861bdbeb9a3 py3: use pycompat.getcwd instead of os.getcwd
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30637
diff changeset
21 )
30637
344e68882cd3 py3: replace os.environ with encoding.environ (part 4 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30314
diff changeset
22
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
23 _kernel32 = ctypes.windll.kernel32
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
24 _advapi32 = ctypes.windll.advapi32
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
25 _user32 = ctypes.windll.user32
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
26 _crypt32 = ctypes.windll.crypt32
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
27
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
28 _BOOL = ctypes.c_long
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
29 _WORD = ctypes.c_ushort
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
30 _DWORD = ctypes.c_ulong
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
31 _UINT = ctypes.c_uint
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
32 _LONG = ctypes.c_long
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
33 _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
34 _HANDLE = ctypes.c_void_p
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
35 _HWND = _HANDLE
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
36 _PCCERT_CONTEXT = ctypes.c_void_p
35549
94a127152e25 win32: allocate buffer of maximum length for GetVolumeInformation()
Yuya Nishihara <yuya@tcha.org>
parents: 35512
diff changeset
37 _MAX_PATH = wintypes.MAX_PATH
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
38
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
39 _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
40
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
41 # GetLastError
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
42 _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
43 _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
44 _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
45 _ERROR_BROKEN_PIPE = 109
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
46 _ERROR_INSUFFICIENT_BUFFER = 122
38533
3a0f322af192 windows: fix incorrect detection of broken pipe when writing to pager
Sune Foldager <cryo@cyanite.org>
parents: 35550
diff changeset
47 _ERROR_NO_DATA = 232
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
48
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
49 # 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
50 # 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
51 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
52 _WPARAM = ctypes.c_ulong
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
53 _LPARAM = ctypes.c_long
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
54 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
55 _WPARAM = ctypes.c_ulonglong
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
56 _LPARAM = ctypes.c_longlong
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
57
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
58
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
59 class _FILETIME(ctypes.Structure):
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
60 _fields_ = [('dwLowDateTime', _DWORD), ('dwHighDateTime', _DWORD)]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
61
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
62
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
63 class _BY_HANDLE_FILE_INFORMATION(ctypes.Structure):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
64 _fields_ = [
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
65 ('dwFileAttributes', _DWORD),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
66 ('ftCreationTime', _FILETIME),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
67 ('ftLastAccessTime', _FILETIME),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
68 ('ftLastWriteTime', _FILETIME),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
69 ('dwVolumeSerialNumber', _DWORD),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
70 ('nFileSizeHigh', _DWORD),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
71 ('nFileSizeLow', _DWORD),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
72 ('nNumberOfLinks', _DWORD),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
73 ('nFileIndexHigh', _DWORD),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
74 ('nFileIndexLow', _DWORD),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
75 ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
76
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
77
18959
2f6418d8a4c9 check-code: catch trailing space in comments
Mads Kiilerich <madski@unity3d.com>
parents: 18175
diff changeset
78 # CreateFile
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
79 _FILE_SHARE_READ = 0x00000001
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
80 _FILE_SHARE_WRITE = 0x00000002
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
81 _FILE_SHARE_DELETE = 0x00000004
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
82
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
83 _OPEN_EXISTING = 3
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
84
17006
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
85 _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
86
13776
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
87 # SetFileAttributes
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
88 _FILE_ATTRIBUTE_NORMAL = 0x80
13795
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13776
diff changeset
89 _FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x2000
13776
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
90
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
91 # Process Security and Access Rights
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
92 _PROCESS_QUERY_INFORMATION = 0x0400
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
93
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
94 # GetExitCodeProcess
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
95 _STILL_ACTIVE = 259
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
96
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
97
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
98 class _STARTUPINFO(ctypes.Structure):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
99 _fields_ = [
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
100 ('cb', _DWORD),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
101 ('lpReserved', _LPSTR),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
102 ('lpDesktop', _LPSTR),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
103 ('lpTitle', _LPSTR),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
104 ('dwX', _DWORD),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
105 ('dwY', _DWORD),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
106 ('dwXSize', _DWORD),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
107 ('dwYSize', _DWORD),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
108 ('dwXCountChars', _DWORD),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
109 ('dwYCountChars', _DWORD),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
110 ('dwFillAttribute', _DWORD),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
111 ('dwFlags', _DWORD),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
112 ('wShowWindow', _WORD),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
113 ('cbReserved2', _WORD),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
114 ('lpReserved2', ctypes.c_char_p),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
115 ('hStdInput', _HANDLE),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
116 ('hStdOutput', _HANDLE),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
117 ('hStdError', _HANDLE),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
118 ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
119
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
120
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
121 class _PROCESS_INFORMATION(ctypes.Structure):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
122 _fields_ = [
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
123 ('hProcess', _HANDLE),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
124 ('hThread', _HANDLE),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
125 ('dwProcessId', _DWORD),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
126 ('dwThreadId', _DWORD),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
127 ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
128
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
129
17050
e780fb37168b win32: specify _CREATE_NO_WINDOW on spawndetached()
Adrian Buehlmann <adrian@cadifra.com>
parents: 17006
diff changeset
130 _CREATE_NO_WINDOW = 0x08000000
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
131 _SW_HIDE = 0
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
132
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
133
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
134 class _COORD(ctypes.Structure):
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
135 _fields_ = [('X', ctypes.c_short), ('Y', ctypes.c_short)]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
136
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
137
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
138 class _SMALL_RECT(ctypes.Structure):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
139 _fields_ = [
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
140 ('Left', ctypes.c_short),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
141 ('Top', ctypes.c_short),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
142 ('Right', ctypes.c_short),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
143 ('Bottom', ctypes.c_short),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
144 ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
145
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
146
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
147 class _CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
148 _fields_ = [
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
149 ('dwSize', _COORD),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
150 ('dwCursorPosition', _COORD),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
151 ('wAttributes', _WORD),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
152 ('srWindow', _SMALL_RECT),
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
153 ('dwMaximumWindowSize', _COORD),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
154 ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
155
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
156
32664
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
157 _STD_OUTPUT_HANDLE = _DWORD(-11).value
14344
e1db8a00188b win32.py: more explicit definition of _STD_ERROR_HANDLE
Adrian Buehlmann <adrian@cadifra.com>
parents: 14237
diff changeset
158 _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
159
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
160 # CERT_TRUST_STATUS dwErrorStatus
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
161 CERT_TRUST_IS_PARTIAL_CHAIN = 0x10000
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
162
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
163 # CertCreateCertificateContext encodings
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
164 X509_ASN_ENCODING = 0x00000001
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
165 PKCS_7_ASN_ENCODING = 0x00010000
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
166
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
167 # These structs are only complete enough to achieve what we need.
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
168 class CERT_CHAIN_CONTEXT(ctypes.Structure):
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
169 _fields_ = (
43503
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
170 ("cbSize", _DWORD),
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
171 # CERT_TRUST_STATUS struct
43503
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
172 ("dwErrorStatus", _DWORD),
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
173 ("dwInfoStatus", _DWORD),
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
174 ("cChain", _DWORD),
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
175 ("rgpChain", ctypes.c_void_p),
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
176 ("cLowerQualityChainContext", _DWORD),
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
177 ("rgpLowerQualityChainContext", ctypes.c_void_p),
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
178 ("fHasRevocationFreshnessTime", _BOOL),
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
179 ("dwRevocationFreshnessTime", _DWORD),
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
180 )
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
181
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
182
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
183 class CERT_USAGE_MATCH(ctypes.Structure):
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
184 _fields_ = (
43503
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
185 ("dwType", _DWORD),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
186 # CERT_ENHKEY_USAGE struct
43503
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
187 ("cUsageIdentifier", _DWORD),
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
188 ("rgpszUsageIdentifier", ctypes.c_void_p), # LPSTR *
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
189 )
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
190
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
191
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
192 class CERT_CHAIN_PARA(ctypes.Structure):
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
193 _fields_ = (
43503
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
194 ("cbSize", _DWORD),
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
195 ("RequestedUsage", CERT_USAGE_MATCH),
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
196 ("RequestedIssuancePolicy", CERT_USAGE_MATCH),
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
197 ("dwUrlRetrievalTimeout", _DWORD),
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
198 ("fCheckRevocationFreshnessTime", _BOOL),
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
199 ("dwRevocationFreshnessTime", _DWORD),
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
200 ("pftCacheResync", ctypes.c_void_p), # LPFILETIME
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
201 ("pStrongSignPara", ctypes.c_void_p), # PCCERT_STRONG_SIGN_PARA
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
202 ("dwStrongSignFlags", _DWORD),
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
203 )
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
204
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
205
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
206 # 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
207
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
208 _crypt32.CertCreateCertificateContext.argtypes = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
209 _DWORD, # cert encoding
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
210 ctypes.c_char_p, # cert
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
211 _DWORD,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
212 ] # cert size
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
213 _crypt32.CertCreateCertificateContext.restype = _PCCERT_CONTEXT
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
214
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
215 _crypt32.CertGetCertificateChain.argtypes = [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
216 ctypes.c_void_p, # HCERTCHAINENGINE
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
217 _PCCERT_CONTEXT,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
218 ctypes.c_void_p, # LPFILETIME
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
219 ctypes.c_void_p, # HCERTSTORE
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
220 ctypes.c_void_p, # PCERT_CHAIN_PARA
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
221 _DWORD,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
222 ctypes.c_void_p, # LPVOID
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
223 ctypes.c_void_p, # PCCERT_CHAIN_CONTEXT *
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
224 ]
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
225 _crypt32.CertGetCertificateChain.restype = _BOOL
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
226
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
227 _crypt32.CertFreeCertificateContext.argtypes = [_PCCERT_CONTEXT]
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
228 _crypt32.CertFreeCertificateContext.restype = _BOOL
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
229
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
230 _kernel32.CreateFileA.argtypes = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
231 _LPCSTR,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
232 _DWORD,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
233 _DWORD,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
234 ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
235 _DWORD,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
236 _DWORD,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
237 _HANDLE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
238 ]
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
239 _kernel32.CreateFileA.restype = _HANDLE
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
240
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
241 _kernel32.GetFileInformationByHandle.argtypes = [_HANDLE, ctypes.c_void_p]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
242 _kernel32.GetFileInformationByHandle.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
243
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
244 _kernel32.CloseHandle.argtypes = [_HANDLE]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
245 _kernel32.CloseHandle.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
246
15095
ec222a29bdf0 win32: quietly ignore missing CreateHardLinkA for Wine
Matt Mackall <mpm@selenic.com>
parents: 14345
diff changeset
247 try:
ec222a29bdf0 win32: quietly ignore missing CreateHardLinkA for Wine
Matt Mackall <mpm@selenic.com>
parents: 14345
diff changeset
248 _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
249 _kernel32.CreateHardLinkA.restype = _BOOL
ec222a29bdf0 win32: quietly ignore missing CreateHardLinkA for Wine
Matt Mackall <mpm@selenic.com>
parents: 14345
diff changeset
250 except AttributeError:
ec222a29bdf0 win32: quietly ignore missing CreateHardLinkA for Wine
Matt Mackall <mpm@selenic.com>
parents: 14345
diff changeset
251 pass
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
252
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
253 _kernel32.SetFileAttributesA.argtypes = [_LPCSTR, _DWORD]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
254 _kernel32.SetFileAttributesA.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
255
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
256 _DRIVE_UNKNOWN = 0
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
257 _DRIVE_NO_ROOT_DIR = 1
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
258 _DRIVE_REMOVABLE = 2
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
259 _DRIVE_FIXED = 3
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
260 _DRIVE_REMOTE = 4
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
261 _DRIVE_CDROM = 5
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
262 _DRIVE_RAMDISK = 6
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
263
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
264 _kernel32.GetDriveTypeA.argtypes = [_LPCSTR]
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
265 _kernel32.GetDriveTypeA.restype = _UINT
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
266
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
267 _kernel32.GetVolumeInformationA.argtypes = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
268 _LPCSTR,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
269 ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
270 _DWORD,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
271 ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
272 ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
273 ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
274 ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
275 _DWORD,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
276 ]
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
277 _kernel32.GetVolumeInformationA.restype = _BOOL
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
278
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
279 _kernel32.GetVolumePathNameA.argtypes = [_LPCSTR, ctypes.c_void_p, _DWORD]
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
280 _kernel32.GetVolumePathNameA.restype = _BOOL
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
281
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
282 _kernel32.OpenProcess.argtypes = [_DWORD, _BOOL, _DWORD]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
283 _kernel32.OpenProcess.restype = _HANDLE
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
284
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
285 _kernel32.GetExitCodeProcess.argtypes = [_HANDLE, ctypes.c_void_p]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
286 _kernel32.GetExitCodeProcess.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
287
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
288 _kernel32.GetLastError.argtypes = []
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
289 _kernel32.GetLastError.restype = _DWORD
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
290
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
291 _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
292 _kernel32.GetModuleFileNameA.restype = _DWORD
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
293
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
294 _kernel32.CreateProcessA.argtypes = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
295 _LPCSTR,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
296 _LPCSTR,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
297 ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
298 ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
299 _BOOL,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
300 _DWORD,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
301 ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
302 _LPCSTR,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
303 ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
304 ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
305 ]
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
306 _kernel32.CreateProcessA.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
307
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
308 _kernel32.ExitProcess.argtypes = [_UINT]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
309 _kernel32.ExitProcess.restype = None
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
310
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
311 _kernel32.GetCurrentProcessId.argtypes = []
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
312 _kernel32.GetCurrentProcessId.restype = _DWORD
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
313
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
314 _SIGNAL_HANDLER = ctypes.WINFUNCTYPE(_BOOL, _DWORD)
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
315 _kernel32.SetConsoleCtrlHandler.argtypes = [_SIGNAL_HANDLER, _BOOL]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
316 _kernel32.SetConsoleCtrlHandler.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
317
32664
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
318 _kernel32.SetConsoleMode.argtypes = [_HANDLE, _DWORD]
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
319 _kernel32.SetConsoleMode.restype = _BOOL
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
320
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
321 _kernel32.GetConsoleMode.argtypes = [_HANDLE, ctypes.c_void_p]
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
322 _kernel32.GetConsoleMode.restype = _BOOL
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
323
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
324 _kernel32.GetStdHandle.argtypes = [_DWORD]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
325 _kernel32.GetStdHandle.restype = _HANDLE
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
326
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
327 _kernel32.GetConsoleScreenBufferInfo.argtypes = [_HANDLE, ctypes.c_void_p]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
328 _kernel32.GetConsoleScreenBufferInfo.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
329
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
330 _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
331 _advapi32.GetUserNameA.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
332
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
333 _user32.GetWindowThreadProcessId.argtypes = [_HANDLE, ctypes.c_void_p]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
334 _user32.GetWindowThreadProcessId.restype = _DWORD
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
335
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
336 _user32.ShowWindow.argtypes = [_HANDLE, ctypes.c_int]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
337 _user32.ShowWindow.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
338
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
339 _WNDENUMPROC = ctypes.WINFUNCTYPE(_BOOL, _HWND, _LPARAM)
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
340 _user32.EnumWindows.argtypes = [_WNDENUMPROC, _LPARAM]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
341 _user32.EnumWindows.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
342
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
343 _kernel32.PeekNamedPipe.argtypes = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
344 _HANDLE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
345 ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
346 _DWORD,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
347 ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
348 ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
349 ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
350 ]
24652
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
351 _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
352
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
353
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
354 def _raiseoserror(name):
33419
7c33adc823e0 win32: work around a WinError problem handling HRESULT types
Matt Harbison <matt_harbison@yahoo.com>
parents: 32676
diff changeset
355 # Force the code to a signed int to avoid an 'int too large' error.
7c33adc823e0 win32: work around a WinError problem handling HRESULT types
Matt Harbison <matt_harbison@yahoo.com>
parents: 32676
diff changeset
356 # See https://bugs.python.org/issue28474
7c33adc823e0 win32: work around a WinError problem handling HRESULT types
Matt Harbison <matt_harbison@yahoo.com>
parents: 32676
diff changeset
357 code = _kernel32.GetLastError()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
358 if code > 0x7FFFFFFF:
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
359 code -= 2 ** 32
33419
7c33adc823e0 win32: work around a WinError problem handling HRESULT types
Matt Harbison <matt_harbison@yahoo.com>
parents: 32676
diff changeset
360 err = ctypes.WinError(code=code)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
361 raise OSError(
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
362 err.errno, '%s: %s' % (encoding.strfromlocal(name), err.strerror)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
363 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
364
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
365
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
366 def _getfileinfo(name):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
367 fh = _kernel32.CreateFileA(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
368 name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
369 0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
370 _FILE_SHARE_READ | _FILE_SHARE_WRITE | _FILE_SHARE_DELETE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
371 None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
372 _OPEN_EXISTING,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
373 _FILE_FLAG_BACKUP_SEMANTICS,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
374 None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
375 )
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
376 if fh == _INVALID_HANDLE_VALUE:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
377 _raiseoserror(name)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
378 try:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
379 fi = _BY_HANDLE_FILE_INFORMATION()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
380 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
381 _raiseoserror(name)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
382 return fi
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
383 finally:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
384 _kernel32.CloseHandle(fh)
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
385
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
386
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
387 def checkcertificatechain(cert, build=True):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
388 """Tests the given certificate to see if there is a complete chain to a
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
389 trusted root certificate. As a side effect, missing certificates are
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
390 downloaded and installed unless ``build=False``. True is returned if a
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
391 chain to a trusted root exists (even if built on the fly), otherwise
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
392 False. NB: A chain to a trusted root does NOT imply that the certificate
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
393 is valid.
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
394 """
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
395
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
396 chainctxptr = ctypes.POINTER(CERT_CHAIN_CONTEXT)
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
397
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
398 pchainctx = chainctxptr()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
399 chainpara = CERT_CHAIN_PARA(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
400 cbSize=ctypes.sizeof(CERT_CHAIN_PARA), RequestedUsage=CERT_USAGE_MATCH()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
401 )
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
402
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
403 certctx = _crypt32.CertCreateCertificateContext(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
404 X509_ASN_ENCODING, cert, len(cert)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
405 )
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
406 if certctx is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
407 _raiseoserror(b'CertCreateCertificateContext')
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
408
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
409 flags = 0
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
410
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
411 if not build:
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
412 flags |= 0x100 # CERT_CHAIN_DISABLE_AUTH_ROOT_AUTO_UPDATE
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
413
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
414 try:
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
415 # Building the certificate chain will update root certs as necessary.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
416 if not _crypt32.CertGetCertificateChain(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
417 None, # hChainEngine
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
418 certctx, # pCertContext
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
419 None, # pTime
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
420 None, # hAdditionalStore
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
421 ctypes.byref(chainpara),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
422 flags,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
423 None, # pvReserved
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
424 ctypes.byref(pchainctx),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
425 ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
426 _raiseoserror(b'CertGetCertificateChain')
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
427
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
428 chainctx = pchainctx.contents
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
429
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
430 return chainctx.dwErrorStatus & CERT_TRUST_IS_PARTIAL_CHAIN == 0
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
431 finally:
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
432 if pchainctx:
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
433 _crypt32.CertFreeCertificateChain(pchainctx)
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
434 _crypt32.CertFreeCertificateContext(certctx)
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
435
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
436
14235
b9e1b041744f rename util.os_link to oslink
Adrian Buehlmann <adrian@cadifra.com>
parents: 14230
diff changeset
437 def oslink(src, dst):
13976
9ca1ff3d4f8c win32: Wine doesn't know about hardlinks
Matt Mackall <mpm@selenic.com>
parents: 13795
diff changeset
438 try:
9ca1ff3d4f8c win32: Wine doesn't know about hardlinks
Matt Mackall <mpm@selenic.com>
parents: 13795
diff changeset
439 if not _kernel32.CreateHardLinkA(dst, src, None):
9ca1ff3d4f8c win32: Wine doesn't know about hardlinks
Matt Mackall <mpm@selenic.com>
parents: 13795
diff changeset
440 _raiseoserror(src)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
441 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
442 _raiseoserror(src)
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
443
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
444
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
445 def nlinks(name):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
446 '''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
447 return _getfileinfo(name).nNumberOfLinks
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
448
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
449
17006
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
450 def samefile(path1, path2):
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
451 '''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
452 res1 = _getfileinfo(path1)
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
453 res2 = _getfileinfo(path2)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
454 return (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
455 res1.dwVolumeSerialNumber == res2.dwVolumeSerialNumber
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
456 and res1.nFileIndexHigh == res2.nFileIndexHigh
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
457 and res1.nFileIndexLow == res2.nFileIndexLow
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
458 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
459
10218
750b7a4f01f6 Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents: 9198
diff changeset
460
17006
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
461 def samedevice(path1, path2):
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
462 '''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
463 res1 = _getfileinfo(path1)
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
464 res2 = _getfileinfo(path2)
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
465 return res1.dwVolumeSerialNumber == res2.dwVolumeSerialNumber
10218
750b7a4f01f6 Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents: 9198
diff changeset
466
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
467
24652
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
468 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
469 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
470 avail = _DWORD()
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
471
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
472 if not _kernel32.PeekNamedPipe(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
473 handle, None, 0, None, ctypes.byref(avail), None
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
474 ):
24652
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
475 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
476 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
477 return 0
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
478 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
479
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
480 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
481
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
482
38533
3a0f322af192 windows: fix incorrect detection of broken pipe when writing to pager
Sune Foldager <cryo@cyanite.org>
parents: 35550
diff changeset
483 def lasterrorwaspipeerror(err):
3a0f322af192 windows: fix incorrect detection of broken pipe when writing to pager
Sune Foldager <cryo@cyanite.org>
parents: 35550
diff changeset
484 if err.errno != errno.EINVAL:
3a0f322af192 windows: fix incorrect detection of broken pipe when writing to pager
Sune Foldager <cryo@cyanite.org>
parents: 35550
diff changeset
485 return False
3a0f322af192 windows: fix incorrect detection of broken pipe when writing to pager
Sune Foldager <cryo@cyanite.org>
parents: 35550
diff changeset
486 err = _kernel32.GetLastError()
3a0f322af192 windows: fix incorrect detection of broken pipe when writing to pager
Sune Foldager <cryo@cyanite.org>
parents: 35550
diff changeset
487 return err == _ERROR_BROKEN_PIPE or err == _ERROR_NO_DATA
3a0f322af192 windows: fix incorrect detection of broken pipe when writing to pager
Sune Foldager <cryo@cyanite.org>
parents: 35550
diff changeset
488
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
489
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
490 def testpid(pid):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
491 """return True if pid is still running or unable to
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
492 determine, False otherwise"""
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
493 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
494 if h:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
495 try:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
496 status = _DWORD()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
497 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
498 return status.value == _STILL_ACTIVE
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
499 finally:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
500 _kernel32.CloseHandle(h)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
501 return _kernel32.GetLastError() != _ERROR_INVALID_PARAMETER
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
502
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
503
14236
e949a008999d rename util.executable_path to executablepath
Adrian Buehlmann <adrian@cadifra.com>
parents: 14235
diff changeset
504 def executablepath():
13376
60b5c6c3fd12 win32: new function executable_path
Adrian Buehlmann <adrian@cadifra.com>
parents: 13375
diff changeset
505 '''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
506 size = 600
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
507 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
508 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
509 if len == 0:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
510 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
511 elif len == size:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
512 raise ctypes.WinError(_ERROR_INSUFFICIENT_BUFFER)
13376
60b5c6c3fd12 win32: new function executable_path
Adrian Buehlmann <adrian@cadifra.com>
parents: 13375
diff changeset
513 return buf.value
60b5c6c3fd12 win32: new function executable_path
Adrian Buehlmann <adrian@cadifra.com>
parents: 13375
diff changeset
514
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
515
35512
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
516 def getvolumename(path):
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
517 """Get the mount point of the filesystem from a directory or file
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
518 (best-effort)
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
519
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
520 Returns None if we are unsure. Raises OSError on ENOENT, EPERM, etc.
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
521 """
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
522 # realpath() calls GetFullPathName()
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
523 realpath = os.path.realpath(path)
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
524
35550
ed30934165c9 win32: do not call GetVolumePathName() with the minimum buffer length
Yuya Nishihara <yuya@tcha.org>
parents: 35549
diff changeset
525 # allocate at least MAX_PATH long since GetVolumePathName('c:\\', buf, 4)
ed30934165c9 win32: do not call GetVolumePathName() with the minimum buffer length
Yuya Nishihara <yuya@tcha.org>
parents: 35549
diff changeset
526 # somehow fails on Windows XP
ed30934165c9 win32: do not call GetVolumePathName() with the minimum buffer length
Yuya Nishihara <yuya@tcha.org>
parents: 35549
diff changeset
527 size = max(len(realpath), _MAX_PATH) + 1
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
528 buf = ctypes.create_string_buffer(size)
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
529
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
530 if not _kernel32.GetVolumePathNameA(realpath, ctypes.byref(buf), size):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
531 raise ctypes.WinError() # Note: WinError is a function
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
532
35512
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
533 return buf.value
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
534
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
535
35512
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
536 def getfstype(path):
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
537 """Get the filesystem type name from a directory or file (best-effort)
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
538
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
539 Returns None if we are unsure. Raises OSError on ENOENT, EPERM, etc.
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
540 """
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
541 volume = getvolumename(path)
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
542
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
543 t = _kernel32.GetDriveTypeA(volume)
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
544
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
545 if t == _DRIVE_REMOTE:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
546 return b'cifs'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
547 elif t not in (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
548 _DRIVE_REMOVABLE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
549 _DRIVE_FIXED,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
550 _DRIVE_CDROM,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
551 _DRIVE_RAMDISK,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
552 ):
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
553 return None
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
554
35549
94a127152e25 win32: allocate buffer of maximum length for GetVolumeInformation()
Yuya Nishihara <yuya@tcha.org>
parents: 35512
diff changeset
555 size = _MAX_PATH + 1
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
556 name = ctypes.create_string_buffer(size)
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
557
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
558 if not _kernel32.GetVolumeInformationA(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
559 volume, None, 0, None, None, None, ctypes.byref(name), size
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
560 ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
561 raise ctypes.WinError() # Note: WinError is a function
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
562
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
563 return name.value
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
564
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
565
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents: 7778
diff changeset
566 def getuser():
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents: 7778
diff changeset
567 '''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
568 size = _DWORD(300)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
569 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
570 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
571 raise ctypes.WinError()
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
572 return buf.value
4672
272c0a09b203 Handle CTRL+C in serve under Windows.
Marcos Chaves <marcos.nospam@gmail.com>
parents: 4407
diff changeset
573
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
574
14237
4d684d8210a1 rename util.set_signal_handler to setsignalhandler
Adrian Buehlmann <adrian@cadifra.com>
parents: 14236
diff changeset
575 _signalhandler = []
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
576
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
577
14237
4d684d8210a1 rename util.set_signal_handler to setsignalhandler
Adrian Buehlmann <adrian@cadifra.com>
parents: 14236
diff changeset
578 def setsignalhandler():
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
579 """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
580 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
581 operations.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
582 """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
583
4672
272c0a09b203 Handle CTRL+C in serve under Windows.
Marcos Chaves <marcos.nospam@gmail.com>
parents: 4407
diff changeset
584 def handler(event):
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
585 _kernel32.ExitProcess(1)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
586
14237
4d684d8210a1 rename util.set_signal_handler to setsignalhandler
Adrian Buehlmann <adrian@cadifra.com>
parents: 14236
diff changeset
587 if _signalhandler:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
588 return # already registered
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
589 h = _SIGNAL_HANDLER(handler)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
590 _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
591 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
592 raise ctypes.WinError()
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
593
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
594
10240
3af4b39afe2a cmdutil: hide child window created by win32 spawndetached()
Patrick Mezard <pmezard@gmail.com>
parents: 10219
diff changeset
595 def hidewindow():
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
596 def callback(hwnd, pid):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
597 wpid = _DWORD()
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
598 _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
599 if pid == wpid.value:
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
600 _user32.ShowWindow(hwnd, _SW_HIDE)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
601 return False # stop enumerating windows
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
602 return True
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
603
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
604 pid = _kernel32.GetCurrentProcessId()
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
605 _user32.EnumWindows(_WNDENUMPROC(callback), pid)
11012
81631f0cf13b win32: detect console width on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 10388
diff changeset
606
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
607
30314
365812902904 scmutil: extend termwidth() to return terminal height, renamed to termsize()
Yuya Nishihara <yuya@tcha.org>
parents: 30313
diff changeset
608 def termsize():
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
609 # 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
610 # 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
611 # 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
612 # current line but on the new one. Keep room for it.
30313
392633d7860e scmutil: clarify that we explicitly do termwidth - 1 on Windows
Yuya Nishihara <yuya@tcha.org>
parents: 25994
diff changeset
613 width = 80 - 1
30314
365812902904 scmutil: extend termwidth() to return terminal height, renamed to termsize()
Yuya Nishihara <yuya@tcha.org>
parents: 30313
diff changeset
614 height = 25
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
615 # 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
616 screenbuf = _kernel32.GetStdHandle(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
617 _STD_ERROR_HANDLE
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
618 ) # don't close the handle returned
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
619 if screenbuf is None or screenbuf == _INVALID_HANDLE_VALUE:
30314
365812902904 scmutil: extend termwidth() to return terminal height, renamed to termsize()
Yuya Nishihara <yuya@tcha.org>
parents: 30313
diff changeset
620 return width, height
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
621 csbi = _CONSOLE_SCREEN_BUFFER_INFO()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
622 if not _kernel32.GetConsoleScreenBufferInfo(screenbuf, ctypes.byref(csbi)):
30314
365812902904 scmutil: extend termwidth() to return terminal height, renamed to termsize()
Yuya Nishihara <yuya@tcha.org>
parents: 30313
diff changeset
623 return width, height
30313
392633d7860e scmutil: clarify that we explicitly do termwidth - 1 on Windows
Yuya Nishihara <yuya@tcha.org>
parents: 25994
diff changeset
624 width = csbi.srWindow.Right - csbi.srWindow.Left # don't '+ 1'
30314
365812902904 scmutil: extend termwidth() to return terminal height, renamed to termsize()
Yuya Nishihara <yuya@tcha.org>
parents: 30313
diff changeset
625 height = csbi.srWindow.Bottom - csbi.srWindow.Top + 1
365812902904 scmutil: extend termwidth() to return terminal height, renamed to termsize()
Yuya Nishihara <yuya@tcha.org>
parents: 30313
diff changeset
626 return width, height
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
627
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
628
32664
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
629 def enablevtmode():
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
630 """Enable virtual terminal mode for the associated console. Return True if
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43506
diff changeset
631 enabled, else False."""
32664
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
632
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
633 ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x4
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
634
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
635 handle = _kernel32.GetStdHandle(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
636 _STD_OUTPUT_HANDLE
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
637 ) # don't close the handle
32664
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
638 if handle == _INVALID_HANDLE_VALUE:
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
639 return False
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
640
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
641 mode = _DWORD(0)
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
642
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
643 if not _kernel32.GetConsoleMode(handle, ctypes.byref(mode)):
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
644 return False
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
645
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
646 if (mode.value & ENABLE_VIRTUAL_TERMINAL_PROCESSING) == 0:
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
647 mode.value |= ENABLE_VIRTUAL_TERMINAL_PROCESSING
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
648
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
649 if not _kernel32.SetConsoleMode(handle, mode):
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
650 return False
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
651
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
652 return True
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
653
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
654
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
655 def spawndetached(args):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
656 # 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
657 # 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
658 # 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
659 # 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
660 # 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
661 si = _STARTUPINFO()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
662 si.cb = ctypes.sizeof(_STARTUPINFO)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
663
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
664 pi = _PROCESS_INFORMATION()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
665
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
666 env = b''
30637
344e68882cd3 py3: replace os.environ with encoding.environ (part 4 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30314
diff changeset
667 for k in encoding.environ:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
668 env += b"%s=%s\0" % (k, encoding.environ[k])
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
669 if not env:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
670 env = b'\0'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
671 env += b'\0'
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
672
39719
255d1885c7f8 py3: resolve Unicode issues around `hg serve` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39611
diff changeset
673 args = subprocess.list2cmdline(pycompat.rapply(encoding.strfromlocal, args))
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
674
39719
255d1885c7f8 py3: resolve Unicode issues around `hg serve` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39611
diff changeset
675 # TODO: CreateProcessW on py3?
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
676 res = _kernel32.CreateProcessA(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
677 None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
678 encoding.strtolocal(args),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
679 None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
680 None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
681 False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
682 _CREATE_NO_WINDOW,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
683 env,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
684 encoding.getcwd(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
685 ctypes.byref(si),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
686 ctypes.byref(pi),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
687 )
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
688 if not res:
24418
a2285e2fc949 win32: 'raise ctypes.WinError' -> 'raise ctypes.WinError()'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21226
diff changeset
689 raise ctypes.WinError()
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
690
40928
576474baa209 win32: close the handles associated with a spawned child process
Matt Harbison <matt_harbison@yahoo.com>
parents: 39818
diff changeset
691 _kernel32.CloseHandle(pi.hProcess)
576474baa209 win32: close the handles associated with a spawned child process
Matt Harbison <matt_harbison@yahoo.com>
parents: 39818
diff changeset
692 _kernel32.CloseHandle(pi.hThread)
576474baa209 win32: close the handles associated with a spawned child process
Matt Harbison <matt_harbison@yahoo.com>
parents: 39818
diff changeset
693
32676
4c3d9ee87382 win32: drop a py26 daemonizing hack
Matt Harbison <matt_harbison@yahoo.com>
parents: 32664
diff changeset
694 return pi.dwProcessId
13775
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
695
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
696
13775
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
697 def unlink(f):
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
698 '''try to implement POSIX' unlink semantics on Windows'''
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
699
21226
4898c37e03c0 win32: backout 1a9ebc83a74c
Steve Borho <steve@borho.org>
parents: 21193
diff changeset
700 if os.path.isdir(f):
4898c37e03c0 win32: backout 1a9ebc83a74c
Steve Borho <steve@borho.org>
parents: 21193
diff changeset
701 # use EPERM because it is POSIX prescribed value, even though
4898c37e03c0 win32: backout 1a9ebc83a74c
Steve Borho <steve@borho.org>
parents: 21193
diff changeset
702 # unlink(2) on directories returns EISDIR on Linux
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
703 raise IOError(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
704 errno.EPERM,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
705 r"Unlinking directory not permitted: '%s'"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
706 % encoding.strfromlocal(f),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
707 )
19159
1b329f8c7b24 windows: check target type before actual unlinking to follow POSIX semantics
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18959
diff changeset
708
13775
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
709 # 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
710 # problems with doing that:
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
711 # - 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
712 # 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
713 # 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
714 # 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
715 # - 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
716 # 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
717 # 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
718 # 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
719 # 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
720 # cannot be removed or moved.
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
721 # 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
722 # 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
723 # 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
724 # implicit zombie filename blocking on a temporary name.
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
725
38783
e7aa113b14f7 global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38533
diff changeset
726 for tries in pycompat.xrange(10):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
727 temp = b'%s-%08x' % (f, random.randint(0, 0xFFFFFFFF))
13775
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
728 try:
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
729 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
730 break
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24652
diff changeset
731 except OSError as e:
13775
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
732 if e.errno != errno.EEXIST:
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
733 raise
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
734 else:
43503
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
735 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
736
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
737 try:
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
738 os.unlink(temp)
13776
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
739 except OSError:
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
740 # 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
741 # 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
742 # 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
743 _kernel32.SetFileAttributesA(temp, _FILE_ATTRIBUTE_NORMAL)
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
744 try:
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
745 os.unlink(temp)
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
746 except OSError:
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
747 # 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
748 # 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
749 # leaving some potentially serious inconsistencies.
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
750 pass
13795
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13776
diff changeset
751
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
752
13795
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13776
diff changeset
753 def makedir(path, notindexed):
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13776
diff changeset
754 os.mkdir(path)
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13776
diff changeset
755 if notindexed:
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13776
diff changeset
756 _kernel32.SetFileAttributesA(path, _FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)