##// END OF EJS Templates
wait-on-file: properly wait on any files and symlink...
wait-on-file: properly wait on any files and symlink This make the utility more useful, for example to wait on a lock file. We also add an explicit -L check since the lock are "weird" symlink. Differential Revision: https://phab.mercurial-scm.org/D12617

File last commit:

r49730:6000f5b2 default
r50093:a68b3752 default
Show More
win32.py
765 lines | 22.0 KiB | text/x-python | PythonLexer
Martin Geisler
put license and copyright info into comment blocks
r8226 # win32.py - utility functions that use win32 API
#
Raphaël Gomès
contributor: change mentions of mpm to olivia...
r47575 # Copyright 2005-2009 Olivia Mackall <olivia@selenic.com> and others
Martin Geisler
put license and copyright info into comment blocks
r8226 #
# This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
Martin Geisler
turn some comments back into module docstrings
r8227
Gregory Szorc
win32: use absolute_import
r25994
import ctypes
Yuya Nishihara
win32: allocate buffer of maximum length for GetVolumeInformation()...
r35563 import ctypes.wintypes as wintypes
Gregory Szorc
win32: use absolute_import
r25994 import errno
import msvcrt
import os
import random
import subprocess
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375
Pulkit Goyal
py3: use pycompat.getcwd instead of os.getcwd
r30667 from . import (
encoding,
pycompat,
)
Pulkit Goyal
py3: replace os.environ with encoding.environ (part 4 of 5)
r30637
Matt Harbison
typing: disable a few errors when accessing Windows specific attributes...
r47542 # pytype: disable=module-attr
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 _kernel32 = ctypes.windll.kernel32
Adrian Buehlmann
win32.py: add argtypes and restype...
r14345 _advapi32 = ctypes.windll.advapi32
_user32 = ctypes.windll.user32
Matt Harbison
win32: add a method to trigger the Crypto API to complete a certificate chain...
r33492 _crypt32 = ctypes.windll.crypt32
Matt Harbison
typing: disable a few errors when accessing Windows specific attributes...
r47542 # pytype: enable=module-attr
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375
_BOOL = ctypes.c_long
_WORD = ctypes.c_ushort
_DWORD = ctypes.c_ulong
Adrian Buehlmann
win32.py: add argtypes and restype...
r14345 _UINT = ctypes.c_uint
_LONG = ctypes.c_long
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 _LPCSTR = _LPSTR = ctypes.c_char_p
_HANDLE = ctypes.c_void_p
_HWND = _HANDLE
Matt Harbison
win32: add a method to trigger the Crypto API to complete a certificate chain...
r33492 _PCCERT_CONTEXT = ctypes.c_void_p
Yuya Nishihara
win32: allocate buffer of maximum length for GetVolumeInformation()...
r35563 _MAX_PATH = wintypes.MAX_PATH
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375
Adrian Buehlmann
win32.py: add argtypes and restype...
r14345 _INVALID_HANDLE_VALUE = _HANDLE(-1).value
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375
# GetLastError
_ERROR_SUCCESS = 0
Yuya Nishihara
win32: add missing definition of _ERROR_NO_MORE_FILES caught by pyflakes
r21193 _ERROR_NO_MORE_FILES = 18
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 _ERROR_INVALID_PARAMETER = 87
Matt Harbison
win32: add a method to fetch the available pipe data size...
r24652 _ERROR_BROKEN_PIPE = 109
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 _ERROR_INSUFFICIENT_BUFFER = 122
Sune Foldager
windows: fix incorrect detection of broken pipe when writing to pager...
r38575 _ERROR_NO_DATA = 232
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375
# WPARAM is defined as UINT_PTR (unsigned type)
# LPARAM is defined as LONG_PTR (signed type)
if ctypes.sizeof(ctypes.c_long) == ctypes.sizeof(ctypes.c_void_p):
_WPARAM = ctypes.c_ulong
_LPARAM = ctypes.c_long
elif ctypes.sizeof(ctypes.c_longlong) == ctypes.sizeof(ctypes.c_void_p):
_WPARAM = ctypes.c_ulonglong
_LPARAM = ctypes.c_longlong
Augie Fackler
formatting: blacken the codebase...
r43346
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 class _FILETIME(ctypes.Structure):
Augie Fackler
cleanup: remove pointless r-prefixes on single-quoted strings...
r43906 _fields_ = [('dwLowDateTime', _DWORD), ('dwHighDateTime', _DWORD)]
Augie Fackler
formatting: blacken the codebase...
r43346
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375
class _BY_HANDLE_FILE_INFORMATION(ctypes.Structure):
Augie Fackler
formatting: blacken the codebase...
r43346 _fields_ = [
Augie Fackler
cleanup: remove pointless r-prefixes on single-quoted strings...
r43906 ('dwFileAttributes', _DWORD),
('ftCreationTime', _FILETIME),
('ftLastAccessTime', _FILETIME),
('ftLastWriteTime', _FILETIME),
('dwVolumeSerialNumber', _DWORD),
('nFileSizeHigh', _DWORD),
('nFileSizeLow', _DWORD),
('nNumberOfLinks', _DWORD),
('nFileIndexHigh', _DWORD),
('nFileIndexLow', _DWORD),
Augie Fackler
formatting: blacken the codebase...
r43346 ]
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375
Mads Kiilerich
check-code: catch trailing space in comments
r18959 # CreateFile
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 _FILE_SHARE_READ = 0x00000001
_FILE_SHARE_WRITE = 0x00000002
_FILE_SHARE_DELETE = 0x00000004
_OPEN_EXISTING = 3
Adrian Buehlmann
win32.py: let samefile and samedevice work on directories too
r17006 _FILE_FLAG_BACKUP_SEMANTICS = 0x02000000
Adrian Buehlmann
win32: remove READONLY attribute on unlink
r13776 # SetFileAttributes
_FILE_ATTRIBUTE_NORMAL = 0x80
Adrian Buehlmann
set NOT_CONTENT_INDEXED on .hg dir (issue2694)...
r13795 _FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x2000
Adrian Buehlmann
win32: remove READONLY attribute on unlink
r13776
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 # Process Security and Access Rights
_PROCESS_QUERY_INFORMATION = 0x0400
# GetExitCodeProcess
_STILL_ACTIVE = 259
Augie Fackler
formatting: blacken the codebase...
r43346
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 class _STARTUPINFO(ctypes.Structure):
Augie Fackler
formatting: blacken the codebase...
r43346 _fields_ = [
Augie Fackler
cleanup: remove pointless r-prefixes on single-quoted strings...
r43906 ('cb', _DWORD),
('lpReserved', _LPSTR),
('lpDesktop', _LPSTR),
('lpTitle', _LPSTR),
('dwX', _DWORD),
('dwY', _DWORD),
('dwXSize', _DWORD),
('dwYSize', _DWORD),
('dwXCountChars', _DWORD),
('dwYCountChars', _DWORD),
('dwFillAttribute', _DWORD),
('dwFlags', _DWORD),
('wShowWindow', _WORD),
('cbReserved2', _WORD),
('lpReserved2', ctypes.c_char_p),
('hStdInput', _HANDLE),
('hStdOutput', _HANDLE),
('hStdError', _HANDLE),
Augie Fackler
formatting: blacken the codebase...
r43346 ]
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375
class _PROCESS_INFORMATION(ctypes.Structure):
Augie Fackler
formatting: blacken the codebase...
r43346 _fields_ = [
Augie Fackler
cleanup: remove pointless r-prefixes on single-quoted strings...
r43906 ('hProcess', _HANDLE),
('hThread', _HANDLE),
('dwProcessId', _DWORD),
('dwThreadId', _DWORD),
Augie Fackler
formatting: blacken the codebase...
r43346 ]
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375
Adrian Buehlmann
win32: specify _CREATE_NO_WINDOW on spawndetached()...
r17050 _CREATE_NO_WINDOW = 0x08000000
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 _SW_HIDE = 0
Matt Mackall
util: split out posix, windows, and win32 modules
r7890
Augie Fackler
formatting: blacken the codebase...
r43346
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 class _COORD(ctypes.Structure):
Augie Fackler
cleanup: remove pointless r-prefixes on single-quoted strings...
r43906 _fields_ = [('X', ctypes.c_short), ('Y', ctypes.c_short)]
Augie Fackler
formatting: blacken the codebase...
r43346
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375
class _SMALL_RECT(ctypes.Structure):
Augie Fackler
formatting: blacken the codebase...
r43346 _fields_ = [
Augie Fackler
cleanup: remove pointless r-prefixes on single-quoted strings...
r43906 ('Left', ctypes.c_short),
('Top', ctypes.c_short),
('Right', ctypes.c_short),
('Bottom', ctypes.c_short),
Augie Fackler
formatting: blacken the codebase...
r43346 ]
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375
class _CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure):
Augie Fackler
formatting: blacken the codebase...
r43346 _fields_ = [
Augie Fackler
cleanup: remove pointless r-prefixes on single-quoted strings...
r43906 ('dwSize', _COORD),
('dwCursorPosition', _COORD),
('wAttributes', _WORD),
('srWindow', _SMALL_RECT),
('dwMaximumWindowSize', _COORD),
Augie Fackler
formatting: blacken the codebase...
r43346 ]
Matt Mackall
util: split out posix, windows, and win32 modules
r7890
Matt Harbison
win32: add a method to enable ANSI color code processing on Windows 10...
r32664 _STD_OUTPUT_HANDLE = _DWORD(-11).value
Adrian Buehlmann
win32.py: more explicit definition of _STD_ERROR_HANDLE
r14344 _STD_ERROR_HANDLE = _DWORD(-12).value
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375
Matt Harbison
win32: add a method to trigger the Crypto API to complete a certificate chain...
r33492 # CERT_TRUST_STATUS dwErrorStatus
CERT_TRUST_IS_PARTIAL_CHAIN = 0x10000
# CertCreateCertificateContext encodings
X509_ASN_ENCODING = 0x00000001
PKCS_7_ASN_ENCODING = 0x00010000
# These structs are only complete enough to achieve what we need.
class CERT_CHAIN_CONTEXT(ctypes.Structure):
_fields_ = (
Augie Fackler
cleanup: remove pointless r-prefixes on double-quoted strings...
r43809 ("cbSize", _DWORD),
Matt Harbison
win32: add a method to trigger the Crypto API to complete a certificate chain...
r33492 # CERT_TRUST_STATUS struct
Augie Fackler
cleanup: remove pointless r-prefixes on double-quoted strings...
r43809 ("dwErrorStatus", _DWORD),
("dwInfoStatus", _DWORD),
("cChain", _DWORD),
("rgpChain", ctypes.c_void_p),
("cLowerQualityChainContext", _DWORD),
("rgpLowerQualityChainContext", ctypes.c_void_p),
("fHasRevocationFreshnessTime", _BOOL),
("dwRevocationFreshnessTime", _DWORD),
Matt Harbison
win32: add a method to trigger the Crypto API to complete a certificate chain...
r33492 )
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Harbison
win32: add a method to trigger the Crypto API to complete a certificate chain...
r33492 class CERT_USAGE_MATCH(ctypes.Structure):
_fields_ = (
Augie Fackler
cleanup: remove pointless r-prefixes on double-quoted strings...
r43809 ("dwType", _DWORD),
Augie Fackler
formatting: blacken the codebase...
r43346 # CERT_ENHKEY_USAGE struct
Augie Fackler
cleanup: remove pointless r-prefixes on double-quoted strings...
r43809 ("cUsageIdentifier", _DWORD),
("rgpszUsageIdentifier", ctypes.c_void_p), # LPSTR *
Matt Harbison
win32: add a method to trigger the Crypto API to complete a certificate chain...
r33492 )
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Harbison
win32: add a method to trigger the Crypto API to complete a certificate chain...
r33492 class CERT_CHAIN_PARA(ctypes.Structure):
_fields_ = (
Augie Fackler
cleanup: remove pointless r-prefixes on double-quoted strings...
r43809 ("cbSize", _DWORD),
("RequestedUsage", CERT_USAGE_MATCH),
("RequestedIssuancePolicy", CERT_USAGE_MATCH),
("dwUrlRetrievalTimeout", _DWORD),
("fCheckRevocationFreshnessTime", _BOOL),
("dwRevocationFreshnessTime", _DWORD),
("pftCacheResync", ctypes.c_void_p), # LPFILETIME
("pStrongSignPara", ctypes.c_void_p), # PCCERT_STRONG_SIGN_PARA
("dwStrongSignFlags", _DWORD),
Matt Harbison
win32: add a method to trigger the Crypto API to complete a certificate chain...
r33492 )
Augie Fackler
formatting: blacken the codebase...
r43346
Adrian Buehlmann
win32.py: add argtypes and restype...
r14345 # types of parameters of C functions used (required by pypy)
Augie Fackler
formatting: blacken the codebase...
r43346 _crypt32.CertCreateCertificateContext.argtypes = [
_DWORD, # cert encoding
ctypes.c_char_p, # cert
_DWORD,
] # cert size
Matt Harbison
win32: add a method to trigger the Crypto API to complete a certificate chain...
r33492 _crypt32.CertCreateCertificateContext.restype = _PCCERT_CONTEXT
_crypt32.CertGetCertificateChain.argtypes = [
Augie Fackler
formatting: blacken the codebase...
r43346 ctypes.c_void_p, # HCERTCHAINENGINE
_PCCERT_CONTEXT,
ctypes.c_void_p, # LPFILETIME
ctypes.c_void_p, # HCERTSTORE
ctypes.c_void_p, # PCERT_CHAIN_PARA
_DWORD,
ctypes.c_void_p, # LPVOID
ctypes.c_void_p, # PCCERT_CHAIN_CONTEXT *
]
Matt Harbison
win32: add a method to trigger the Crypto API to complete a certificate chain...
r33492 _crypt32.CertGetCertificateChain.restype = _BOOL
_crypt32.CertFreeCertificateContext.argtypes = [_PCCERT_CONTEXT]
_crypt32.CertFreeCertificateContext.restype = _BOOL
Augie Fackler
formatting: blacken the codebase...
r43346 _kernel32.CreateFileA.argtypes = [
_LPCSTR,
_DWORD,
_DWORD,
ctypes.c_void_p,
_DWORD,
_DWORD,
_HANDLE,
]
Adrian Buehlmann
win32.py: add argtypes and restype...
r14345 _kernel32.CreateFileA.restype = _HANDLE
_kernel32.GetFileInformationByHandle.argtypes = [_HANDLE, ctypes.c_void_p]
_kernel32.GetFileInformationByHandle.restype = _BOOL
_kernel32.CloseHandle.argtypes = [_HANDLE]
_kernel32.CloseHandle.restype = _BOOL
Matt Mackall
win32: quietly ignore missing CreateHardLinkA for Wine
r15095 try:
_kernel32.CreateHardLinkA.argtypes = [_LPCSTR, _LPCSTR, ctypes.c_void_p]
_kernel32.CreateHardLinkA.restype = _BOOL
except AttributeError:
pass
Adrian Buehlmann
win32.py: add argtypes and restype...
r14345
_kernel32.SetFileAttributesA.argtypes = [_LPCSTR, _DWORD]
_kernel32.SetFileAttributesA.restype = _BOOL
Matt Harbison
win32: implement util.getfstype()...
r35528 _DRIVE_UNKNOWN = 0
_DRIVE_NO_ROOT_DIR = 1
_DRIVE_REMOVABLE = 2
_DRIVE_FIXED = 3
_DRIVE_REMOTE = 4
_DRIVE_CDROM = 5
_DRIVE_RAMDISK = 6
_kernel32.GetDriveTypeA.argtypes = [_LPCSTR]
_kernel32.GetDriveTypeA.restype = _UINT
Augie Fackler
formatting: blacken the codebase...
r43346 _kernel32.GetVolumeInformationA.argtypes = [
_LPCSTR,
ctypes.c_void_p,
_DWORD,
ctypes.c_void_p,
ctypes.c_void_p,
ctypes.c_void_p,
ctypes.c_void_p,
_DWORD,
]
Matt Harbison
win32: implement util.getfstype()...
r35528 _kernel32.GetVolumeInformationA.restype = _BOOL
_kernel32.GetVolumePathNameA.argtypes = [_LPCSTR, ctypes.c_void_p, _DWORD]
_kernel32.GetVolumePathNameA.restype = _BOOL
Adrian Buehlmann
win32.py: add argtypes and restype...
r14345 _kernel32.OpenProcess.argtypes = [_DWORD, _BOOL, _DWORD]
_kernel32.OpenProcess.restype = _HANDLE
_kernel32.GetExitCodeProcess.argtypes = [_HANDLE, ctypes.c_void_p]
_kernel32.GetExitCodeProcess.restype = _BOOL
_kernel32.GetLastError.argtypes = []
_kernel32.GetLastError.restype = _DWORD
_kernel32.GetModuleFileNameA.argtypes = [_HANDLE, ctypes.c_void_p, _DWORD]
_kernel32.GetModuleFileNameA.restype = _DWORD
Augie Fackler
formatting: blacken the codebase...
r43346 _kernel32.CreateProcessA.argtypes = [
_LPCSTR,
_LPCSTR,
ctypes.c_void_p,
ctypes.c_void_p,
_BOOL,
_DWORD,
ctypes.c_void_p,
_LPCSTR,
ctypes.c_void_p,
ctypes.c_void_p,
]
Adrian Buehlmann
win32.py: add argtypes and restype...
r14345 _kernel32.CreateProcessA.restype = _BOOL
_kernel32.ExitProcess.argtypes = [_UINT]
_kernel32.ExitProcess.restype = None
_kernel32.GetCurrentProcessId.argtypes = []
_kernel32.GetCurrentProcessId.restype = _DWORD
Matt Harbison
typing: disable a few errors when accessing Windows specific attributes...
r47542 # pytype: disable=module-attr
Adrian Buehlmann
win32.py: add argtypes and restype...
r14345 _SIGNAL_HANDLER = ctypes.WINFUNCTYPE(_BOOL, _DWORD)
Matt Harbison
typing: disable a few errors when accessing Windows specific attributes...
r47542 # pytype: enable=module-attr
Adrian Buehlmann
win32.py: add argtypes and restype...
r14345 _kernel32.SetConsoleCtrlHandler.argtypes = [_SIGNAL_HANDLER, _BOOL]
_kernel32.SetConsoleCtrlHandler.restype = _BOOL
Matt Harbison
win32: add a method to enable ANSI color code processing on Windows 10...
r32664 _kernel32.SetConsoleMode.argtypes = [_HANDLE, _DWORD]
_kernel32.SetConsoleMode.restype = _BOOL
_kernel32.GetConsoleMode.argtypes = [_HANDLE, ctypes.c_void_p]
_kernel32.GetConsoleMode.restype = _BOOL
Adrian Buehlmann
win32.py: add argtypes and restype...
r14345 _kernel32.GetStdHandle.argtypes = [_DWORD]
_kernel32.GetStdHandle.restype = _HANDLE
_kernel32.GetConsoleScreenBufferInfo.argtypes = [_HANDLE, ctypes.c_void_p]
_kernel32.GetConsoleScreenBufferInfo.restype = _BOOL
_advapi32.GetUserNameA.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
_advapi32.GetUserNameA.restype = _BOOL
_user32.GetWindowThreadProcessId.argtypes = [_HANDLE, ctypes.c_void_p]
_user32.GetWindowThreadProcessId.restype = _DWORD
_user32.ShowWindow.argtypes = [_HANDLE, ctypes.c_int]
_user32.ShowWindow.restype = _BOOL
Matt Harbison
typing: disable a few errors when accessing Windows specific attributes...
r47542 # pytype: disable=module-attr
Adrian Buehlmann
win32.py: add argtypes and restype...
r14345 _WNDENUMPROC = ctypes.WINFUNCTYPE(_BOOL, _HWND, _LPARAM)
Matt Harbison
typing: disable a few errors when accessing Windows specific attributes...
r47542 # pytype: enable=module-attr
Adrian Buehlmann
win32.py: add argtypes and restype...
r14345 _user32.EnumWindows.argtypes = [_WNDENUMPROC, _LPARAM]
_user32.EnumWindows.restype = _BOOL
Augie Fackler
formatting: blacken the codebase...
r43346 _kernel32.PeekNamedPipe.argtypes = [
_HANDLE,
ctypes.c_void_p,
_DWORD,
ctypes.c_void_p,
ctypes.c_void_p,
ctypes.c_void_p,
]
Matt Harbison
win32: add a method to fetch the available pipe data size...
r24652 _kernel32.PeekNamedPipe.restype = _BOOL
Augie Fackler
formatting: blacken the codebase...
r43346
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 def _raiseoserror(name):
Matt Harbison
win32: work around a WinError problem handling HRESULT types...
r33419 # Force the code to a signed int to avoid an 'int too large' error.
# See https://bugs.python.org/issue28474
code = _kernel32.GetLastError()
Augie Fackler
formatting: blacken the codebase...
r43346 if code > 0x7FFFFFFF:
code -= 2 ** 32
Matt Harbison
typing: disable a few errors when accessing Windows specific attributes...
r47542 err = ctypes.WinError(code=code) # pytype: disable=module-attr
Augie Fackler
formatting: blacken the codebase...
r43346 raise OSError(
Augie Fackler
cleanup: remove pointless r-prefixes on single-quoted strings...
r43906 err.errno, '%s: %s' % (encoding.strfromlocal(name), err.strerror)
Augie Fackler
formatting: blacken the codebase...
r43346 )
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375
def _getfileinfo(name):
Augie Fackler
formatting: blacken the codebase...
r43346 fh = _kernel32.CreateFileA(
name,
0,
_FILE_SHARE_READ | _FILE_SHARE_WRITE | _FILE_SHARE_DELETE,
None,
_OPEN_EXISTING,
_FILE_FLAG_BACKUP_SEMANTICS,
None,
)
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 if fh == _INVALID_HANDLE_VALUE:
_raiseoserror(name)
try:
fi = _BY_HANDLE_FILE_INFORMATION()
if not _kernel32.GetFileInformationByHandle(fh, ctypes.byref(fi)):
_raiseoserror(name)
return fi
finally:
_kernel32.CloseHandle(fh)
Matt Mackall
util: split out posix, windows, and win32 modules
r7890
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Harbison
win32: add a method to trigger the Crypto API to complete a certificate chain...
r33492 def checkcertificatechain(cert, build=True):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Tests the given certificate to see if there is a complete chain to a
trusted root certificate. As a side effect, missing certificates are
downloaded and installed unless ``build=False``. True is returned if a
chain to a trusted root exists (even if built on the fly), otherwise
False. NB: A chain to a trusted root does NOT imply that the certificate
is valid.
"""
Matt Harbison
win32: add a method to trigger the Crypto API to complete a certificate chain...
r33492
chainctxptr = ctypes.POINTER(CERT_CHAIN_CONTEXT)
pchainctx = chainctxptr()
Augie Fackler
formatting: blacken the codebase...
r43346 chainpara = CERT_CHAIN_PARA(
cbSize=ctypes.sizeof(CERT_CHAIN_PARA), RequestedUsage=CERT_USAGE_MATCH()
)
Matt Harbison
win32: add a method to trigger the Crypto API to complete a certificate chain...
r33492
Augie Fackler
formatting: blacken the codebase...
r43346 certctx = _crypt32.CertCreateCertificateContext(
X509_ASN_ENCODING, cert, len(cert)
)
Matt Harbison
win32: add a method to trigger the Crypto API to complete a certificate chain...
r33492 if certctx is None:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _raiseoserror(b'CertCreateCertificateContext')
Matt Harbison
win32: add a method to trigger the Crypto API to complete a certificate chain...
r33492
flags = 0
if not build:
flags |= 0x100 # CERT_CHAIN_DISABLE_AUTH_ROOT_AUTO_UPDATE
try:
# Building the certificate chain will update root certs as necessary.
Augie Fackler
formatting: blacken the codebase...
r43346 if not _crypt32.CertGetCertificateChain(
None, # hChainEngine
certctx, # pCertContext
None, # pTime
None, # hAdditionalStore
ctypes.byref(chainpara),
flags,
None, # pvReserved
ctypes.byref(pchainctx),
):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _raiseoserror(b'CertGetCertificateChain')
Matt Harbison
win32: add a method to trigger the Crypto API to complete a certificate chain...
r33492
chainctx = pchainctx.contents
return chainctx.dwErrorStatus & CERT_TRUST_IS_PARTIAL_CHAIN == 0
finally:
if pchainctx:
_crypt32.CertFreeCertificateChain(pchainctx)
_crypt32.CertFreeCertificateContext(certctx)
Augie Fackler
formatting: blacken the codebase...
r43346
Adrian Buehlmann
rename util.os_link to oslink
r14235 def oslink(src, dst):
Matt Mackall
win32: Wine doesn't know about hardlinks
r13976 try:
if not _kernel32.CreateHardLinkA(dst, src, None):
_raiseoserror(src)
Augie Fackler
formatting: blacken the codebase...
r43346 except AttributeError: # Wine doesn't support this function
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 _raiseoserror(src)
Matt Mackall
util: split out posix, windows, and win32 modules
r7890
Augie Fackler
formatting: blacken the codebase...
r43346
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 def nlinks(name):
'''return number of hardlinks for the given file'''
return _getfileinfo(name).nNumberOfLinks
Matt Mackall
util: split out posix, windows, and win32 modules
r7890
Augie Fackler
formatting: blacken the codebase...
r43346
Adrian Buehlmann
win32.py: let samefile and samedevice work on directories too
r17006 def samefile(path1, path2):
'''Returns whether path1 and path2 refer to the same file or directory.'''
res1 = _getfileinfo(path1)
res2 = _getfileinfo(path2)
Augie Fackler
formatting: blacken the codebase...
r43346 return (
res1.dwVolumeSerialNumber == res2.dwVolumeSerialNumber
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 and res1.nFileIndexHigh == res2.nFileIndexHigh
Augie Fackler
formatting: blacken the codebase...
r43346 and res1.nFileIndexLow == res2.nFileIndexLow
)
Siddharth Agarwal
Add support for relinking on Windows....
r10218
Adrian Buehlmann
win32.py: let samefile and samedevice work on directories too
r17006 def samedevice(path1, path2):
'''Returns whether path1 and path2 are on the same device.'''
res1 = _getfileinfo(path1)
res2 = _getfileinfo(path2)
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 return res1.dwVolumeSerialNumber == res2.dwVolumeSerialNumber
Siddharth Agarwal
Add support for relinking on Windows....
r10218
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Harbison
win32: add a method to fetch the available pipe data size...
r24652 def peekpipe(pipe):
Matt Harbison
typing: disable a few errors when accessing Windows specific attributes...
r47542 handle = msvcrt.get_osfhandle(pipe.fileno()) # pytype: disable=module-attr
Matt Harbison
win32: add a method to fetch the available pipe data size...
r24652 avail = _DWORD()
Augie Fackler
formatting: blacken the codebase...
r43346 if not _kernel32.PeekNamedPipe(
handle, None, 0, None, ctypes.byref(avail), None
):
Matt Harbison
win32: add a method to fetch the available pipe data size...
r24652 err = _kernel32.GetLastError()
if err == _ERROR_BROKEN_PIPE:
return 0
Matt Harbison
typing: disable a few errors when accessing Windows specific attributes...
r47542 raise ctypes.WinError(err) # pytype: disable=module-attr
Matt Harbison
win32: add a method to fetch the available pipe data size...
r24652
return avail.value
Augie Fackler
formatting: blacken the codebase...
r43346
Sune Foldager
windows: fix incorrect detection of broken pipe when writing to pager...
r38575 def lasterrorwaspipeerror(err):
if err.errno != errno.EINVAL:
return False
err = _kernel32.GetLastError()
return err == _ERROR_BROKEN_PIPE or err == _ERROR_NO_DATA
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Mackall
util: split out posix, windows, and win32 modules
r7890 def testpid(pid):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """return True if pid is still running or unable to
determine, False otherwise"""
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 h = _kernel32.OpenProcess(_PROCESS_QUERY_INFORMATION, False, pid)
if h:
try:
status = _DWORD()
if _kernel32.GetExitCodeProcess(h, ctypes.byref(status)):
return status.value == _STILL_ACTIVE
finally:
_kernel32.CloseHandle(h)
return _kernel32.GetLastError() != _ERROR_INVALID_PARAMETER
Matt Mackall
util: split out posix, windows, and win32 modules
r7890
Augie Fackler
formatting: blacken the codebase...
r43346
Adrian Buehlmann
rename util.executable_path to executablepath
r14236 def executablepath():
Adrian Buehlmann
win32: new function executable_path
r13376 '''return full path of hg.exe'''
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 size = 600
buf = ctypes.create_string_buffer(size + 1)
len = _kernel32.GetModuleFileNameA(None, ctypes.byref(buf), size)
Matt Harbison
typing: disable a few errors when accessing Windows specific attributes...
r47542 # pytype: disable=module-attr
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 if len == 0:
Augie Fackler
formatting: blacken the codebase...
r43346 raise ctypes.WinError() # Note: WinError is a function
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 elif len == size:
raise ctypes.WinError(_ERROR_INSUFFICIENT_BUFFER)
Matt Harbison
typing: disable a few errors when accessing Windows specific attributes...
r47542 # pytype: enable=module-attr
Adrian Buehlmann
win32: new function executable_path
r13376 return buf.value
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Harbison
win32: split a utility function to obtain the volume out of getfstype()...
r35530 def getvolumename(path):
"""Get the mount point of the filesystem from a directory or file
(best-effort)
Matt Harbison
win32: implement util.getfstype()...
r35528
Returns None if we are unsure. Raises OSError on ENOENT, EPERM, etc.
"""
# realpath() calls GetFullPathName()
realpath = os.path.realpath(path)
Yuya Nishihara
win32: do not call GetVolumePathName() with the minimum buffer length...
r35564 # allocate at least MAX_PATH long since GetVolumePathName('c:\\', buf, 4)
# somehow fails on Windows XP
size = max(len(realpath), _MAX_PATH) + 1
Matt Harbison
win32: implement util.getfstype()...
r35528 buf = ctypes.create_string_buffer(size)
if not _kernel32.GetVolumePathNameA(realpath, ctypes.byref(buf), size):
Matt Harbison
typing: disable a few errors when accessing Windows specific attributes...
r47542 # Note: WinError is a function
raise ctypes.WinError() # pytype: disable=module-attr
Matt Harbison
win32: implement util.getfstype()...
r35528
Matt Harbison
win32: split a utility function to obtain the volume out of getfstype()...
r35530 return buf.value
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Harbison
win32: split a utility function to obtain the volume out of getfstype()...
r35530 def getfstype(path):
"""Get the filesystem type name from a directory or file (best-effort)
Returns None if we are unsure. Raises OSError on ENOENT, EPERM, etc.
"""
volume = getvolumename(path)
t = _kernel32.GetDriveTypeA(volume)
Matt Harbison
win32: implement util.getfstype()...
r35528
if t == _DRIVE_REMOTE:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return b'cifs'
Augie Fackler
formatting: blacken the codebase...
r43346 elif t not in (
_DRIVE_REMOVABLE,
_DRIVE_FIXED,
_DRIVE_CDROM,
_DRIVE_RAMDISK,
):
Matt Harbison
win32: implement util.getfstype()...
r35528 return None
Yuya Nishihara
win32: allocate buffer of maximum length for GetVolumeInformation()...
r35563 size = _MAX_PATH + 1
Matt Harbison
win32: implement util.getfstype()...
r35528 name = ctypes.create_string_buffer(size)
Augie Fackler
formatting: blacken the codebase...
r43346 if not _kernel32.GetVolumeInformationA(
volume, None, 0, None, None, None, ctypes.byref(name), size
):
Matt Harbison
typing: disable a few errors when accessing Windows specific attributes...
r47542 # Note: WinError is a function
raise ctypes.WinError() # pytype: disable=module-attr
Matt Harbison
win32: implement util.getfstype()...
r35528
return name.value
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Mackall
util: split out posix, windows, and win32 modules
r7890 def getuser():
'''return name of current user'''
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 size = _DWORD(300)
buf = ctypes.create_string_buffer(size.value + 1)
Adrian Buehlmann
win32.py: add argtypes and restype...
r14345 if not _advapi32.GetUserNameA(ctypes.byref(buf), ctypes.byref(size)):
Matt Harbison
typing: disable a few errors when accessing Windows specific attributes...
r47542 raise ctypes.WinError() # pytype: disable=module-attr
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 return buf.value
Matt Mackall
util: split out posix, windows, and win32 modules
r7890
Augie Fackler
formatting: blacken the codebase...
r43346
Adrian Buehlmann
rename util.set_signal_handler to setsignalhandler
r14237 _signalhandler = []
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375
Augie Fackler
formatting: blacken the codebase...
r43346
Adrian Buehlmann
rename util.set_signal_handler to setsignalhandler
r14237 def setsignalhandler():
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Register a termination handler for console events including
Matt Mackall
util: split out posix, windows, and win32 modules
r7890 CTRL+C. python signal handlers do not work well with socket
operations.
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Mackall
util: split out posix, windows, and win32 modules
r7890 def handler(event):
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 _kernel32.ExitProcess(1)
Adrian Buehlmann
rename util.set_signal_handler to setsignalhandler
r14237 if _signalhandler:
Augie Fackler
formatting: blacken the codebase...
r43346 return # already registered
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 h = _SIGNAL_HANDLER(handler)
Augie Fackler
formatting: blacken the codebase...
r43346 _signalhandler.append(h) # needed to prevent garbage collection
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 if not _kernel32.SetConsoleCtrlHandler(h, True):
Matt Harbison
typing: disable a few errors when accessing Windows specific attributes...
r47542 raise ctypes.WinError() # pytype: disable=module-attr
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375
Augie Fackler
formatting: blacken the codebase...
r43346
Patrick Mezard
cmdutil: hide child window created by win32 spawndetached()...
r10240 def hidewindow():
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 def callback(hwnd, pid):
wpid = _DWORD()
Adrian Buehlmann
win32.py: add argtypes and restype...
r14345 _user32.GetWindowThreadProcessId(hwnd, ctypes.byref(wpid))
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 if pid == wpid.value:
Adrian Buehlmann
win32.py: add argtypes and restype...
r14345 _user32.ShowWindow(hwnd, _SW_HIDE)
Augie Fackler
formatting: blacken the codebase...
r43346 return False # stop enumerating windows
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 return True
pid = _kernel32.GetCurrentProcessId()
Adrian Buehlmann
win32.py: add argtypes and restype...
r14345 _user32.EnumWindows(_WNDENUMPROC(callback), pid)
Patrick Mezard
win32: detect console width on Windows...
r11012
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
scmutil: extend termwidth() to return terminal height, renamed to termsize()...
r30314 def termsize():
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 # cmd.exe does not handle CR like a unix console, the CR is
# counted in the line length. On 80 columns consoles, if 80
# characters are written, the following CR won't apply on the
# current line but on the new one. Keep room for it.
Yuya Nishihara
scmutil: clarify that we explicitly do termwidth - 1 on Windows...
r30313 width = 80 - 1
Yuya Nishihara
scmutil: extend termwidth() to return terminal height, renamed to termsize()...
r30314 height = 25
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 # Query stderr to avoid problems with redirections
screenbuf = _kernel32.GetStdHandle(
Augie Fackler
formatting: blacken the codebase...
r43346 _STD_ERROR_HANDLE
) # don't close the handle returned
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 if screenbuf is None or screenbuf == _INVALID_HANDLE_VALUE:
Yuya Nishihara
scmutil: extend termwidth() to return terminal height, renamed to termsize()...
r30314 return width, height
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 csbi = _CONSOLE_SCREEN_BUFFER_INFO()
Augie Fackler
formatting: blacken the codebase...
r43346 if not _kernel32.GetConsoleScreenBufferInfo(screenbuf, ctypes.byref(csbi)):
Yuya Nishihara
scmutil: extend termwidth() to return terminal height, renamed to termsize()...
r30314 return width, height
Yuya Nishihara
scmutil: clarify that we explicitly do termwidth - 1 on Windows...
r30313 width = csbi.srWindow.Right - csbi.srWindow.Left # don't '+ 1'
Yuya Nishihara
scmutil: extend termwidth() to return terminal height, renamed to termsize()...
r30314 height = csbi.srWindow.Bottom - csbi.srWindow.Top + 1
return width, height
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Harbison
win32: add a method to enable ANSI color code processing on Windows 10...
r32664 def enablevtmode():
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Enable virtual terminal mode for the associated console. Return True if
enabled, else False."""
Matt Harbison
win32: add a method to enable ANSI color code processing on Windows 10...
r32664
ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x4
Augie Fackler
formatting: blacken the codebase...
r43346 handle = _kernel32.GetStdHandle(
_STD_OUTPUT_HANDLE
) # don't close the handle
Matt Harbison
win32: add a method to enable ANSI color code processing on Windows 10...
r32664 if handle == _INVALID_HANDLE_VALUE:
return False
mode = _DWORD(0)
if not _kernel32.GetConsoleMode(handle, ctypes.byref(mode)):
return False
if (mode.value & ENABLE_VIRTUAL_TERMINAL_PROCESSING) == 0:
mode.value |= ENABLE_VIRTUAL_TERMINAL_PROCESSING
if not _kernel32.SetConsoleMode(handle, mode):
return False
return True
Augie Fackler
formatting: blacken the codebase...
r43346
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 def spawndetached(args):
# No standard library function really spawns a fully detached
# process under win32 because they allocate pipes or other objects
# to handle standard streams communications. Passing these objects
# to the child process requires handle inheritance to be enabled
# which makes really detached processes impossible.
si = _STARTUPINFO()
si.cb = ctypes.sizeof(_STARTUPINFO)
pi = _PROCESS_INFORMATION()
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 env = b''
Pulkit Goyal
py3: replace os.environ with encoding.environ (part 4 of 5)
r30637 for k in encoding.environ:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 env += b"%s=%s\0" % (k, encoding.environ[k])
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 if not env:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 env = b'\0'
env += b'\0'
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375
Matt Harbison
py3: resolve Unicode issues around `hg serve` on Windows...
r39755 args = subprocess.list2cmdline(pycompat.rapply(encoding.strfromlocal, args))
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375
Matt Harbison
py3: resolve Unicode issues around `hg serve` on Windows...
r39755 # TODO: CreateProcessW on py3?
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 res = _kernel32.CreateProcessA(
Augie Fackler
formatting: blacken the codebase...
r43346 None,
encoding.strtolocal(args),
None,
None,
False,
_CREATE_NO_WINDOW,
env,
encoding.getcwd(),
ctypes.byref(si),
ctypes.byref(pi),
)
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375 if not res:
Matt Harbison
typing: disable a few errors when accessing Windows specific attributes...
r47542 raise ctypes.WinError() # pytype: disable=module-attr
Adrian Buehlmann
port win32.py to using the Python ctypes library...
r13375
Matt Harbison
win32: close the handles associated with a spawned child process...
r40964 _kernel32.CloseHandle(pi.hProcess)
_kernel32.CloseHandle(pi.hThread)
Matt Harbison
win32: drop a py26 daemonizing hack...
r32676 return pi.dwProcessId
Adrian Buehlmann
windows: move unlink to win32.py...
r13775
Augie Fackler
formatting: blacken the codebase...
r43346
Adrian Buehlmann
windows: move unlink to win32.py...
r13775 def unlink(f):
'''try to implement POSIX' unlink semantics on Windows'''
Steve Borho
win32: backout 1a9ebc83a74c...
r21226 if os.path.isdir(f):
# use EPERM because it is POSIX prescribed value, even though
# unlink(2) on directories returns EISDIR on Linux
Augie Fackler
formatting: blacken the codebase...
r43346 raise IOError(
errno.EPERM,
r"Unlinking directory not permitted: '%s'"
% encoding.strfromlocal(f),
)
FUJIWARA Katsunori
windows: check target type before actual unlinking to follow POSIX semantics...
r19159
Adrian Buehlmann
windows: move unlink to win32.py...
r13775 # POSIX allows to unlink and rename open files. Windows has serious
# problems with doing that:
# - Calling os.unlink (or os.rename) on a file f fails if f or any
# hardlinked copy of f has been opened with Python's open(). There is no
# way such a file can be deleted or renamed on Windows (other than
# scheduling the delete or rename for the next reboot).
# - Calling os.unlink on a file that has been opened with Mercurial's
# posixfile (or comparable methods) will delay the actual deletion of
# the file for as long as the file is held open. The filename is blocked
# during that time and cannot be used for recreating a new file under
# that same name ("zombie file"). Directories containing such zombie files
# cannot be removed or moved.
# A file that has been opened with posixfile can be renamed, so we rename
# f to a random temporary name before calling os.unlink on it. This allows
# callers to recreate f immediately while having other readers do their
# implicit zombie filename blocking on a temporary name.
Gregory Szorc
global: use pycompat.xrange()...
r38806 for tries in pycompat.xrange(10):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 temp = b'%s-%08x' % (f, random.randint(0, 0xFFFFFFFF))
Adrian Buehlmann
windows: move unlink to win32.py...
r13775 try:
os.rename(f, temp) # raises OSError EEXIST if temp exists
break
Gregory Szorc
global: mass rewrite to use modern exception syntax...
r25660 except OSError as e:
Adrian Buehlmann
windows: move unlink to win32.py...
r13775 if e.errno != errno.EEXIST:
raise
else:
Augie Fackler
cleanup: remove pointless r-prefixes on double-quoted strings...
r43809 raise IOError(errno.EEXIST, "No usable temporary filename found")
Adrian Buehlmann
windows: move unlink to win32.py...
r13775
try:
os.unlink(temp)
Adrian Buehlmann
win32: remove READONLY attribute on unlink
r13776 except OSError:
# The unlink might have failed because the READONLY attribute may heave
# been set on the original file. Rename works fine with READONLY set,
# but not os.unlink. Reset all attributes and try again.
_kernel32.SetFileAttributesA(temp, _FILE_ATTRIBUTE_NORMAL)
try:
os.unlink(temp)
except OSError:
# The unlink might have failed due to some very rude AV-Scanners.
# Leaking a tempfile is the lesser evil than aborting here and
# leaving some potentially serious inconsistencies.
pass
Adrian Buehlmann
set NOT_CONTENT_INDEXED on .hg dir (issue2694)...
r13795
Augie Fackler
formatting: blacken the codebase...
r43346
Adrian Buehlmann
set NOT_CONTENT_INDEXED on .hg dir (issue2694)...
r13795 def makedir(path, notindexed):
os.mkdir(path)
if notindexed:
_kernel32.SetFileAttributesA(path, _FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)