3 # Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others |
3 # Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others |
4 # |
4 # |
5 # This software may be used and distributed according to the terms of the |
5 # This software may be used and distributed according to the terms of the |
6 # GNU General Public License version 2 or any later version. |
6 # GNU General Public License version 2 or any later version. |
7 |
7 |
8 import encoding |
8 import ctypes, errno, os, subprocess, random |
9 import ctypes, errno, os, subprocess, random, _winreg |
|
10 |
9 |
11 _kernel32 = ctypes.windll.kernel32 |
10 _kernel32 = ctypes.windll.kernel32 |
12 _advapi32 = ctypes.windll.advapi32 |
11 _advapi32 = ctypes.windll.advapi32 |
13 _user32 = ctypes.windll.user32 |
12 _user32 = ctypes.windll.user32 |
14 |
13 |
242 return status.value == _STILL_ACTIVE |
241 return status.value == _STILL_ACTIVE |
243 finally: |
242 finally: |
244 _kernel32.CloseHandle(h) |
243 _kernel32.CloseHandle(h) |
245 return _kernel32.GetLastError() != _ERROR_INVALID_PARAMETER |
244 return _kernel32.GetLastError() != _ERROR_INVALID_PARAMETER |
246 |
245 |
247 def lookupreg(key, valname=None, scope=None): |
|
248 ''' Look up a key/value name in the Windows registry. |
|
249 |
|
250 valname: value name. If unspecified, the default value for the key |
|
251 is used. |
|
252 scope: optionally specify scope for registry lookup, this can be |
|
253 a sequence of scopes to look up in order. Default (CURRENT_USER, |
|
254 LOCAL_MACHINE). |
|
255 ''' |
|
256 if scope is None: |
|
257 scope = (_winreg.HKEY_CURRENT_USER, _winreg.HKEY_LOCAL_MACHINE) |
|
258 elif not isinstance(scope, (list, tuple)): |
|
259 scope = (scope,) |
|
260 for s in scope: |
|
261 try: |
|
262 val = _winreg.QueryValueEx(_winreg.OpenKey(s, key), valname)[0] |
|
263 # never let a Unicode string escape into the wild |
|
264 return encoding.tolocal(val.encode('UTF-8')) |
|
265 except EnvironmentError: |
|
266 pass |
|
267 |
|
268 def executablepath(): |
246 def executablepath(): |
269 '''return full path of hg.exe''' |
247 '''return full path of hg.exe''' |
270 size = 600 |
248 size = 600 |
271 buf = ctypes.create_string_buffer(size + 1) |
249 buf = ctypes.create_string_buffer(size + 1) |
272 len = _kernel32.GetModuleFileNameA(None, ctypes.byref(buf), size) |
250 len = _kernel32.GetModuleFileNameA(None, ctypes.byref(buf), size) |