mercurial/win32.py
author Idan Kamara <idankk86@gmail.com>
Tue, 19 Apr 2011 01:08:35 +0300
changeset 13953 ae10a5e8e558
parent 13795 43b5fe18ea6c
child 13976 9ca1ff3d4f8c
permissions -rw-r--r--
identify: restructure code to make it more readable
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
13377
4ac565a30e84 win32: move system_rcpath_win32() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13376
diff changeset
     8
import encoding
13775
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
     9
import ctypes, errno, os, struct, subprocess, random
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    10
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    11
_kernel32 = ctypes.windll.kernel32
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    12
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    13
_BOOL = ctypes.c_long
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    14
_WORD = ctypes.c_ushort
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    15
_DWORD = ctypes.c_ulong
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    16
_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
    17
_HANDLE = ctypes.c_void_p
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    18
_HWND = _HANDLE
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    19
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    20
_INVALID_HANDLE_VALUE = -1
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    21
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    22
# GetLastError
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    23
_ERROR_SUCCESS = 0
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    24
_ERROR_INVALID_PARAMETER = 87
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    25
_ERROR_INSUFFICIENT_BUFFER = 122
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    26
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    27
# 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
    28
# 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
    29
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
    30
    _WPARAM = ctypes.c_ulong
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    31
    _LPARAM = ctypes.c_long
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    32
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
    33
    _WPARAM = ctypes.c_ulonglong
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    34
    _LPARAM = ctypes.c_longlong
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    35
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    36
class _FILETIME(ctypes.Structure):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    37
    _fields_ = [('dwLowDateTime', _DWORD),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    38
                ('dwHighDateTime', _DWORD)]
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    39
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    40
class _BY_HANDLE_FILE_INFORMATION(ctypes.Structure):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    41
    _fields_ = [('dwFileAttributes', _DWORD),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    42
                ('ftCreationTime', _FILETIME),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    43
                ('ftLastAccessTime', _FILETIME),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    44
                ('ftLastWriteTime', _FILETIME),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    45
                ('dwVolumeSerialNumber', _DWORD),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    46
                ('nFileSizeHigh', _DWORD),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    47
                ('nFileSizeLow', _DWORD),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    48
                ('nNumberOfLinks', _DWORD),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    49
                ('nFileIndexHigh', _DWORD),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    50
                ('nFileIndexLow', _DWORD)]
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    51
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    52
# CreateFile 
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    53
_FILE_SHARE_READ = 0x00000001
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    54
_FILE_SHARE_WRITE = 0x00000002
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    55
_FILE_SHARE_DELETE = 0x00000004
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    56
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    57
_OPEN_EXISTING = 3
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    58
13776
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
    59
# SetFileAttributes
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
    60
_FILE_ATTRIBUTE_NORMAL = 0x80
13795
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13776
diff changeset
    61
_FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x2000
13776
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
    62
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    63
# Process Security and Access Rights
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    64
_PROCESS_QUERY_INFORMATION = 0x0400
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    65
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    66
# GetExitCodeProcess
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    67
_STILL_ACTIVE = 259
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    68
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    69
# registry
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    70
_HKEY_CURRENT_USER = 0x80000001L
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    71
_HKEY_LOCAL_MACHINE = 0x80000002L
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    72
_KEY_READ = 0x20019
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    73
_REG_SZ = 1
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    74
_REG_DWORD = 4
8227
0a9542703300 turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents: 8226
diff changeset
    75
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    76
class _STARTUPINFO(ctypes.Structure):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    77
    _fields_ = [('cb', _DWORD),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    78
                ('lpReserved', _LPSTR),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    79
                ('lpDesktop', _LPSTR),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    80
                ('lpTitle', _LPSTR),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    81
                ('dwX', _DWORD),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    82
                ('dwY', _DWORD),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    83
                ('dwXSize', _DWORD),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    84
                ('dwYSize', _DWORD),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    85
                ('dwXCountChars', _DWORD),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    86
                ('dwYCountChars', _DWORD),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    87
                ('dwFillAttribute', _DWORD),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    88
                ('dwFlags', _DWORD),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    89
                ('wShowWindow', _WORD),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    90
                ('cbReserved2', _WORD),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    91
                ('lpReserved2', ctypes.c_char_p),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    92
                ('hStdInput', _HANDLE),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    93
                ('hStdOutput', _HANDLE),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    94
                ('hStdError', _HANDLE)]
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    95
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    96
class _PROCESS_INFORMATION(ctypes.Structure):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    97
    _fields_ = [('hProcess', _HANDLE),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    98
                ('hThread', _HANDLE),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    99
                ('dwProcessId', _DWORD),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   100
                ('dwThreadId', _DWORD)]
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   101
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   102
_DETACHED_PROCESS = 0x00000008
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   103
_STARTF_USESHOWWINDOW = 0x00000001
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   104
_SW_HIDE = 0
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   105
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   106
class _COORD(ctypes.Structure):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   107
    _fields_ = [('X', ctypes.c_short),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   108
                ('Y', ctypes.c_short)]
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   109
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   110
class _SMALL_RECT(ctypes.Structure):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   111
    _fields_ = [('Left', ctypes.c_short),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   112
                ('Top', ctypes.c_short),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   113
                ('Right', ctypes.c_short),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   114
                ('Bottom', ctypes.c_short)]
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   115
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   116
class _CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   117
    _fields_ = [('dwSize', _COORD),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   118
                ('dwCursorPosition', _COORD),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   119
                ('wAttributes', _WORD),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   120
                ('srWindow', _SMALL_RECT),
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   121
                ('dwMaximumWindowSize', _COORD)]
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   122
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   123
_STD_ERROR_HANDLE = 0xfffffff4L # (DWORD)-12
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   124
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   125
def _raiseoserror(name):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   126
    err = ctypes.WinError()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   127
    raise OSError(err.errno, '%s: %s' % (name, err.strerror))
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   128
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   129
def _getfileinfo(name):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   130
    fh = _kernel32.CreateFileA(name, 0,
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   131
            _FILE_SHARE_READ | _FILE_SHARE_WRITE | _FILE_SHARE_DELETE,
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   132
            None, _OPEN_EXISTING, 0, None)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   133
    if fh == _INVALID_HANDLE_VALUE:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   134
        _raiseoserror(name)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   135
    try:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   136
        fi = _BY_HANDLE_FILE_INFORMATION()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   137
        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
   138
            _raiseoserror(name)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   139
        return fi
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   140
    finally:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   141
        _kernel32.CloseHandle(fh)
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   142
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   143
def os_link(src, dst):
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   144
    if not _kernel32.CreateHardLinkA(dst, src, None):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   145
        _raiseoserror(src)
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   146
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   147
def nlinks(name):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   148
    '''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
   149
    return _getfileinfo(name).nNumberOfLinks
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   150
10218
750b7a4f01f6 Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents: 9198
diff changeset
   151
def samefile(fpath1, fpath2):
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   152
    '''Returns whether fpath1 and fpath2 refer to the same file. This is only
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   153
    guaranteed to work for files, not directories.'''
10218
750b7a4f01f6 Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents: 9198
diff changeset
   154
    res1 = _getfileinfo(fpath1)
750b7a4f01f6 Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents: 9198
diff changeset
   155
    res2 = _getfileinfo(fpath2)
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   156
    return (res1.dwVolumeSerialNumber == res2.dwVolumeSerialNumber
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   157
        and res1.nFileIndexHigh == res2.nFileIndexHigh
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   158
        and res1.nFileIndexLow == res2.nFileIndexLow)
10218
750b7a4f01f6 Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents: 9198
diff changeset
   159
750b7a4f01f6 Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents: 9198
diff changeset
   160
def samedevice(fpath1, fpath2):
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   161
    '''Returns whether fpath1 and fpath2 are on the same device. This is only
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   162
    guaranteed to work for files, not directories.'''
10218
750b7a4f01f6 Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents: 9198
diff changeset
   163
    res1 = _getfileinfo(fpath1)
750b7a4f01f6 Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents: 9198
diff changeset
   164
    res2 = _getfileinfo(fpath2)
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   165
    return res1.dwVolumeSerialNumber == res2.dwVolumeSerialNumber
10218
750b7a4f01f6 Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents: 9198
diff changeset
   166
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   167
def testpid(pid):
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   168
    '''return True if pid is still running or unable to
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   169
    determine, False otherwise'''
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   170
    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
   171
    if h:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   172
        try:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   173
            status = _DWORD()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   174
            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
   175
                return status.value == _STILL_ACTIVE
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   176
        finally:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   177
            _kernel32.CloseHandle(h)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   178
    return _kernel32.GetLastError() != _ERROR_INVALID_PARAMETER
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   179
6006
3c9dbb743d20 merge: add registry look up bits to tool search
Matt Mackall <mpm@selenic.com>
parents: 5969
diff changeset
   180
def lookup_reg(key, valname=None, scope=None):
3c9dbb743d20 merge: add registry look up bits to tool search
Matt Mackall <mpm@selenic.com>
parents: 5969
diff changeset
   181
    ''' Look up a key/value name in the Windows registry.
3c9dbb743d20 merge: add registry look up bits to tool search
Matt Mackall <mpm@selenic.com>
parents: 5969
diff changeset
   182
3c9dbb743d20 merge: add registry look up bits to tool search
Matt Mackall <mpm@selenic.com>
parents: 5969
diff changeset
   183
    valname: value name. If unspecified, the default value for the key
3c9dbb743d20 merge: add registry look up bits to tool search
Matt Mackall <mpm@selenic.com>
parents: 5969
diff changeset
   184
    is used.
3c9dbb743d20 merge: add registry look up bits to tool search
Matt Mackall <mpm@selenic.com>
parents: 5969
diff changeset
   185
    scope: optionally specify scope for registry lookup, this can be
3c9dbb743d20 merge: add registry look up bits to tool search
Matt Mackall <mpm@selenic.com>
parents: 5969
diff changeset
   186
    a sequence of scopes to look up in order. Default (CURRENT_USER,
3c9dbb743d20 merge: add registry look up bits to tool search
Matt Mackall <mpm@selenic.com>
parents: 5969
diff changeset
   187
    LOCAL_MACHINE).
3c9dbb743d20 merge: add registry look up bits to tool search
Matt Mackall <mpm@selenic.com>
parents: 5969
diff changeset
   188
    '''
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   189
    adv = ctypes.windll.advapi32
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   190
    byref = ctypes.byref
6006
3c9dbb743d20 merge: add registry look up bits to tool search
Matt Mackall <mpm@selenic.com>
parents: 5969
diff changeset
   191
    if scope is None:
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   192
        scope = (_HKEY_CURRENT_USER, _HKEY_LOCAL_MACHINE)
6006
3c9dbb743d20 merge: add registry look up bits to tool search
Matt Mackall <mpm@selenic.com>
parents: 5969
diff changeset
   193
    elif not isinstance(scope, (list, tuple)):
3c9dbb743d20 merge: add registry look up bits to tool search
Matt Mackall <mpm@selenic.com>
parents: 5969
diff changeset
   194
        scope = (scope,)
3c9dbb743d20 merge: add registry look up bits to tool search
Matt Mackall <mpm@selenic.com>
parents: 5969
diff changeset
   195
    for s in scope:
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   196
        kh = _HANDLE()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   197
        res = adv.RegOpenKeyExA(s, key, 0, _KEY_READ, ctypes.byref(kh))
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   198
        if res != _ERROR_SUCCESS:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   199
            continue
6880
892806b3fc0f util: disinfect lookup_reg strings (issue1126)
Matt Mackall <mpm@selenic.com>
parents: 6216
diff changeset
   200
        try:
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   201
            size = _DWORD(600)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   202
            type = _DWORD()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   203
            buf = ctypes.create_string_buffer(size.value + 1)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   204
            res = adv.RegQueryValueExA(kh.value, valname, None,
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   205
                                       byref(type), buf, byref(size))
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   206
            if res != _ERROR_SUCCESS:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   207
                continue
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   208
            if type.value == _REG_SZ:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   209
                # never let a Unicode string escape into the wild
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   210
                return encoding.tolocal(buf.value.encode('UTF-8'))
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   211
            elif type.value == _REG_DWORD:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   212
                fmt = '<L'
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   213
                s = ctypes.string_at(byref(buf), struct.calcsize(fmt))
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   214
                return struct.unpack(fmt, s)[0]
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   215
        finally:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   216
            adv.RegCloseKey(kh.value)
6006
3c9dbb743d20 merge: add registry look up bits to tool search
Matt Mackall <mpm@selenic.com>
parents: 5969
diff changeset
   217
13376
60b5c6c3fd12 win32: new function executable_path
Adrian Buehlmann <adrian@cadifra.com>
parents: 13375
diff changeset
   218
def executable_path():
60b5c6c3fd12 win32: new function executable_path
Adrian Buehlmann <adrian@cadifra.com>
parents: 13375
diff changeset
   219
    '''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
   220
    size = 600
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   221
    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
   222
    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
   223
    if len == 0:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   224
        raise ctypes.WinError()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   225
    elif len == size:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   226
        raise ctypes.WinError(_ERROR_INSUFFICIENT_BUFFER)
13376
60b5c6c3fd12 win32: new function executable_path
Adrian Buehlmann <adrian@cadifra.com>
parents: 13375
diff changeset
   227
    return buf.value
60b5c6c3fd12 win32: new function executable_path
Adrian Buehlmann <adrian@cadifra.com>
parents: 13375
diff changeset
   228
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents: 7778
diff changeset
   229
def getuser():
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents: 7778
diff changeset
   230
    '''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
   231
    adv = ctypes.windll.advapi32
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   232
    size = _DWORD(300)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   233
    buf = ctypes.create_string_buffer(size.value + 1)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   234
    if not adv.GetUserNameA(ctypes.byref(buf), ctypes.byref(size)):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   235
        raise ctypes.WinError()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   236
    return buf.value
4672
272c0a09b203 Handle CTRL+C in serve under Windows.
Marcos Chaves <marcos.nospam@gmail.com>
parents: 4407
diff changeset
   237
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   238
_SIGNAL_HANDLER = ctypes.WINFUNCTYPE(_BOOL, _DWORD)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   239
_signal_handler = []
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   240
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   241
def set_signal_handler():
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   242
    '''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
   243
    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
   244
    operations.
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   245
    '''
4672
272c0a09b203 Handle CTRL+C in serve under Windows.
Marcos Chaves <marcos.nospam@gmail.com>
parents: 4407
diff changeset
   246
    def handler(event):
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   247
        _kernel32.ExitProcess(1)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   248
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   249
    if _signal_handler:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   250
        return # already registered
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   251
    h = _SIGNAL_HANDLER(handler)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   252
    _signal_handler.append(h) # needed to prevent garbage collection
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   253
    if not _kernel32.SetConsoleCtrlHandler(h, True):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   254
        raise ctypes.WinError()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   255
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   256
_WNDENUMPROC = ctypes.WINFUNCTYPE(_BOOL, _HWND, _LPARAM)
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents: 7778
diff changeset
   257
10240
3af4b39afe2a cmdutil: hide child window created by win32 spawndetached()
Patrick Mezard <pmezard@gmail.com>
parents: 10219
diff changeset
   258
def hidewindow():
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   259
    user32 = ctypes.windll.user32
10240
3af4b39afe2a cmdutil: hide child window created by win32 spawndetached()
Patrick Mezard <pmezard@gmail.com>
parents: 10219
diff changeset
   260
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   261
    def callback(hwnd, pid):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   262
        wpid = _DWORD()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   263
        user32.GetWindowThreadProcessId(hwnd, ctypes.byref(wpid))
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   264
        if pid == wpid.value:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   265
            user32.ShowWindow(hwnd, _SW_HIDE)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   266
            return False # stop enumerating windows
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   267
        return True
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   268
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   269
    pid = _kernel32.GetCurrentProcessId()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   270
    user32.EnumWindows(_WNDENUMPROC(callback), pid)
11012
81631f0cf13b win32: detect console width on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 10388
diff changeset
   271
12689
c52c629ce19e termwidth: move to ui.ui from util
Augie Fackler <durin42@gmail.com>
parents: 12401
diff changeset
   272
def termwidth():
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   273
    # 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
   274
    # 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
   275
    # 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
   276
    # current line but on the new one. Keep room for it.
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   277
    width = 79
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   278
    # 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
   279
    screenbuf = _kernel32.GetStdHandle(
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   280
                  _STD_ERROR_HANDLE) # don't close the handle returned
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   281
    if screenbuf is None or screenbuf == _INVALID_HANDLE_VALUE:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   282
        return width
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   283
    csbi = _CONSOLE_SCREEN_BUFFER_INFO()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   284
    if not _kernel32.GetConsoleScreenBufferInfo(
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   285
                        screenbuf, ctypes.byref(csbi)):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   286
        return width
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   287
    width = csbi.srWindow.Right - csbi.srWindow.Left
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   288
    return width
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   289
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   290
def spawndetached(args):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   291
    # 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
   292
    # 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
   293
    # 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
   294
    # 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
   295
    # 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
   296
    si = _STARTUPINFO()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   297
    si.cb = ctypes.sizeof(_STARTUPINFO)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   298
    si.dwFlags = _STARTF_USESHOWWINDOW
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   299
    si.wShowWindow = _SW_HIDE
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   300
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   301
    pi = _PROCESS_INFORMATION()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   302
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   303
    env = ''
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   304
    for k in os.environ:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   305
        env += "%s=%s\0" % (k, os.environ[k])
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   306
    if not env:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   307
        env = '\0'
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   308
    env += '\0'
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   309
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   310
    args = subprocess.list2cmdline(args)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   311
    # Not running the command in shell mode makes python26 hang when
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   312
    # writing to hgweb output socket.
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   313
    comspec = os.environ.get("COMSPEC", "cmd.exe")
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   314
    args = comspec + " /c " + args
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   315
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   316
    res = _kernel32.CreateProcessA(
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   317
        None, args, None, None, False, _DETACHED_PROCESS,
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   318
        env, os.getcwd(), ctypes.byref(si), ctypes.byref(pi))
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   319
    if not res:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   320
        raise ctypes.WinError()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   321
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   322
    return pi.dwProcessId
13775
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   323
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   324
def unlink(f):
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   325
    '''try to implement POSIX' unlink semantics on Windows'''
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   326
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   327
    # 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
   328
    # problems with doing that:
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   329
    # - 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
   330
    #   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
   331
    #   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
   332
    #   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
   333
    # - 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
   334
    #   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
   335
    #   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
   336
    #   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
   337
    #   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
   338
    #   cannot be removed or moved.
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   339
    # 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
   340
    # 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
   341
    # 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
   342
    # implicit zombie filename blocking on a temporary name.
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   343
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   344
    for tries in xrange(10):
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   345
        temp = '%s-%08x' % (f, random.randint(0, 0xffffffff))
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   346
        try:
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   347
            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
   348
            break
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   349
        except OSError, e:
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   350
            if e.errno != errno.EEXIST:
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   351
                raise
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   352
    else:
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   353
        raise IOError, (errno.EEXIST, "No usable temporary filename found")
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   354
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   355
    try:
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   356
        os.unlink(temp)
13776
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
   357
    except OSError:
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
   358
        # 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
   359
        # 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
   360
        # 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
   361
        _kernel32.SetFileAttributesA(temp, _FILE_ATTRIBUTE_NORMAL)
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
   362
        try:
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
   363
            os.unlink(temp)
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
   364
        except OSError:
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
   365
            # 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
   366
            # 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
   367
            # leaving some potentially serious inconsistencies.
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
   368
            pass
13795
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13776
diff changeset
   369
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13776
diff changeset
   370
def makedir(path, notindexed):
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13776
diff changeset
   371
    os.mkdir(path)
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13776
diff changeset
   372
    if notindexed:
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13776
diff changeset
   373
        _kernel32.SetFileAttributesA(path, _FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)