Mercurial > hg
annotate mercurial/win32.py @ 26623:5a95fe44121d
clonebundles: support for seeding clones from pre-generated bundles
Cloning can be an expensive operation for servers because the server
generates a bundle from existing repository data at request time. For
a large repository like mozilla-central, this consumes 4+ minutes
of CPU time on the server. It also results in significant network
utilization. Multiplied by hundreds or even thousands of clients and
the ensuing load can result in difficulties scaling the Mercurial server.
Despite generation of bundles being deterministic until the next
changeset is added, the generation of bundles to service a clone request
is not cached. Each clone thus performs redundant work. This is
wasteful.
This patch introduces the "clonebundles" extension and related
client-side functionality to help alleviate this deficiency. The
client-side feature is behind an experimental flag and is not enabled by
default.
It works as follows:
1) Server operator generates a bundle and makes it available on a
server (likely HTTP).
2) Server operator defines the URL of a bundle file in a
.hg/clonebundles.manifest file.
3) Client `hg clone`ing sees the server is advertising bundle URLs.
4) Client fetches and applies the advertised bundle.
5) Client performs equivalent of `hg pull` to fetch changes made since
the bundle was created.
Essentially, the server performs the expensive work of generating a
bundle once and all subsequent clones fetch a static file from
somewhere. Scaling static file serving is a much more manageable
problem than scaling a Python application like Mercurial. Assuming your
repository grows less than 1% per day, the end result is 99+% of CPU
and network load from clones is eliminated, allowing Mercurial servers
to scale more easily. Serving static files also means data can be
transferred to clients as fast as they can consume it, rather than as
fast as servers can generate it. This makes clones faster.
Mozilla has implemented similar functionality of this patch on
hg.mozilla.org using a custom extension. We are hosting bundle files in
Amazon S3 and CloudFront (a CDN) and have successfully offloaded
>1 TB/day in data transfer from hg.mozilla.org, freeing up significant
bandwidth and CPU resources. The positive impact has been stellar and
I believe it has proved its value to be included in Mercurial core. I
feel it is important for the client-side support to be enabled in core
by default because it means that clients will get faster, more reliable
clones and will enable server operators to reduce load without
requiring any client-side configuration changes (assuming clients are
up to date, of course).
The scope of this feature is narrowly and specifically tailored to
cloning, despite "serve pulls from pre-generated bundles" being a valid
and useful feature. I would eventually like for Mercurial servers to
support transferring *all* repository data via statically hosted files.
You could imagine a server that siphons all pushed data to bundle files
and instructs clients to apply a stream of bundles to reconstruct all
repository data. This feature, while useful and powerful, is
significantly more work to implement because it requires the server
component have awareness of discovery and a mapping of which changesets
are in which files. Full, clone bundles, by contrast, are much simpler.
The wire protocol command is named "clonebundles" instead of something
more generic like "staticbundles" to leave the door open for a new, more
powerful and more generic server-side component with minimal backwards
compatibility implications. The name "bundleclone" is used by Mozilla's
extension and would cause problems since there are subtle differences
in Mozilla's extension.
Mozilla's experience with this idea has taught us that some form of
"content negotiation" is required. Not all clients will support all
bundle formats or even URLs (advanced TLS requirements, etc). To ensure
the highest uptake possible, a server needs to advertise multiple
versions of bundles and clients need to be able to choose the most
appropriate from that list one. The "attributes" in each
server-advertised entry facilitate this filtering and sorting. Their
use will become apparent in subsequent patches.
Initial inspiration and credit for the idea of cloning from static files
belongs to Augie Fackler and his "lookaside clone" extension proof of
concept.
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Fri, 09 Oct 2015 11:22:01 -0700 |
parents | d6beeb618700 |
children | 392633d7860e |
rev | line source |
---|---|
8226
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
1 # win32.py - utility functions that use win32 API |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
2 # |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
3 # Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
4 # |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
10263 | 6 # GNU General Public License version 2 or any later version. |
8227
0a9542703300
turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents:
8226
diff
changeset
|
7 |
25994
d6beeb618700
win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
8 from __future__ import absolute_import |
d6beeb618700
win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
9 |
d6beeb618700
win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
10 import ctypes |
d6beeb618700
win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
11 import errno |
d6beeb618700
win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
12 import msvcrt |
d6beeb618700
win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
13 import os |
d6beeb618700
win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
14 import random |
d6beeb618700
win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
15 import subprocess |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
16 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
17 _kernel32 = ctypes.windll.kernel32 |
14345
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
18 _advapi32 = ctypes.windll.advapi32 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
19 _user32 = ctypes.windll.user32 |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
20 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
21 _BOOL = ctypes.c_long |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
22 _WORD = ctypes.c_ushort |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
23 _DWORD = ctypes.c_ulong |
14345
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
24 _UINT = ctypes.c_uint |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
25 _LONG = ctypes.c_long |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
26 _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
|
27 _HANDLE = ctypes.c_void_p |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
28 _HWND = _HANDLE |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
29 |
14345
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
30 _INVALID_HANDLE_VALUE = _HANDLE(-1).value |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
31 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
32 # GetLastError |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
33 _ERROR_SUCCESS = 0 |
21193
07f9825865de
win32: add missing definition of _ERROR_NO_MORE_FILES caught by pyflakes
Yuya Nishihara <yuya@tcha.org>
parents:
20528
diff
changeset
|
34 _ERROR_NO_MORE_FILES = 18 |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
35 _ERROR_INVALID_PARAMETER = 87 |
24652
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
36 _ERROR_BROKEN_PIPE = 109 |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
37 _ERROR_INSUFFICIENT_BUFFER = 122 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
38 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
39 # 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
|
40 # 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
|
41 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
|
42 _WPARAM = ctypes.c_ulong |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
43 _LPARAM = ctypes.c_long |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
44 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
|
45 _WPARAM = ctypes.c_ulonglong |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
46 _LPARAM = ctypes.c_longlong |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
47 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
48 class _FILETIME(ctypes.Structure): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
49 _fields_ = [('dwLowDateTime', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
50 ('dwHighDateTime', _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 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
|
53 _fields_ = [('dwFileAttributes', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
54 ('ftCreationTime', _FILETIME), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
55 ('ftLastAccessTime', _FILETIME), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
56 ('ftLastWriteTime', _FILETIME), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
57 ('dwVolumeSerialNumber', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
58 ('nFileSizeHigh', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
59 ('nFileSizeLow', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
60 ('nNumberOfLinks', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
61 ('nFileIndexHigh', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
62 ('nFileIndexLow', _DWORD)] |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
63 |
18959
2f6418d8a4c9
check-code: catch trailing space in comments
Mads Kiilerich <madski@unity3d.com>
parents:
18175
diff
changeset
|
64 # CreateFile |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
65 _FILE_SHARE_READ = 0x00000001 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
66 _FILE_SHARE_WRITE = 0x00000002 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
67 _FILE_SHARE_DELETE = 0x00000004 |
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 _OPEN_EXISTING = 3 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
70 |
17006
6fc7fd72ba3e
win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents:
16807
diff
changeset
|
71 _FILE_FLAG_BACKUP_SEMANTICS = 0x02000000 |
6fc7fd72ba3e
win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents:
16807
diff
changeset
|
72 |
13776
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
73 # SetFileAttributes |
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
74 _FILE_ATTRIBUTE_NORMAL = 0x80 |
13795
43b5fe18ea6c
set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13776
diff
changeset
|
75 _FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x2000 |
13776
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
76 |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
77 # Process Security and Access Rights |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
78 _PROCESS_QUERY_INFORMATION = 0x0400 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
79 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
80 # GetExitCodeProcess |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
81 _STILL_ACTIVE = 259 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
82 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
83 class _STARTUPINFO(ctypes.Structure): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
84 _fields_ = [('cb', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
85 ('lpReserved', _LPSTR), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
86 ('lpDesktop', _LPSTR), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
87 ('lpTitle', _LPSTR), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
88 ('dwX', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
89 ('dwY', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
90 ('dwXSize', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
91 ('dwYSize', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
92 ('dwXCountChars', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
93 ('dwYCountChars', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
94 ('dwFillAttribute', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
95 ('dwFlags', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
96 ('wShowWindow', _WORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
97 ('cbReserved2', _WORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
98 ('lpReserved2', ctypes.c_char_p), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
99 ('hStdInput', _HANDLE), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
100 ('hStdOutput', _HANDLE), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
101 ('hStdError', _HANDLE)] |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
102 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
103 class _PROCESS_INFORMATION(ctypes.Structure): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
104 _fields_ = [('hProcess', _HANDLE), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
105 ('hThread', _HANDLE), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
106 ('dwProcessId', _DWORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
107 ('dwThreadId', _DWORD)] |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
108 |
17050
e780fb37168b
win32: specify _CREATE_NO_WINDOW on spawndetached()
Adrian Buehlmann <adrian@cadifra.com>
parents:
17006
diff
changeset
|
109 _CREATE_NO_WINDOW = 0x08000000 |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
110 _SW_HIDE = 0 |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
111 |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
112 class _COORD(ctypes.Structure): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
113 _fields_ = [('X', ctypes.c_short), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
114 ('Y', 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 _SMALL_RECT(ctypes.Structure): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
117 _fields_ = [('Left', ctypes.c_short), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
118 ('Top', ctypes.c_short), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
119 ('Right', ctypes.c_short), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
120 ('Bottom', ctypes.c_short)] |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
121 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
122 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
|
123 _fields_ = [('dwSize', _COORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
124 ('dwCursorPosition', _COORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
125 ('wAttributes', _WORD), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
126 ('srWindow', _SMALL_RECT), |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
127 ('dwMaximumWindowSize', _COORD)] |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
128 |
14344
e1db8a00188b
win32.py: more explicit definition of _STD_ERROR_HANDLE
Adrian Buehlmann <adrian@cadifra.com>
parents:
14237
diff
changeset
|
129 _STD_ERROR_HANDLE = _DWORD(-12).value |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
130 |
20425
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
131 # CreateToolhelp32Snapshot, Process32First, Process32Next |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
132 _TH32CS_SNAPPROCESS = 0x00000002 |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
133 _MAX_PATH = 260 |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
134 |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
135 class _tagPROCESSENTRY32(ctypes.Structure): |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
136 _fields_ = [('dwsize', _DWORD), |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
137 ('cntUsage', _DWORD), |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
138 ('th32ProcessID', _DWORD), |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
139 ('th32DefaultHeapID', ctypes.c_void_p), |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
140 ('th32ModuleID', _DWORD), |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
141 ('cntThreads', _DWORD), |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
142 ('th32ParentProcessID', _DWORD), |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
143 ('pcPriClassBase', _LONG), |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
144 ('dwFlags', _DWORD), |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
145 ('szExeFile', ctypes.c_char * _MAX_PATH)] |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
146 |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
147 def __init__(self): |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
148 super(_tagPROCESSENTRY32, self).__init__() |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
149 self.dwsize = ctypes.sizeof(self) |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
150 |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
151 |
14345
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
152 # types of parameters of C functions used (required by pypy) |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
153 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
154 _kernel32.CreateFileA.argtypes = [_LPCSTR, _DWORD, _DWORD, ctypes.c_void_p, |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
155 _DWORD, _DWORD, _HANDLE] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
156 _kernel32.CreateFileA.restype = _HANDLE |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
157 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
158 _kernel32.GetFileInformationByHandle.argtypes = [_HANDLE, ctypes.c_void_p] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
159 _kernel32.GetFileInformationByHandle.restype = _BOOL |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
160 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
161 _kernel32.CloseHandle.argtypes = [_HANDLE] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
162 _kernel32.CloseHandle.restype = _BOOL |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
163 |
15095
ec222a29bdf0
win32: quietly ignore missing CreateHardLinkA for Wine
Matt Mackall <mpm@selenic.com>
parents:
14345
diff
changeset
|
164 try: |
ec222a29bdf0
win32: quietly ignore missing CreateHardLinkA for Wine
Matt Mackall <mpm@selenic.com>
parents:
14345
diff
changeset
|
165 _kernel32.CreateHardLinkA.argtypes = [_LPCSTR, _LPCSTR, ctypes.c_void_p] |
ec222a29bdf0
win32: quietly ignore missing CreateHardLinkA for Wine
Matt Mackall <mpm@selenic.com>
parents:
14345
diff
changeset
|
166 _kernel32.CreateHardLinkA.restype = _BOOL |
ec222a29bdf0
win32: quietly ignore missing CreateHardLinkA for Wine
Matt Mackall <mpm@selenic.com>
parents:
14345
diff
changeset
|
167 except AttributeError: |
ec222a29bdf0
win32: quietly ignore missing CreateHardLinkA for Wine
Matt Mackall <mpm@selenic.com>
parents:
14345
diff
changeset
|
168 pass |
14345
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
169 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
170 _kernel32.SetFileAttributesA.argtypes = [_LPCSTR, _DWORD] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
171 _kernel32.SetFileAttributesA.restype = _BOOL |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
172 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
173 _kernel32.OpenProcess.argtypes = [_DWORD, _BOOL, _DWORD] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
174 _kernel32.OpenProcess.restype = _HANDLE |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
175 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
176 _kernel32.GetExitCodeProcess.argtypes = [_HANDLE, ctypes.c_void_p] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
177 _kernel32.GetExitCodeProcess.restype = _BOOL |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
178 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
179 _kernel32.GetLastError.argtypes = [] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
180 _kernel32.GetLastError.restype = _DWORD |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
181 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
182 _kernel32.GetModuleFileNameA.argtypes = [_HANDLE, ctypes.c_void_p, _DWORD] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
183 _kernel32.GetModuleFileNameA.restype = _DWORD |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
184 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
185 _kernel32.CreateProcessA.argtypes = [_LPCSTR, _LPCSTR, ctypes.c_void_p, |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
186 ctypes.c_void_p, _BOOL, _DWORD, ctypes.c_void_p, _LPCSTR, ctypes.c_void_p, |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
187 ctypes.c_void_p] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
188 _kernel32.CreateProcessA.restype = _BOOL |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
189 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
190 _kernel32.ExitProcess.argtypes = [_UINT] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
191 _kernel32.ExitProcess.restype = None |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
192 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
193 _kernel32.GetCurrentProcessId.argtypes = [] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
194 _kernel32.GetCurrentProcessId.restype = _DWORD |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
195 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
196 _SIGNAL_HANDLER = ctypes.WINFUNCTYPE(_BOOL, _DWORD) |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
197 _kernel32.SetConsoleCtrlHandler.argtypes = [_SIGNAL_HANDLER, _BOOL] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
198 _kernel32.SetConsoleCtrlHandler.restype = _BOOL |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
199 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
200 _kernel32.GetStdHandle.argtypes = [_DWORD] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
201 _kernel32.GetStdHandle.restype = _HANDLE |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
202 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
203 _kernel32.GetConsoleScreenBufferInfo.argtypes = [_HANDLE, ctypes.c_void_p] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
204 _kernel32.GetConsoleScreenBufferInfo.restype = _BOOL |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
205 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
206 _advapi32.GetUserNameA.argtypes = [ctypes.c_void_p, ctypes.c_void_p] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
207 _advapi32.GetUserNameA.restype = _BOOL |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
208 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
209 _user32.GetWindowThreadProcessId.argtypes = [_HANDLE, ctypes.c_void_p] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
210 _user32.GetWindowThreadProcessId.restype = _DWORD |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
211 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
212 _user32.ShowWindow.argtypes = [_HANDLE, ctypes.c_int] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
213 _user32.ShowWindow.restype = _BOOL |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
214 |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
215 _WNDENUMPROC = ctypes.WINFUNCTYPE(_BOOL, _HWND, _LPARAM) |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
216 _user32.EnumWindows.argtypes = [_WNDENUMPROC, _LPARAM] |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
217 _user32.EnumWindows.restype = _BOOL |
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
218 |
20425
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
219 _kernel32.CreateToolhelp32Snapshot.argtypes = [_DWORD, _DWORD] |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
220 _kernel32.CreateToolhelp32Snapshot.restype = _BOOL |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
221 |
24652
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
222 _kernel32.PeekNamedPipe.argtypes = [_HANDLE, ctypes.c_void_p, _DWORD, |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
223 ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p] |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
224 _kernel32.PeekNamedPipe.restype = _BOOL |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
225 |
20425
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
226 _kernel32.Process32First.argtypes = [_HANDLE, ctypes.c_void_p] |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
227 _kernel32.Process32First.restype = _BOOL |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
228 |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
229 _kernel32.Process32Next.argtypes = [_HANDLE, ctypes.c_void_p] |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
230 _kernel32.Process32Next.restype = _BOOL |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
231 |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
232 def _raiseoserror(name): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
233 err = ctypes.WinError() |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
234 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
|
235 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
236 def _getfileinfo(name): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
237 fh = _kernel32.CreateFileA(name, 0, |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
238 _FILE_SHARE_READ | _FILE_SHARE_WRITE | _FILE_SHARE_DELETE, |
17006
6fc7fd72ba3e
win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents:
16807
diff
changeset
|
239 None, _OPEN_EXISTING, _FILE_FLAG_BACKUP_SEMANTICS, None) |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
240 if fh == _INVALID_HANDLE_VALUE: |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
241 _raiseoserror(name) |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
242 try: |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
243 fi = _BY_HANDLE_FILE_INFORMATION() |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
244 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
|
245 _raiseoserror(name) |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
246 return fi |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
247 finally: |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
248 _kernel32.CloseHandle(fh) |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
249 |
14235
b9e1b041744f
rename util.os_link to oslink
Adrian Buehlmann <adrian@cadifra.com>
parents:
14230
diff
changeset
|
250 def oslink(src, dst): |
13976
9ca1ff3d4f8c
win32: Wine doesn't know about hardlinks
Matt Mackall <mpm@selenic.com>
parents:
13795
diff
changeset
|
251 try: |
9ca1ff3d4f8c
win32: Wine doesn't know about hardlinks
Matt Mackall <mpm@selenic.com>
parents:
13795
diff
changeset
|
252 if not _kernel32.CreateHardLinkA(dst, src, None): |
9ca1ff3d4f8c
win32: Wine doesn't know about hardlinks
Matt Mackall <mpm@selenic.com>
parents:
13795
diff
changeset
|
253 _raiseoserror(src) |
9ca1ff3d4f8c
win32: Wine doesn't know about hardlinks
Matt Mackall <mpm@selenic.com>
parents:
13795
diff
changeset
|
254 except AttributeError: # Wine doesn't support this function |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
255 _raiseoserror(src) |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
256 |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
257 def nlinks(name): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
258 '''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
|
259 return _getfileinfo(name).nNumberOfLinks |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
260 |
17006
6fc7fd72ba3e
win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents:
16807
diff
changeset
|
261 def samefile(path1, path2): |
6fc7fd72ba3e
win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents:
16807
diff
changeset
|
262 '''Returns whether path1 and path2 refer to the same file or directory.''' |
6fc7fd72ba3e
win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents:
16807
diff
changeset
|
263 res1 = _getfileinfo(path1) |
6fc7fd72ba3e
win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents:
16807
diff
changeset
|
264 res2 = _getfileinfo(path2) |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
265 return (res1.dwVolumeSerialNumber == res2.dwVolumeSerialNumber |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
266 and res1.nFileIndexHigh == res2.nFileIndexHigh |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
267 and res1.nFileIndexLow == res2.nFileIndexLow) |
10218
750b7a4f01f6
Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents:
9198
diff
changeset
|
268 |
17006
6fc7fd72ba3e
win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents:
16807
diff
changeset
|
269 def samedevice(path1, path2): |
6fc7fd72ba3e
win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents:
16807
diff
changeset
|
270 '''Returns whether path1 and path2 are on the same device.''' |
6fc7fd72ba3e
win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents:
16807
diff
changeset
|
271 res1 = _getfileinfo(path1) |
6fc7fd72ba3e
win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents:
16807
diff
changeset
|
272 res2 = _getfileinfo(path2) |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
273 return res1.dwVolumeSerialNumber == res2.dwVolumeSerialNumber |
10218
750b7a4f01f6
Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents:
9198
diff
changeset
|
274 |
24652
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
275 def peekpipe(pipe): |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
276 handle = msvcrt.get_osfhandle(pipe.fileno()) |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
277 avail = _DWORD() |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
278 |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
279 if not _kernel32.PeekNamedPipe(handle, None, 0, None, ctypes.byref(avail), |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
280 None): |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
281 err = _kernel32.GetLastError() |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
282 if err == _ERROR_BROKEN_PIPE: |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
283 return 0 |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
284 raise ctypes.WinError(err) |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
285 |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
286 return avail.value |
232bf0028596
win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents:
24494
diff
changeset
|
287 |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
288 def testpid(pid): |
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
289 '''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
|
290 determine, False otherwise''' |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
291 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
|
292 if h: |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
293 try: |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
294 status = _DWORD() |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
295 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
|
296 return status.value == _STILL_ACTIVE |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
297 finally: |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
298 _kernel32.CloseHandle(h) |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
299 return _kernel32.GetLastError() != _ERROR_INVALID_PARAMETER |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
300 |
14236
e949a008999d
rename util.executable_path to executablepath
Adrian Buehlmann <adrian@cadifra.com>
parents:
14235
diff
changeset
|
301 def executablepath(): |
13376
60b5c6c3fd12
win32: new function executable_path
Adrian Buehlmann <adrian@cadifra.com>
parents:
13375
diff
changeset
|
302 '''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
|
303 size = 600 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
304 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
|
305 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
|
306 if len == 0: |
24494
f2b87f4856bf
win32: add comment about WinError
Adrian Buehlmann <adrian@cadifra.com>
parents:
24418
diff
changeset
|
307 raise ctypes.WinError() # Note: WinError is a function |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
308 elif len == size: |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
309 raise ctypes.WinError(_ERROR_INSUFFICIENT_BUFFER) |
13376
60b5c6c3fd12
win32: new function executable_path
Adrian Buehlmann <adrian@cadifra.com>
parents:
13375
diff
changeset
|
310 return buf.value |
60b5c6c3fd12
win32: new function executable_path
Adrian Buehlmann <adrian@cadifra.com>
parents:
13375
diff
changeset
|
311 |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7778
diff
changeset
|
312 def getuser(): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7778
diff
changeset
|
313 '''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
|
314 size = _DWORD(300) |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
315 buf = ctypes.create_string_buffer(size.value + 1) |
14345
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
316 if not _advapi32.GetUserNameA(ctypes.byref(buf), ctypes.byref(size)): |
24418
a2285e2fc949
win32: 'raise ctypes.WinError' -> 'raise ctypes.WinError()'
Matt Harbison <matt_harbison@yahoo.com>
parents:
21226
diff
changeset
|
317 raise ctypes.WinError() |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
318 return buf.value |
4672
272c0a09b203
Handle CTRL+C in serve under Windows.
Marcos Chaves <marcos.nospam@gmail.com>
parents:
4407
diff
changeset
|
319 |
14237
4d684d8210a1
rename util.set_signal_handler to setsignalhandler
Adrian Buehlmann <adrian@cadifra.com>
parents:
14236
diff
changeset
|
320 _signalhandler = [] |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
321 |
14237
4d684d8210a1
rename util.set_signal_handler to setsignalhandler
Adrian Buehlmann <adrian@cadifra.com>
parents:
14236
diff
changeset
|
322 def setsignalhandler(): |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
323 '''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
|
324 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
|
325 operations. |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
326 ''' |
4672
272c0a09b203
Handle CTRL+C in serve under Windows.
Marcos Chaves <marcos.nospam@gmail.com>
parents:
4407
diff
changeset
|
327 def handler(event): |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
328 _kernel32.ExitProcess(1) |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
329 |
14237
4d684d8210a1
rename util.set_signal_handler to setsignalhandler
Adrian Buehlmann <adrian@cadifra.com>
parents:
14236
diff
changeset
|
330 if _signalhandler: |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
331 return # already registered |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
332 h = _SIGNAL_HANDLER(handler) |
14237
4d684d8210a1
rename util.set_signal_handler to setsignalhandler
Adrian Buehlmann <adrian@cadifra.com>
parents:
14236
diff
changeset
|
333 _signalhandler.append(h) # needed to prevent garbage collection |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
334 if not _kernel32.SetConsoleCtrlHandler(h, True): |
24418
a2285e2fc949
win32: 'raise ctypes.WinError' -> 'raise ctypes.WinError()'
Matt Harbison <matt_harbison@yahoo.com>
parents:
21226
diff
changeset
|
335 raise ctypes.WinError() |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
336 |
10240
3af4b39afe2a
cmdutil: hide child window created by win32 spawndetached()
Patrick Mezard <pmezard@gmail.com>
parents:
10219
diff
changeset
|
337 def hidewindow(): |
3af4b39afe2a
cmdutil: hide child window created by win32 spawndetached()
Patrick Mezard <pmezard@gmail.com>
parents:
10219
diff
changeset
|
338 |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
339 def callback(hwnd, pid): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
340 wpid = _DWORD() |
14345
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
341 _user32.GetWindowThreadProcessId(hwnd, ctypes.byref(wpid)) |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
342 if pid == wpid.value: |
14345
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
343 _user32.ShowWindow(hwnd, _SW_HIDE) |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
344 return False # stop enumerating windows |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
345 return True |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
346 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
347 pid = _kernel32.GetCurrentProcessId() |
14345
bf9a105aed0a
win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents:
14344
diff
changeset
|
348 _user32.EnumWindows(_WNDENUMPROC(callback), pid) |
11012
81631f0cf13b
win32: detect console width on Windows
Patrick Mezard <pmezard@gmail.com>
parents:
10388
diff
changeset
|
349 |
12689
c52c629ce19e
termwidth: move to ui.ui from util
Augie Fackler <durin42@gmail.com>
parents:
12401
diff
changeset
|
350 def termwidth(): |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
351 # 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
|
352 # 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
|
353 # 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
|
354 # 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
|
355 width = 79 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
356 # 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
|
357 screenbuf = _kernel32.GetStdHandle( |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
358 _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
|
359 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
|
360 return width |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
361 csbi = _CONSOLE_SCREEN_BUFFER_INFO() |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
362 if not _kernel32.GetConsoleScreenBufferInfo( |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
363 screenbuf, ctypes.byref(csbi)): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
364 return width |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
365 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
|
366 return width |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
367 |
20425
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
368 def _1stchild(pid): |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
369 '''return the 1st found child of the given pid |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
370 |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
371 None is returned when no child is found''' |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
372 pe = _tagPROCESSENTRY32() |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
373 |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
374 # create handle to list all processes |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
375 ph = _kernel32.CreateToolhelp32Snapshot(_TH32CS_SNAPPROCESS, 0) |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
376 if ph == _INVALID_HANDLE_VALUE: |
24418
a2285e2fc949
win32: 'raise ctypes.WinError' -> 'raise ctypes.WinError()'
Matt Harbison <matt_harbison@yahoo.com>
parents:
21226
diff
changeset
|
377 raise ctypes.WinError() |
20425
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
378 try: |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
379 r = _kernel32.Process32First(ph, ctypes.byref(pe)) |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
380 # loop over all processes |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
381 while r: |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
382 if pe.th32ParentProcessID == pid: |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
383 # return first child found |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
384 return pe.th32ProcessID |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
385 r = _kernel32.Process32Next(ph, ctypes.byref(pe)) |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
386 finally: |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
387 _kernel32.CloseHandle(ph) |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
388 if _kernel32.GetLastError() != _ERROR_NO_MORE_FILES: |
24418
a2285e2fc949
win32: 'raise ctypes.WinError' -> 'raise ctypes.WinError()'
Matt Harbison <matt_harbison@yahoo.com>
parents:
21226
diff
changeset
|
389 raise ctypes.WinError() |
20425
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
390 return None # no child found |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
391 |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
392 class _tochildpid(int): # pid is _DWORD, which always matches in an int |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
393 '''helper for spawndetached, returns the child pid on conversion to string |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
394 |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
395 Does not resolve the child pid immediately because the child may not yet be |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
396 started. |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
397 ''' |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
398 def childpid(self): |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
399 '''returns the child pid of the first found child of the process |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
400 with this pid''' |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
401 return _1stchild(self) |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
402 def __str__(self): |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
403 # run when the pid is written to the file |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
404 ppid = self.childpid() |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
405 if ppid is None: |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
406 # race, child has exited since check |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
407 # fall back to this pid. Its process will also have disappeared, |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
408 # raising the same error type later as when the child pid would |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
409 # be returned. |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
410 return " %d" % self |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
411 return str(ppid) |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
412 |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
413 def spawndetached(args): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
414 # 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
|
415 # 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
|
416 # 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
|
417 # 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
|
418 # 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
|
419 si = _STARTUPINFO() |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
420 si.cb = ctypes.sizeof(_STARTUPINFO) |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
421 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
422 pi = _PROCESS_INFORMATION() |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
423 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
424 env = '' |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
425 for k in os.environ: |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
426 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
|
427 if not env: |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
428 env = '\0' |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
429 env += '\0' |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
430 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
431 args = subprocess.list2cmdline(args) |
17428
72803c8edaa4
avoid using abbreviations that look like spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17051
diff
changeset
|
432 # Not running the command in shell mode makes Python 2.6 hang when |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
433 # writing to hgweb output socket. |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
434 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
|
435 args = comspec + " /c " + args |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
436 |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
437 res = _kernel32.CreateProcessA( |
17050
e780fb37168b
win32: specify _CREATE_NO_WINDOW on spawndetached()
Adrian Buehlmann <adrian@cadifra.com>
parents:
17006
diff
changeset
|
438 None, args, None, None, False, _CREATE_NO_WINDOW, |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
439 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
|
440 if not res: |
24418
a2285e2fc949
win32: 'raise ctypes.WinError' -> 'raise ctypes.WinError()'
Matt Harbison <matt_harbison@yahoo.com>
parents:
21226
diff
changeset
|
441 raise ctypes.WinError() |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13374
diff
changeset
|
442 |
20425
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
443 # _tochildpid because the process is the child of COMSPEC |
ca6aa8362f33
win32: spawndetached returns pid of detached process and not of cmd.exe
Simon Heimberg <simohe@besonet.ch>
parents:
19159
diff
changeset
|
444 return _tochildpid(pi.dwProcessId) |
13775
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
445 |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
446 def unlink(f): |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
447 '''try to implement POSIX' unlink semantics on Windows''' |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
448 |
21226
4898c37e03c0
win32: backout 1a9ebc83a74c
Steve Borho <steve@borho.org>
parents:
21193
diff
changeset
|
449 if os.path.isdir(f): |
4898c37e03c0
win32: backout 1a9ebc83a74c
Steve Borho <steve@borho.org>
parents:
21193
diff
changeset
|
450 # use EPERM because it is POSIX prescribed value, even though |
4898c37e03c0
win32: backout 1a9ebc83a74c
Steve Borho <steve@borho.org>
parents:
21193
diff
changeset
|
451 # unlink(2) on directories returns EISDIR on Linux |
4898c37e03c0
win32: backout 1a9ebc83a74c
Steve Borho <steve@borho.org>
parents:
21193
diff
changeset
|
452 raise IOError(errno.EPERM, |
4898c37e03c0
win32: backout 1a9ebc83a74c
Steve Borho <steve@borho.org>
parents:
21193
diff
changeset
|
453 "Unlinking directory not permitted: '%s'" % f) |
19159
1b329f8c7b24
windows: check target type before actual unlinking to follow POSIX semantics
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18959
diff
changeset
|
454 |
13775
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
455 # 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
|
456 # problems with doing that: |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
457 # - 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
|
458 # 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
|
459 # 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
|
460 # 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
|
461 # - 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
|
462 # 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
|
463 # 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
|
464 # 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
|
465 # 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
|
466 # cannot be removed or moved. |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
467 # 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
|
468 # 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
|
469 # 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
|
470 # implicit zombie filename blocking on a temporary name. |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
471 |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
472 for tries in xrange(10): |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
473 temp = '%s-%08x' % (f, random.randint(0, 0xffffffff)) |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
474 try: |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
475 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
|
476 break |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24652
diff
changeset
|
477 except OSError as e: |
13775
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
478 if e.errno != errno.EEXIST: |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
479 raise |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
480 else: |
18175
fd3f8b87b682
win32: clean up use of two-argument raise
Augie Fackler <raf@durin42.com>
parents:
17428
diff
changeset
|
481 raise IOError(errno.EEXIST, "No usable temporary filename found") |
13775
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
482 |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
483 try: |
930efdc6bfa4
windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
13379
diff
changeset
|
484 os.unlink(temp) |
13776
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
485 except OSError: |
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
486 # The unlink might have failed because the READONLY attribute may heave |
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
487 # 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
|
488 # 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
|
489 _kernel32.SetFileAttributesA(temp, _FILE_ATTRIBUTE_NORMAL) |
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
490 try: |
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
491 os.unlink(temp) |
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
492 except OSError: |
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
493 # 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
|
494 # 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
|
495 # leaving some potentially serious inconsistencies. |
a2f0fdb1e488
win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents:
13775
diff
changeset
|
496 pass |
13795
43b5fe18ea6c
set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13776
diff
changeset
|
497 |
43b5fe18ea6c
set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13776
diff
changeset
|
498 def makedir(path, notindexed): |
43b5fe18ea6c
set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13776
diff
changeset
|
499 os.mkdir(path) |
43b5fe18ea6c
set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13776
diff
changeset
|
500 if notindexed: |
43b5fe18ea6c
set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13776
diff
changeset
|
501 _kernel32.SetFileAttributesA(path, _FILE_ATTRIBUTE_NOT_CONTENT_INDEXED) |