/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
4988.10.3 by John Arbash Meinel
Merge bzr.dev 5007, resolve conflict, update NEWS
1
# Copyright (C) 2005-2010 Canonical Ltd
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
2
#
2052.3.1 by John Arbash Meinel
Add tests to cleanup the copyright of all source files
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2052.3.1 by John Arbash Meinel
Add tests to cleanup the copyright of all source files
16
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
17
"""Win32-specific helper functions
18
19
Only one dependency: ctypes should be installed.
20
"""
21
6379.6.7 by Jelmer Vernooij
Move importing from future until after doc string, otherwise the doc string will disappear.
22
from __future__ import absolute_import
23
4786.1.1 by John Arbash Meinel
Work on doing globbing, etc for all commands on Windows.
24
import glob
6362.2.3 by Martin Packman
Always return username and hostname as unicode in win32utils
25
import operator
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
26
import os
1185.16.86 by mbp at sourcefrog
- win32 get_console_size from Alexander
27
import struct
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
28
import sys
29
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
30
from breezy import (
6362.2.2 by Martin Packman
Use get_environ_unicode throughout win32utils and always return unicode paths
31
    cmdline,
32
    )
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
33
from breezy.i18n import gettext
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
34
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
35
# We can cope without it; use a separate variable to help pyflakes
1185.16.86 by mbp at sourcefrog
- win32 get_console_size from Alexander
36
try:
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
37
    import ctypes
38
    has_ctypes = True
1185.16.86 by mbp at sourcefrog
- win32 get_console_size from Alexander
39
except ImportError:
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
40
    has_ctypes = False
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
41
else:
6658.6.1 by Martin
Remove winver, win98 support code, and deprecated code
42
    create_buffer = ctypes.create_unicode_buffer
43
    extract_buffer = operator.attrgetter("value")
44
    suffix = 'W'
3023.1.2 by Alexander Belchenko
Martin's review.
45
try:
4505.2.1 by Alexander Belchenko
Set hidden attribute on .bzr directory below unicode path should never fail with error. The operation should succeed even if bzr unable to set the attribute. (related to bug #335362).
46
    import pywintypes
6336.2.2 by Martin Packman
Tweak how pywin32 is imported in win32utils to fix test failure edge case
47
    has_pywintypes = True
48
except ImportError:
6336.2.3 by Martin Packman
Set all has_win32* to False if pywintypes can't be imported
49
    has_pywintypes = has_win32file = has_win32api = False
6336.2.2 by Martin Packman
Tweak how pywin32 is imported in win32utils to fix test failure edge case
50
else:
51
    try:
52
        import win32file
53
        has_win32file = True
54
    except ImportError:
55
        has_win32file = False
56
    try:
57
        import win32api
58
        has_win32api = True
59
    except ImportError:
60
        has_win32api = False
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
61
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
62
# pulling in win32com.shell is a bit of overhead, and normally we don't need
63
# it as ctypes is preferred and common.  lazy_imports and "optional"
64
# modules don't work well, so we do our own lazy thing...
7143.15.2 by Jelmer Vernooij
Run autopep8.
65
has_win32com_shell = None  # Set to True or False once we know for sure...
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
66
67
# Special Win32 API constants
68
# Handles of std streams
1704.2.3 by Martin Pool
(win32) Detect terminal width using GetConsoleScreenBufferInfo (Alexander)
69
WIN32_STDIN_HANDLE = -10
70
WIN32_STDOUT_HANDLE = -11
71
WIN32_STDERR_HANDLE = -12
72
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
73
# CSIDL constants (from MSDN 2003)
74
CSIDL_APPDATA = 0x001A      # Application Data folder
7143.15.2 by Jelmer Vernooij
Run autopep8.
75
# <user name>\Local Settings\Application Data (non roaming)
76
CSIDL_LOCAL_APPDATA = 0x001c
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
77
CSIDL_PERSONAL = 0x0005     # My Documents folder
78
79
# from winapi C headers
80
MAX_PATH = 260
81
UNLEN = 256
82
MAX_COMPUTERNAME_LENGTH = 31
83
4476.2.1 by Alexander Belchenko
win32utils.py: get_app_path() can read path for wordpad.exe (data type_id is REG_EXPAND_SZ).
84
# Registry data type ids
85
REG_SZ = 1
86
REG_EXPAND_SZ = 2
87
1704.2.3 by Martin Pool
(win32) Detect terminal width using GetConsoleScreenBufferInfo (Alexander)
88
4011.1.1 by John Arbash Meinel
Implement -Dmemory for win32
89
def debug_memory_win32api(message='', short=True):
90
    """Use trace.note() to dump the running memory info."""
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
91
    from breezy import trace
4011.1.2 by John Arbash Meinel
Fix some small bugs, and prefer the ctypes form.
92
    if has_ctypes:
4011.1.1 by John Arbash Meinel
Implement -Dmemory for win32
93
        class PROCESS_MEMORY_COUNTERS_EX(ctypes.Structure):
94
            """Used by GetProcessMemoryInfo"""
95
            _fields_ = [('cb', ctypes.c_ulong),
96
                        ('PageFaultCount', ctypes.c_ulong),
97
                        ('PeakWorkingSetSize', ctypes.c_size_t),
98
                        ('WorkingSetSize', ctypes.c_size_t),
99
                        ('QuotaPeakPagedPoolUsage', ctypes.c_size_t),
100
                        ('QuotaPagedPoolUsage', ctypes.c_size_t),
101
                        ('QuotaPeakNonPagedPoolUsage', ctypes.c_size_t),
102
                        ('QuotaNonPagedPoolUsage', ctypes.c_size_t),
103
                        ('PagefileUsage', ctypes.c_size_t),
104
                        ('PeakPagefileUsage', ctypes.c_size_t),
105
                        ('PrivateUsage', ctypes.c_size_t),
7143.15.2 by Jelmer Vernooij
Run autopep8.
106
                        ]
4011.1.1 by John Arbash Meinel
Implement -Dmemory for win32
107
        cur_process = ctypes.windll.kernel32.GetCurrentProcess()
108
        mem_struct = PROCESS_MEMORY_COUNTERS_EX()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
109
        ret = ctypes.windll.psapi.GetProcessMemoryInfo(
110
            cur_process, ctypes.byref(mem_struct), ctypes.sizeof(mem_struct))
4011.1.1 by John Arbash Meinel
Implement -Dmemory for win32
111
        if not ret:
6138.3.4 by Jonathan Riddell
add gettext() to uses of trace.note()
112
            trace.note(gettext('Failed to GetProcessMemoryInfo()'))
4011.1.1 by John Arbash Meinel
Implement -Dmemory for win32
113
            return
114
        info = {'PageFaultCount': mem_struct.PageFaultCount,
115
                'PeakWorkingSetSize': mem_struct.PeakWorkingSetSize,
116
                'WorkingSetSize': mem_struct.WorkingSetSize,
117
                'QuotaPeakPagedPoolUsage': mem_struct.QuotaPeakPagedPoolUsage,
118
                'QuotaPagedPoolUsage': mem_struct.QuotaPagedPoolUsage,
4989.1.6 by Vincent Ladeuil
Add comments and update HACKING.txt about which units should be used.
119
                'QuotaPeakNonPagedPoolUsage':
120
                    mem_struct.QuotaPeakNonPagedPoolUsage,
4011.1.1 by John Arbash Meinel
Implement -Dmemory for win32
121
                'QuotaNonPagedPoolUsage': mem_struct.QuotaNonPagedPoolUsage,
122
                'PagefileUsage': mem_struct.PagefileUsage,
123
                'PeakPagefileUsage': mem_struct.PeakPagefileUsage,
124
                'PrivateUsage': mem_struct.PrivateUsage,
7143.15.2 by Jelmer Vernooij
Run autopep8.
125
                }
4011.1.2 by John Arbash Meinel
Fix some small bugs, and prefer the ctypes form.
126
    elif has_win32api:
127
        import win32process
128
        # win32process does not return PrivateUsage, because it doesn't use
129
        # PROCESS_MEMORY_COUNTERS_EX (it uses the one without _EX).
130
        proc = win32process.GetCurrentProcess()
131
        info = win32process.GetProcessMemoryInfo(proc)
4011.1.1 by John Arbash Meinel
Implement -Dmemory for win32
132
    else:
6138.3.4 by Jonathan Riddell
add gettext() to uses of trace.note()
133
        trace.note(gettext('Cannot debug memory on win32 without ctypes'
7143.15.2 by Jelmer Vernooij
Run autopep8.
134
                           ' or win32process'))
4011.1.1 by John Arbash Meinel
Implement -Dmemory for win32
135
        return
4163.1.1 by John Arbash Meinel
Some small fixes for the win32 'trace.debug_mem()' code.
136
    if short:
4989.1.6 by Vincent Ladeuil
Add comments and update HACKING.txt about which units should be used.
137
        # using base-2 units (see HACKING.txt).
6147.1.1 by Jonathan Riddell
use .format() instead of % for string formatting where there are multiple formats in one string to allow for translations
138
        trace.note(gettext('WorkingSize {0:>7}KiB'
7143.15.2 by Jelmer Vernooij
Run autopep8.
139
                           '\tPeakWorking {1:>7}KiB\t{2}').format(
4163.1.1 by John Arbash Meinel
Some small fixes for the win32 'trace.debug_mem()' code.
140
                   info['WorkingSetSize'] / 1024,
141
                   info['PeakWorkingSetSize'] / 1024,
6147.1.1 by Jonathan Riddell
use .format() instead of % for string formatting where there are multiple formats in one string to allow for translations
142
                   message))
4163.1.1 by John Arbash Meinel
Some small fixes for the win32 'trace.debug_mem()' code.
143
        return
144
    if message:
145
        trace.note('%s', message)
7143.15.2 by Jelmer Vernooij
Run autopep8.
146
    trace.note(gettext('WorkingSize       %8d KiB'),
147
               info['WorkingSetSize'] / 1024)
148
    trace.note(gettext('PeakWorking       %8d KiB'),
149
               info['PeakWorkingSetSize'] / 1024)
150
    trace.note(gettext('PagefileUsage     %8d KiB'),
151
               info.get('PagefileUsage', 0) / 1024)
6138.3.4 by Jonathan Riddell
add gettext() to uses of trace.note()
152
    trace.note(gettext('PeakPagefileUsage %8d KiB'),
4989.1.6 by Vincent Ladeuil
Add comments and update HACKING.txt about which units should be used.
153
               info.get('PeakPagefileUsage', 0) / 1024)
7143.15.2 by Jelmer Vernooij
Run autopep8.
154
    trace.note(gettext('PrivateUsage      %8d KiB'),
155
               info.get('PrivateUsage', 0) / 1024)
6138.3.4 by Jonathan Riddell
add gettext() to uses of trace.note()
156
    trace.note(gettext('PageFaultCount    %8d'), info.get('PageFaultCount', 0))
4011.1.1 by John Arbash Meinel
Implement -Dmemory for win32
157
158
1185.16.86 by mbp at sourcefrog
- win32 get_console_size from Alexander
159
def get_console_size(defaultx=80, defaulty=25):
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
160
    """Return size of current console.
161
162
    This function try to determine actual size of current working
163
    console window and return tuple (sizex, sizey) if success,
164
    or default size (defaultx, defaulty) otherwise.
165
    """
166
    if not has_ctypes:
167
        # no ctypes is found
168
        return (defaultx, defaulty)
169
170
    # To avoid problem with redirecting output via pipe
4747.3.6 by Vincent Ladeuil
terminal_width can now returns None.
171
    # we need to use stderr instead of stdout
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
172
    h = ctypes.windll.kernel32.GetStdHandle(WIN32_STDERR_HANDLE)
173
    csbi = ctypes.create_string_buffer(22)
174
    res = ctypes.windll.kernel32.GetConsoleScreenBufferInfo(h, csbi)
175
176
    if res:
177
        (bufx, bufy, curx, cury, wattr,
7143.15.2 by Jelmer Vernooij
Run autopep8.
178
         left, top, right, bottom, maxx, maxy) = struct.unpack(
4989.1.6 by Vincent Ladeuil
Add comments and update HACKING.txt about which units should be used.
179
            "hhhhHhhhhhh", csbi.raw)
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
180
        sizex = right - left + 1
181
        sizey = bottom - top + 1
182
        return (sizex, sizey)
183
    else:
184
        return (defaultx, defaulty)
185
186
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
187
def _get_sh_special_folder_path(csidl):
188
    """Call SHGetSpecialFolderPathW if available, or return None.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
189
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
190
    Result is always unicode (or None).
191
    """
192
    if has_ctypes:
193
        try:
194
            SHGetSpecialFolderPath = \
195
                ctypes.windll.shell32.SHGetSpecialFolderPathW
196
        except AttributeError:
197
            pass
198
        else:
199
            buf = ctypes.create_unicode_buffer(MAX_PATH)
6809.1.1 by Martin
Apply 2to3 ws_comma fixer
200
            if SHGetSpecialFolderPath(None, buf, csidl, 0):
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
201
                return buf.value
202
203
    global has_win32com_shell
204
    if has_win32com_shell is None:
205
        try:
206
            from win32com.shell import shell
207
            has_win32com_shell = True
208
        except ImportError:
209
            has_win32com_shell = False
210
    if has_win32com_shell:
211
        # still need to bind the name locally, but this is fast.
212
        from win32com.shell import shell
213
        try:
214
            return shell.SHGetSpecialFolderPath(0, csidl, 0)
215
        except shell.error:
216
            # possibly E_NOTIMPL meaning we can't load the function pointer,
217
            # or E_FAIL meaning the function failed - regardless, just ignore it
218
            pass
219
    return None
220
221
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
222
def get_appdata_location():
223
    """Return Application Data location.
224
    Return None if we cannot obtain location.
225
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
226
    Windows defines two 'Application Data' folders per user - a 'roaming'
227
    one that moves with the user as they logon to different machines, and
228
    a 'local' one that stays local to the machine.  This returns the 'roaming'
229
    directory, and thus is suitable for storing user-preferences, etc.
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
230
    """
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
231
    appdata = _get_sh_special_folder_path(CSIDL_APPDATA)
232
    if appdata:
233
        return appdata
6362.2.2 by Martin Packman
Use get_environ_unicode throughout win32utils and always return unicode paths
234
    # Use APPDATA if defined, will return None if not
235
    return get_environ_unicode('APPDATA')
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
236
237
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
238
def get_local_appdata_location():
239
    """Return Local Application Data location.
240
    Return the same as get_appdata_location() if we cannot obtain location.
241
242
    Windows defines two 'Application Data' folders per user - a 'roaming'
243
    one that moves with the user as they logon to different machines, and
244
    a 'local' one that stays local to the machine.  This returns the 'local'
245
    directory, and thus is suitable for caches, temp files and other things
246
    which don't need to move with the user.
247
    """
248
    local = _get_sh_special_folder_path(CSIDL_LOCAL_APPDATA)
249
    if local:
250
        return local
251
    # Vista supplies LOCALAPPDATA, but XP and earlier do not.
6362.2.2 by Martin Packman
Use get_environ_unicode throughout win32utils and always return unicode paths
252
    local = get_environ_unicode('LOCALAPPDATA')
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
253
    if local:
254
        return local
255
    return get_appdata_location()
256
257
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
258
def get_home_location():
259
    """Return user's home location.
260
    Assume on win32 it's the <My Documents> folder.
261
    If location cannot be obtained return system drive root,
262
    i.e. C:\
263
    """
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
264
    home = _get_sh_special_folder_path(CSIDL_PERSONAL)
265
    if home:
266
        return home
6362.2.2 by Martin Packman
Use get_environ_unicode throughout win32utils and always return unicode paths
267
    home = get_environ_unicode('HOME')
268
    if home is not None:
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
269
        return home
6362.2.2 by Martin Packman
Use get_environ_unicode throughout win32utils and always return unicode paths
270
    homepath = get_environ_unicode('HOMEPATH')
271
    if homepath is not None:
272
        return os.path.join(get_environ_unicode('HOMEDIR', ''), home)
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
273
    # at least return windows root directory
6362.2.2 by Martin Packman
Use get_environ_unicode throughout win32utils and always return unicode paths
274
    windir = get_environ_unicode('WINDIR')
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
275
    if windir:
2610.1.1 by Martin Pool
Fix get_home_location on Win98 (gzlist,r=john,r=alexander)
276
        return os.path.splitdrive(windir)[0] + '/'
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
277
    # otherwise C:\ is good enough for 98% users
6973.6.4 by Jelmer Vernooij
Avoid text_type()
278
    return u'C:/'
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
279
280
281
def get_user_name():
282
    """Return user name as login name.
283
    If name cannot be obtained return None.
284
    """
285
    if has_ctypes:
286
        try:
287
            advapi32 = ctypes.windll.advapi32
7143.15.2 by Jelmer Vernooij
Run autopep8.
288
            GetUserName = getattr(advapi32, 'GetUserName' + suffix)
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
289
        except AttributeError:
290
            pass
291
        else:
7143.15.2 by Jelmer Vernooij
Run autopep8.
292
            buf = create_buffer(UNLEN + 1)
293
            n = ctypes.c_int(UNLEN + 1)
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
294
            if GetUserName(buf, ctypes.byref(n)):
6362.2.3 by Martin Packman
Always return username and hostname as unicode in win32utils
295
                return extract_buffer(buf)
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
296
    # otherwise try env variables
6362.2.2 by Martin Packman
Use get_environ_unicode throughout win32utils and always return unicode paths
297
    return get_environ_unicode('USERNAME')
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
298
299
3626.1.3 by John Arbash Meinel
Use GetComputerNameEx from ctypes when available.
300
# 1 == ComputerNameDnsHostname, which returns "The DNS host name of the local
301
# computer or the cluster associated with the local computer."
302
_WIN32_ComputerNameDnsHostname = 1
303
7143.15.2 by Jelmer Vernooij
Run autopep8.
304
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
305
def get_host_name():
306
    """Return host machine name.
307
    If name cannot be obtained return None.
308
6362.2.3 by Martin Packman
Always return username and hostname as unicode in win32utils
309
    :return: A unicode string representing the host name.
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
310
    """
3626.1.2 by skip
win32utils.get_host_name() uses 'mbcs' encoding when decoding env vars
311
    if has_win32api:
312
        try:
3626.1.3 by John Arbash Meinel
Use GetComputerNameEx from ctypes when available.
313
            return win32api.GetComputerNameEx(_WIN32_ComputerNameDnsHostname)
3626.1.2 by skip
win32utils.get_host_name() uses 'mbcs' encoding when decoding env vars
314
        except (NotImplementedError, win32api.error):
315
            # NotImplemented will happen on win9x...
316
            pass
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
317
    if has_ctypes:
318
        try:
319
            kernel32 = ctypes.windll.kernel32
320
        except AttributeError:
7143.15.2 by Jelmer Vernooij
Run autopep8.
321
            pass  # Missing the module we need
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
322
        else:
7143.15.2 by Jelmer Vernooij
Run autopep8.
323
            buf = create_buffer(MAX_COMPUTERNAME_LENGTH + 1)
324
            n = ctypes.c_int(MAX_COMPUTERNAME_LENGTH + 1)
3626.1.3 by John Arbash Meinel
Use GetComputerNameEx from ctypes when available.
325
326
            # Try GetComputerNameEx which gives a proper Unicode hostname
7143.15.2 by Jelmer Vernooij
Run autopep8.
327
            GetComputerNameEx = getattr(kernel32, 'GetComputerNameEx' + suffix,
3626.1.3 by John Arbash Meinel
Use GetComputerNameEx from ctypes when available.
328
                                        None)
329
            if (GetComputerNameEx is not None
330
                and GetComputerNameEx(_WIN32_ComputerNameDnsHostname,
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
331
                                      buf, ctypes.byref(n))):
6362.2.3 by Martin Packman
Always return username and hostname as unicode in win32utils
332
                return extract_buffer(buf)
3626.1.3 by John Arbash Meinel
Use GetComputerNameEx from ctypes when available.
333
334
            # Try GetComputerName in case GetComputerNameEx wasn't found
335
            # It returns the NETBIOS name, which isn't as good, but still ok.
336
            # The first GetComputerNameEx might have changed 'n', so reset it
7143.15.2 by Jelmer Vernooij
Run autopep8.
337
            n = ctypes.c_int(MAX_COMPUTERNAME_LENGTH + 1)
338
            GetComputerName = getattr(kernel32, 'GetComputerName' + suffix,
3626.1.3 by John Arbash Meinel
Use GetComputerNameEx from ctypes when available.
339
                                      None)
340
            if (GetComputerName is not None
7143.15.2 by Jelmer Vernooij
Run autopep8.
341
                    and GetComputerName(buf, ctypes.byref(n))):
6362.2.3 by Martin Packman
Always return username and hostname as unicode in win32utils
342
                return extract_buffer(buf)
6362.2.2 by Martin Packman
Use get_environ_unicode throughout win32utils and always return unicode paths
343
    return get_environ_unicode('COMPUTERNAME')
2245.4.1 by Alexander Belchenko
win32utils: Windows-specific functions that use Win32 API via ctypes
344
345
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
346
def _ensure_with_dir(path):
4989.1.6 by Vincent Ladeuil
Add comments and update HACKING.txt about which units should be used.
347
    if (not os.path.split(path)[0] or path.startswith(u'*')
7143.15.2 by Jelmer Vernooij
Run autopep8.
348
            or path.startswith(u'?')):
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
349
        return u'./' + path, True
350
    else:
351
        return path, False
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
352
7143.15.2 by Jelmer Vernooij
Run autopep8.
353
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
354
def _undo_ensure_with_dir(path, corrected):
355
    if corrected:
356
        return path[2:]
357
    else:
358
        return path
359
360
4786.1.2 by John Arbash Meinel
Refactor the glob_expand code a bit, making the inner function more reusable.
361
def glob_one(possible_glob):
362
    """Same as glob.glob().
363
364
    work around bugs in glob.glob()
365
    - Python bug #1001604 ("glob doesn't return unicode with ...")
366
    - failing expansion for */* with non-iso-8859-* chars
367
    """
368
    corrected_glob, corrected = _ensure_with_dir(possible_glob)
369
    glob_files = glob.glob(corrected_glob)
370
371
    if not glob_files:
372
        # special case to let the normal code path handle
373
        # files that do not exist, etc.
374
        glob_files = [possible_glob]
375
    elif corrected:
376
        glob_files = [_undo_ensure_with_dir(elem, corrected)
377
                      for elem in glob_files]
378
    return [elem.replace(u'\\', u'/') for elem in glob_files]
379
380
2598.3.1 by Kuno Meyer
fix method rename glob_expand_for_win32 -> win32utils.glob_expand
381
def glob_expand(file_list):
2568.2.2 by Robert Collins
* New method ``_glob_expand_file_list_if_needed`` on the ``Command`` class
382
    """Replacement for glob expansion by the shell.
383
384
    Win32's cmd.exe does not do glob expansion (eg ``*.py``), so we do our own
385
    here.
386
387
    :param file_list: A list of filenames which may include shell globs.
388
    :return: An expanded list of filenames.
389
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
390
    Introduced in breezy 0.18.
2568.2.2 by Robert Collins
* New method ``_glob_expand_file_list_if_needed`` on the ``Command`` class
391
    """
392
    if not file_list:
393
        return []
394
    expanded_file_list = []
395
    for possible_glob in file_list:
4786.1.2 by John Arbash Meinel
Refactor the glob_expand code a bit, making the inner function more reusable.
396
        expanded_file_list.extend(glob_one(possible_glob))
397
    return expanded_file_list
2681.4.1 by Alexander Belchenko
win32: looking for full path of mail client executable in registry
398
399
400
def get_app_path(appname):
5891.1.2 by Andrew Bennetts
Fix a bunch of docstring formatting nits, making pydoctor a bit happier.
401
    r"""Look up in Windows registry for full path to application executable.
4031.3.1 by Frank Aspell
Fixing various typos
402
    Typically, applications create subkey with their basename
2681.4.1 by Alexander Belchenko
win32: looking for full path of mail client executable in registry
403
    in HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\
404
405
    :param  appname:    name of application (if no filename extension
406
                        is specified, .exe used)
407
    :return:    full path to aplication executable from registry,
408
                or appname itself if nothing found.
409
    """
2681.4.3 by Alexander Belchenko
move import _winreg into function get_app_path to avoid ImportError on non-win32 platforms
410
    import _winreg
4476.2.1 by Alexander Belchenko
win32utils.py: get_app_path() can read path for wordpad.exe (data type_id is REG_EXPAND_SZ).
411
412
    basename = appname
413
    if not os.path.splitext(basename)[1]:
414
        basename = appname + '.exe'
415
2681.4.1 by Alexander Belchenko
win32: looking for full path of mail client executable in registry
416
    try:
417
        hkey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,
7143.15.2 by Jelmer Vernooij
Run autopep8.
418
                               'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\' +
419
                               basename)
2681.4.1 by Alexander Belchenko
win32: looking for full path of mail client executable in registry
420
    except EnvironmentError:
421
        return appname
422
423
    try:
424
        try:
4476.2.1 by Alexander Belchenko
win32utils.py: get_app_path() can read path for wordpad.exe (data type_id is REG_EXPAND_SZ).
425
            path, type_id = _winreg.QueryValueEx(hkey, '')
2681.4.1 by Alexander Belchenko
win32: looking for full path of mail client executable in registry
426
        except WindowsError:
4476.2.1 by Alexander Belchenko
win32utils.py: get_app_path() can read path for wordpad.exe (data type_id is REG_EXPAND_SZ).
427
            return appname
2681.4.1 by Alexander Belchenko
win32: looking for full path of mail client executable in registry
428
    finally:
429
        _winreg.CloseKey(hkey)
430
4476.2.1 by Alexander Belchenko
win32utils.py: get_app_path() can read path for wordpad.exe (data type_id is REG_EXPAND_SZ).
431
    if type_id == REG_SZ:
432
        return path
433
    if type_id == REG_EXPAND_SZ and has_win32api:
434
        fullpath = win32api.ExpandEnvironmentStrings(path)
4476.2.2 by Alexander Belchenko
remove quotes around value only if there is pair of quotes (igc review)
435
        if len(fullpath) > 1 and fullpath[0] == '"' and fullpath[-1] == '"':
4476.2.1 by Alexander Belchenko
win32utils.py: get_app_path() can read path for wordpad.exe (data type_id is REG_EXPAND_SZ).
436
            fullpath = fullpath[1:-1]   # remove quotes around value
437
        return fullpath
438
    return appname
3023.1.2 by Alexander Belchenko
Martin's review.
439
440
441
def set_file_attr_hidden(path):
442
    """Set file attributes to hidden if possible"""
443
    if has_win32file:
6658.6.1 by Martin
Remove winver, win98 support code, and deprecated code
444
        SetFileAttributes = win32file.SetFileAttributesW
4505.2.1 by Alexander Belchenko
Set hidden attribute on .bzr directory below unicode path should never fail with error. The operation should succeed even if bzr unable to set the attribute. (related to bug #335362).
445
        try:
446
            SetFileAttributes(path, win32file.FILE_ATTRIBUTE_HIDDEN)
6619.3.2 by Jelmer Vernooij
Apply 2to3 except fix.
447
        except pywintypes.error as e:
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
448
            from . import trace
4505.2.1 by Alexander Belchenko
Set hidden attribute on .bzr directory below unicode path should never fail with error. The operation should succeed even if bzr unable to set the attribute. (related to bug #335362).
449
            trace.mutter('Unable to set hidden attribute on %r: %s', path, e)
4355.2.1 by Alexander Belchenko
Using unicode Windows API to obtain command-line arguments.
450
451
5274.4.12 by Martin
Change interface of _command_line_to_argv so old tests can still be used with new stripping logic
452
def _command_line_to_argv(command_line, argv, single_quotes_allowed=False):
4913.5.2 by Gordon Tyler
Changed shlex_split_unicode to prevent wildcard expansion in the win32 codepath.
453
    """Convert a Unicode command line into a list of argv arguments.
454
4913.5.25 by Gordon Tyler
Simplified win32utils.command_line_to_argv and made it private since it's no longer used outside of the module.
455
    It performs wildcard expansion to make wildcards act closer to how they
456
    work in posix shells, versus how they work by default on Windows. Quoted
457
    arguments are left untouched.
4913.5.2 by Gordon Tyler
Changed shlex_split_unicode to prevent wildcard expansion in the win32 codepath.
458
459
    :param command_line: The unicode string to split into an arg list.
4913.5.11 by Gordon Tyler
Added optional single quote support to UnicodeShlex and thus command_line_to_argv (defaults to disabled).
460
    :param single_quotes_allowed: Whether single quotes are accepted as quoting
461
                                  characters like double quotes. False by
462
                                  default.
4913.5.2 by Gordon Tyler
Changed shlex_split_unicode to prevent wildcard expansion in the win32 codepath.
463
    :return: A list of unicode strings.
4786.1.1 by John Arbash Meinel
Work on doing globbing, etc for all commands on Windows.
464
    """
6437.65.1 by Scanferlato
Fix two typos in docs and comment
465
    # First, split the command line
7143.15.2 by Jelmer Vernooij
Run autopep8.
466
    s = cmdline.Splitter(
467
        command_line, single_quotes_allowed=single_quotes_allowed)
468
469
    # Bug #587868 Now make sure that the length of s agrees with sys.argv
470
    # we do this by simply counting the number of arguments in each. The counts should
471
    # agree no matter what encoding sys.argv is in (AFAIK)
472
    # len(arguments) < len(sys.argv) should be an impossibility since python gets
5274.4.8 by Jason Spashett
Reverse merge -r 5280..5279
473
    # args from the very same PEB as does GetCommandLineW
474
    arguments = list(s)
7143.15.2 by Jelmer Vernooij
Run autopep8.
475
5274.4.8 by Jason Spashett
Reverse merge -r 5280..5279
476
    # Now shorten the command line we get from GetCommandLineW to match sys.argv
5274.4.12 by Martin
Change interface of _command_line_to_argv so old tests can still be used with new stripping logic
477
    if len(arguments) < len(argv):
5274.4.11 by Martin
Minor cleanup, use plain AssertionError and revert needless variable rename
478
        raise AssertionError("Split command line can't be shorter than argv")
5274.4.12 by Martin
Change interface of _command_line_to_argv so old tests can still be used with new stripping logic
479
    arguments = arguments[len(arguments) - len(argv):]
7143.15.2 by Jelmer Vernooij
Run autopep8.
480
5274.4.2 by Jason Spashett
Tidied up fix for 587868. Put assert in for impossible case in command line lengths.
481
    # Carry on to process globs (metachars) in the command line
5274.4.1 by Jason Spashett
Initial Fix for 587868
482
    # expand globs if necessary
4786.1.1 by John Arbash Meinel
Work on doing globbing, etc for all commands on Windows.
483
    # TODO: Use 'globbing' instead of 'glob.glob', this gives us stuff like
484
    #       '**/' style globs
5274.4.11 by Martin
Minor cleanup, use plain AssertionError and revert needless variable rename
485
    args = []
5274.4.8 by Jason Spashett
Reverse merge -r 5280..5279
486
    for is_quoted, arg in arguments:
4913.5.25 by Gordon Tyler
Simplified win32utils.command_line_to_argv and made it private since it's no longer used outside of the module.
487
        if is_quoted or not glob.has_magic(arg):
5274.4.11 by Martin
Minor cleanup, use plain AssertionError and revert needless variable rename
488
            args.append(arg)
4786.1.1 by John Arbash Meinel
Work on doing globbing, etc for all commands on Windows.
489
        else:
5274.4.11 by Martin
Minor cleanup, use plain AssertionError and revert needless variable rename
490
            args.extend(glob_one(arg))
491
    return args
5274.4.3 by Jason Spashett
Merge from lp:bzr. Remove code for fix 588277 (revs 5274.3.1 - 5274.3.2) as this bug also fixes that issue. Make changes as per code review.
492
4786.1.1 by John Arbash Meinel
Work on doing globbing, etc for all commands on Windows.
493
6658.6.1 by Martin
Remove winver, win98 support code, and deprecated code
494
if has_ctypes:
4355.2.1 by Alexander Belchenko
Using unicode Windows API to obtain command-line arguments.
495
    def get_unicode_argv():
4913.5.15 by Gordon Tyler
Python < 2.6 doesn't support use_last_error.
496
        prototype = ctypes.WINFUNCTYPE(ctypes.c_wchar_p)
4913.5.1 by Gordon Tyler
Changed shlex_split_unicode in commands.py to use win32utils.command_line_to_argv on win32 and cleaned up win32utils.get_unicode_argv.
497
        GetCommandLineW = prototype(("GetCommandLineW",
498
                                     ctypes.windll.kernel32))
499
        command_line = GetCommandLineW()
500
        if command_line is None:
501
            raise ctypes.WinError()
5274.4.8 by Jason Spashett
Reverse merge -r 5280..5279
502
        # Skip the first argument, since we only care about parameters
5274.4.12 by Martin
Change interface of _command_line_to_argv so old tests can still be used with new stripping logic
503
        argv = _command_line_to_argv(command_line, sys.argv)[1:]
4355.2.1 by Alexander Belchenko
Using unicode Windows API to obtain command-line arguments.
504
        return argv
6658.6.1 by Martin
Remove winver, win98 support code, and deprecated code
505
6339.2.3 by Martin Packman
Remove ability to specify a maximum buffer size as it serves no particular purpose
506
    def get_environ_unicode(key, default=None):
6339.2.1 by Martin Packman
Add wrapper for GetEnvironmentVariableW on windows for unicode environ access
507
        """Get `key` from environment as unicode or `default` if unset
508
6362.2.5 by Martin Packman
Tweaks including those suggested by vila in review
509
        The environment is natively unicode on modern windows versions but
510
        Python 2 only accesses it through the legacy bytestring api.
511
512
        Environmental variable names are case insenstive on Windows.
513
6339.2.3 by Martin Packman
Remove ability to specify a maximum buffer size as it serves no particular purpose
514
        A large enough buffer will be allocated to retrieve the value, though
515
        it may take two calls to the underlying library function.
6339.2.1 by Martin Packman
Add wrapper for GetEnvironmentVariableW on windows for unicode environ access
516
517
        This needs ctypes because pywin32 does not expose the wide version.
518
        """
6339.2.2 by Martin Packman
Variable name changes and docstring fix suggested by vila in review
519
        cfunc = getattr(get_environ_unicode, "_c_function", None)
520
        if cfunc is None:
6339.2.1 by Martin Packman
Add wrapper for GetEnvironmentVariableW on windows for unicode environ access
521
            from ctypes.wintypes import DWORD, LPCWSTR, LPWSTR
6339.2.2 by Martin Packman
Variable name changes and docstring fix suggested by vila in review
522
            cfunc = ctypes.WINFUNCTYPE(DWORD, LPCWSTR, LPWSTR, DWORD)(
6339.2.1 by Martin Packman
Add wrapper for GetEnvironmentVariableW on windows for unicode environ access
523
                ("GetEnvironmentVariableW", ctypes.windll.kernel32))
6339.2.2 by Martin Packman
Variable name changes and docstring fix suggested by vila in review
524
            get_environ_unicode._c_function = cfunc
7143.15.2 by Jelmer Vernooij
Run autopep8.
525
        buffer_size = 256  # heuristic, 256 characters often enough
6339.2.1 by Martin Packman
Add wrapper for GetEnvironmentVariableW on windows for unicode environ access
526
        while True:
527
            buffer = ctypes.create_unicode_buffer(buffer_size)
6339.2.2 by Martin Packman
Variable name changes and docstring fix suggested by vila in review
528
            length = cfunc(key, buffer, buffer_size)
6339.2.1 by Martin Packman
Add wrapper for GetEnvironmentVariableW on windows for unicode environ access
529
            if not length:
530
                code = ctypes.GetLastError()
7143.15.2 by Jelmer Vernooij
Run autopep8.
531
                if code == 203:  # ERROR_ENVVAR_NOT_FOUND
6339.2.1 by Martin Packman
Add wrapper for GetEnvironmentVariableW on windows for unicode environ access
532
                    return default
533
                raise ctypes.WinError(code)
534
            if buffer_size > length:
535
                return buffer[:length]
536
            buffer_size = length
5425.5.5 by Martin
Quick implementation of dead process detection on win32
537
538
539
if has_win32api:
540
    def _pywin32_is_local_pid_dead(pid):
541
        """True if pid doesn't correspond to live process on this machine"""
542
        try:
7143.15.2 by Jelmer Vernooij
Run autopep8.
543
            handle = win32api.OpenProcess(1, False, pid)  # PROCESS_TERMINATE
6619.3.2 by Jelmer Vernooij
Apply 2to3 except fix.
544
        except pywintypes.error as e:
7143.15.2 by Jelmer Vernooij
Run autopep8.
545
            if e[0] == 5:  # ERROR_ACCESS_DENIED
5425.5.5 by Martin
Quick implementation of dead process detection on win32
546
                # Probably something alive we're not allowed to kill
547
                return False
7143.15.2 by Jelmer Vernooij
Run autopep8.
548
            elif e[0] == 87:  # ERROR_INVALID_PARAMETER
5425.5.5 by Martin
Quick implementation of dead process detection on win32
549
                return True
550
            raise
551
        handle.close()
552
        return False
553
    is_local_pid_dead = _pywin32_is_local_pid_dead
5425.4.29 by Martin Pool
Don't try to get ctypes access to OpenProcess on non-win32 platforms
554
elif has_ctypes and sys.platform == 'win32':
5425.5.5 by Martin
Quick implementation of dead process detection on win32
555
    from ctypes.wintypes import BOOL, DWORD, HANDLE
556
    _kernel32 = ctypes.windll.kernel32
557
    _CloseHandle = ctypes.WINFUNCTYPE(BOOL, HANDLE)(
558
        ("CloseHandle", _kernel32))
559
    _OpenProcess = ctypes.WINFUNCTYPE(HANDLE, DWORD, BOOL, DWORD)(
560
        ("OpenProcess", _kernel32))
7143.15.2 by Jelmer Vernooij
Run autopep8.
561
5425.5.5 by Martin
Quick implementation of dead process detection on win32
562
    def _ctypes_is_local_pid_dead(pid):
563
        """True if pid doesn't correspond to live process on this machine"""
7143.15.2 by Jelmer Vernooij
Run autopep8.
564
        handle = _OpenProcess(1, False, pid)  # PROCESS_TERMINATE
5425.5.5 by Martin
Quick implementation of dead process detection on win32
565
        if not handle:
566
            errorcode = ctypes.GetLastError()
7143.15.2 by Jelmer Vernooij
Run autopep8.
567
            if errorcode == 5:  # ERROR_ACCESS_DENIED
5425.5.5 by Martin
Quick implementation of dead process detection on win32
568
                # Probably something alive we're not allowed to kill
569
                return False
7143.15.2 by Jelmer Vernooij
Run autopep8.
570
            elif errorcode == 87:  # ERROR_INVALID_PARAMETER
5425.5.5 by Martin
Quick implementation of dead process detection on win32
571
                return True
572
            raise ctypes.WinError(errorcode)
573
        _CloseHandle(handle)
574
        return False
575
    is_local_pid_dead = _ctypes_is_local_pid_dead
6336.2.1 by Martin Packman
Add is_environment_error() and switch trace to using it
576
577
578
def _is_pywintypes_error(evalue):
6336.2.2 by Martin Packman
Tweak how pywin32 is imported in win32utils to fix test failure edge case
579
    """True if exception instance is an error from pywin32"""
580
    if has_pywintypes and isinstance(evalue, pywintypes.error):
6336.2.1 by Martin Packman
Add is_environment_error() and switch trace to using it
581
        return True
582
    return False