153
154
' or win32process')
156
# using base-2 units (see HACKING.txt).
157
trace.note('WorkingSize %7dKiB'
158
'\tPeakWorking %7dKiB\t%s',
157
trace.note('WorkingSize %7dKB'
158
'\tPeakWorking %7dKB\t%s',
159
159
info['WorkingSetSize'] / 1024,
160
160
info['PeakWorkingSetSize'] / 1024,
164
164
trace.note('%s', message)
165
trace.note('WorkingSize %8d KiB', info['WorkingSetSize'] / 1024)
166
trace.note('PeakWorking %8d KiB', info['PeakWorkingSetSize'] / 1024)
167
trace.note('PagefileUsage %8d KiB', info.get('PagefileUsage', 0) / 1024)
168
trace.note('PeakPagefileUsage %8d KiB',
169
info.get('PeakPagefileUsage', 0) / 1024)
170
trace.note('PrivateUsage %8d KiB', info.get('PrivateUsage', 0) / 1024)
165
trace.note('WorkingSize %8d KB', info['WorkingSetSize'] / 1024)
166
trace.note('PeakWorking %8d KB', info['PeakWorkingSetSize'] / 1024)
167
trace.note('PagefileUsage %8d KB', info.get('PagefileUsage', 0) / 1024)
168
trace.note('PeakPagefileUsage %8d KB', info.get('PeakPagefileUsage', 0) / 1024)
169
trace.note('PrivateUsage %8d KB', info.get('PrivateUsage', 0) / 1024)
171
170
trace.note('PageFaultCount %8d', info.get('PageFaultCount', 0))
183
182
return (defaultx, defaulty)
185
184
# To avoid problem with redirecting output via pipe
186
# we need to use stderr instead of stdout
185
# need to use stderr instead of stdout
187
186
h = ctypes.windll.kernel32.GetStdHandle(WIN32_STDERR_HANDLE)
188
187
csbi = ctypes.create_string_buffer(22)
189
188
res = ctypes.windll.kernel32.GetConsoleScreenBufferInfo(h, csbi)
192
191
(bufx, bufy, curx, cury, wattr,
193
left, top, right, bottom, maxx, maxy) = struct.unpack(
194
"hhhhHhhhhhh", csbi.raw)
192
left, top, right, bottom, maxx, maxy) = struct.unpack("hhhhHhhhhhh", csbi.raw)
195
193
sizex = right - left + 1
196
194
sizey = bottom - top + 1
197
195
return (sizex, sizey)
522
520
trace.mutter('Unable to set hidden attribute on %r: %s', path, e)
525
def _command_line_to_argv(command_line, single_quotes_allowed=False):
526
"""Convert a Unicode command line into a list of argv arguments.
528
It performs wildcard expansion to make wildcards act closer to how they
529
work in posix shells, versus how they work by default on Windows. Quoted
530
arguments are left untouched.
532
:param command_line: The unicode string to split into an arg list.
533
:param single_quotes_allowed: Whether single quotes are accepted as quoting
534
characters like double quotes. False by
536
:return: A list of unicode strings.
538
s = cmdline.Splitter(command_line, single_quotes_allowed=single_quotes_allowed)
539
# Now that we've split the content, expand globs if necessary
524
class UnicodeShlex(object):
525
"""This is a very simplified version of shlex.shlex.
527
The main change is that it supports non-ascii input streams. The internal
528
structure is quite simplified relative to shlex.shlex, since we aren't
529
trying to handle multiple input streams, etc. In fact, we don't use a
530
file-like api either.
533
def __init__(self, uni_string):
534
self._input = uni_string
535
self._input_iter = iter(self._input)
536
self._whitespace_match = re.compile(u'\s').match
537
self._word_match = re.compile(u'\S').match
538
self._quote_chars = u'\'"'
539
# self._quote_match = re.compile(u'[\'"]').match
540
self._escape_match = lambda x: None # Never matches
543
# ' ' - after whitespace, starting a new token
544
# 'a' - after text, currently working on a token
545
# '"' - after ", currently in a "-delimited quoted section
546
# "'" - after ', currently in a '-delimited quotod section
547
# "\" - after '\', checking the next char
549
self._token = [] # Current token being parsed
551
def _get_token(self):
552
# Were there quote chars as part of this token?
555
for nextchar in self._input_iter:
556
if self._state == ' ':
557
if self._whitespace_match(nextchar):
558
# if self._token: return token
560
elif nextchar in self._quote_chars:
561
self._state = nextchar # quoted state
562
elif self._word_match(nextchar):
563
self._token.append(nextchar)
566
raise AssertionError('wtttf?')
567
elif self._state in self._quote_chars:
569
if nextchar == self._state: # End of quote
570
self._state = 'a' # posix allows 'foo'bar to translate to
572
elif self._state == '"' and nextchar == self._escape:
573
quoted_state = self._state
574
self._state = nextchar
576
self._token.append(nextchar)
577
elif self._state == self._escape:
579
self._token.append('\\')
580
elif nextchar == '"':
581
self._token.append(nextchar)
583
self._token.append('\\' + nextchar)
584
self._state = quoted_state
585
elif self._state == 'a':
586
if self._whitespace_match(nextchar):
588
break # emit this token
590
continue # no token to emit
591
elif nextchar in self._quote_chars:
592
# Start a new quoted section
593
self._state = nextchar
595
elif (self._word_match(nextchar)
596
or nextchar in self._quote_chars
597
# or whitespace_split?
599
self._token.append(nextchar)
601
raise AssertionError('state == "a", char: %r'
604
raise AssertionError('unknown state: %r' % (self._state,))
605
result = ''.join(self._token)
607
if not quoted and result == '':
609
return quoted, result
615
quoted, token = self._get_token()
621
def _command_line_to_argv(command_line):
622
"""Convert a Unicode command line into a set of argv arguments.
624
This does wildcard expansion, etc. It is intended to make wildcards act
625
closer to how they work in posix shells, versus how they work by default on
628
s = UnicodeShlex(command_line)
629
# Now that we've split the content, expand globs
540
630
# TODO: Use 'globbing' instead of 'glob.glob', this gives us stuff like
541
631
# '**/' style globs
543
633
for is_quoted, arg in s:
544
634
if is_quoted or not glob.has_magic(arg):
635
args.append(arg.replace(u'\\', u'/'))
547
637
args.extend(glob_one(arg))
551
641
if has_ctypes and winver != 'Windows 98':
552
642
def get_unicode_argv():
553
prototype = ctypes.WINFUNCTYPE(ctypes.c_wchar_p)
554
GetCommandLineW = prototype(("GetCommandLineW",
555
ctypes.windll.kernel32))
556
command_line = GetCommandLineW()
557
if command_line is None:
558
raise ctypes.WinError()
643
LPCWSTR = ctypes.c_wchar_p
645
POINTER = ctypes.POINTER
646
prototype = ctypes.WINFUNCTYPE(LPCWSTR)
647
GetCommandLine = prototype(("GetCommandLineW",
648
ctypes.windll.kernel32))
649
prototype = ctypes.WINFUNCTYPE(POINTER(LPCWSTR), LPCWSTR, POINTER(INT))
650
command_line = GetCommandLine()
559
651
# Skip the first argument, since we only care about parameters
560
argv = _command_line_to_argv(command_line)[1:]
652
argv = _command_line_to_argv(GetCommandLine())[1:]
561
653
if getattr(sys, 'frozen', None) is None:
562
654
# Invoked via 'python.exe' which takes the form:
563
655
# python.exe [PYTHON_OPTIONS] C:\Path\bzr [BZR_OPTIONS]