128
136
'WorkingSetSize': mem_struct.WorkingSetSize,
129
137
'QuotaPeakPagedPoolUsage': mem_struct.QuotaPeakPagedPoolUsage,
130
138
'QuotaPagedPoolUsage': mem_struct.QuotaPagedPoolUsage,
131
'QuotaPeakNonPagedPoolUsage': mem_struct.QuotaPeakNonPagedPoolUsage,
139
'QuotaPeakNonPagedPoolUsage':
140
mem_struct.QuotaPeakNonPagedPoolUsage,
132
141
'QuotaNonPagedPoolUsage': mem_struct.QuotaNonPagedPoolUsage,
133
142
'PagefileUsage': mem_struct.PagefileUsage,
134
143
'PeakPagefileUsage': mem_struct.PeakPagefileUsage,
145
154
' or win32process')
148
trace.note('WorkingSize %7dKB'
149
'\tPeakWorking %7dKB\t%s',
157
# using base-2 units (see HACKING.txt).
158
trace.note('WorkingSize %7dKiB'
159
'\tPeakWorking %7dKiB\t%s',
150
160
info['WorkingSetSize'] / 1024,
151
161
info['PeakWorkingSetSize'] / 1024,
155
165
trace.note('%s', message)
156
trace.note('WorkingSize %8d KB', info['WorkingSetSize'] / 1024)
157
trace.note('PeakWorking %8d KB', info['PeakWorkingSetSize'] / 1024)
158
trace.note('PagefileUsage %8d KB', info.get('PagefileUsage', 0) / 1024)
159
trace.note('PeakPagefileUsage %8d KB', info.get('PeakPagefileUsage', 0) / 1024)
160
trace.note('PrivateUsage %8d KB', info.get('PrivateUsage', 0) / 1024)
166
trace.note('WorkingSize %8d KiB', info['WorkingSetSize'] / 1024)
167
trace.note('PeakWorking %8d KiB', info['PeakWorkingSetSize'] / 1024)
168
trace.note('PagefileUsage %8d KiB', info.get('PagefileUsage', 0) / 1024)
169
trace.note('PeakPagefileUsage %8d KiB',
170
info.get('PeakPagefileUsage', 0) / 1024)
171
trace.note('PrivateUsage %8d KiB', info.get('PrivateUsage', 0) / 1024)
161
172
trace.note('PageFaultCount %8d', info.get('PageFaultCount', 0))
173
184
return (defaultx, defaulty)
175
186
# To avoid problem with redirecting output via pipe
176
# need to use stderr instead of stdout
187
# we need to use stderr instead of stdout
177
188
h = ctypes.windll.kernel32.GetStdHandle(WIN32_STDERR_HANDLE)
178
189
csbi = ctypes.create_string_buffer(22)
179
190
res = ctypes.windll.kernel32.GetConsoleScreenBufferInfo(h, csbi)
182
193
(bufx, bufy, curx, cury, wattr,
183
left, top, right, bottom, maxx, maxy) = struct.unpack("hhhhHhhhhhh", csbi.raw)
194
left, top, right, bottom, maxx, maxy) = struct.unpack(
195
"hhhhHhhhhhh", csbi.raw)
184
196
sizex = right - left + 1
185
197
sizey = bottom - top + 1
186
198
return (sizex, sizey)
432
def glob_one(possible_glob):
433
"""Same as glob.glob().
435
work around bugs in glob.glob()
436
- Python bug #1001604 ("glob doesn't return unicode with ...")
437
- failing expansion for */* with non-iso-8859-* chars
439
corrected_glob, corrected = _ensure_with_dir(possible_glob)
440
glob_files = glob.glob(corrected_glob)
443
# special case to let the normal code path handle
444
# files that do not exist, etc.
445
glob_files = [possible_glob]
447
glob_files = [_undo_ensure_with_dir(elem, corrected)
448
for elem in glob_files]
449
return [elem.replace(u'\\', u'/') for elem in glob_files]
420
452
def glob_expand(file_list):
421
453
"""Replacement for glob expansion by the shell.
431
463
if not file_list:
434
465
expanded_file_list = []
435
466
for possible_glob in file_list:
437
# work around bugs in glob.glob()
438
# - Python bug #1001604 ("glob doesn't return unicode with ...")
439
# - failing expansion for */* with non-iso-8859-* chars
440
possible_glob, corrected = _ensure_with_dir(possible_glob)
441
glob_files = glob.glob(possible_glob)
444
# special case to let the normal code path handle
445
# files that do not exists
446
expanded_file_list.append(
447
_undo_ensure_with_dir(possible_glob, corrected))
449
glob_files = [_undo_ensure_with_dir(elem, corrected) for elem in glob_files]
450
expanded_file_list += glob_files
452
return [elem.replace(u'\\', u'/') for elem in expanded_file_list]
467
expanded_file_list.extend(glob_one(possible_glob))
468
return expanded_file_list
455
471
def get_app_path(appname):
456
472
"""Look up in Windows registry for full path to application executable.
457
Typicaly, applications create subkey with their basename
473
Typically, applications create subkey with their basename
458
474
in HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\
460
476
:param appname: name of application (if no filename extension
463
479
or appname itself if nothing found.
484
if not os.path.splitext(basename)[1]:
485
basename = appname + '.exe'
467
488
hkey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,
468
r'SOFTWARE\Microsoft\Windows'
469
r'\CurrentVersion\App Paths')
489
'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\' +
470
491
except EnvironmentError:
474
if not os.path.splitext(basename)[1]:
475
basename = appname + '.exe'
478
fullpath = _winreg.QueryValue(hkey, basename)
496
path, type_id = _winreg.QueryValueEx(hkey, '')
479
497
except WindowsError:
482
500
_winreg.CloseKey(hkey)
502
if type_id == REG_SZ:
504
if type_id == REG_EXPAND_SZ and has_win32api:
505
fullpath = win32api.ExpandEnvironmentStrings(path)
506
if len(fullpath) > 1 and fullpath[0] == '"' and fullpath[-1] == '"':
507
fullpath = fullpath[1:-1] # remove quotes around value
487
512
def set_file_attr_hidden(path):
488
513
"""Set file attributes to hidden if possible"""
489
514
if has_win32file:
490
win32file.SetFileAttributes(path, win32file.FILE_ATTRIBUTE_HIDDEN)
515
if winver != 'Windows 98':
516
SetFileAttributes = win32file.SetFileAttributesW
518
SetFileAttributes = win32file.SetFileAttributes
520
SetFileAttributes(path, win32file.FILE_ATTRIBUTE_HIDDEN)
521
except pywintypes.error, e:
522
from bzrlib import trace
523
trace.mutter('Unable to set hidden attribute on %r: %s', path, e)
526
def _command_line_to_argv(command_line, single_quotes_allowed=False):
527
"""Convert a Unicode command line into a list of argv arguments.
529
It performs wildcard expansion to make wildcards act closer to how they
530
work in posix shells, versus how they work by default on Windows. Quoted
531
arguments are left untouched.
533
:param command_line: The unicode string to split into an arg list.
534
:param single_quotes_allowed: Whether single quotes are accepted as quoting
535
characters like double quotes. False by
537
:return: A list of unicode strings.
539
s = cmdline.Splitter(command_line, single_quotes_allowed=single_quotes_allowed)
540
# Now that we've split the content, expand globs if necessary
541
# TODO: Use 'globbing' instead of 'glob.glob', this gives us stuff like
544
for is_quoted, arg in s:
545
if is_quoted or not glob.has_magic(arg):
548
args.extend(glob_one(arg))
552
if has_ctypes and winver != 'Windows 98':
553
def get_unicode_argv():
554
prototype = ctypes.WINFUNCTYPE(ctypes.c_wchar_p)
555
GetCommandLineW = prototype(("GetCommandLineW",
556
ctypes.windll.kernel32))
557
command_line = GetCommandLineW()
558
if command_line is None:
559
raise ctypes.WinError()
560
# Skip the first argument, since we only care about parameters
561
argv = _command_line_to_argv(command_line)[1:]
562
if getattr(sys, 'frozen', None) is None:
563
# Invoked via 'python.exe' which takes the form:
564
# python.exe [PYTHON_OPTIONS] C:\Path\bzr [BZR_OPTIONS]
565
# we need to get only BZR_OPTIONS part,
566
# We already removed 'python.exe' so we remove everything up to and
567
# including the first non-option ('-') argument.
568
for idx in xrange(len(argv)):
569
if argv[idx][:1] != '-':
574
get_unicode_argv = None