152
144
trace.note('Cannot debug memory on win32 without ctypes'
153
145
' or win32process')
147
trace.note('WorkingSize %8d kB', info['WorkingSetSize'] / 1024)
148
trace.note('PeakWorking %8d kB', info['PeakWorkingSetSize'] / 1024)
156
# using base-2 units (see HACKING.txt).
157
trace.note('WorkingSize %7dKiB'
158
'\tPeakWorking %7dKiB\t%s',
159
info['WorkingSetSize'] / 1024,
160
info['PeakWorkingSetSize'] / 1024,
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)
151
trace.note('PagefileUsage %8d kB', info.get('PagefileUsage', 0) / 1024)
152
trace.note('PeakPagefileUsage %8d kB', info.get('PeakPagefileUsage', 0) / 1024)
153
trace.note('PrivateUsage %8d kB', info.get('PrivateUsage', 0) / 1024)
171
154
trace.note('PageFaultCount %8d', info.get('PageFaultCount', 0))
462
424
if not file_list:
464
427
expanded_file_list = []
465
428
for possible_glob in file_list:
466
expanded_file_list.extend(glob_one(possible_glob))
467
return expanded_file_list
430
# work around bugs in glob.glob()
431
# - Python bug #1001604 ("glob doesn't return unicode with ...")
432
# - failing expansion for */* with non-iso-8859-* chars
433
possible_glob, corrected = _ensure_with_dir(possible_glob)
434
glob_files = glob.glob(possible_glob)
437
# special case to let the normal code path handle
438
# files that do not exists
439
expanded_file_list.append(
440
_undo_ensure_with_dir(possible_glob, corrected))
442
glob_files = [_undo_ensure_with_dir(elem, corrected) for elem in glob_files]
443
expanded_file_list += glob_files
445
return [elem.replace(u'\\', u'/') for elem in expanded_file_list]
470
448
def get_app_path(appname):
471
449
"""Look up in Windows registry for full path to application executable.
472
Typically, applications create subkey with their basename
450
Typicaly, applications create subkey with their basename
473
451
in HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\
475
453
:param appname: name of application (if no filename extension
478
456
or appname itself if nothing found.
460
hkey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,
461
r'SOFTWARE\Microsoft\Windows'
462
r'\CurrentVersion\App Paths')
463
except EnvironmentError:
482
466
basename = appname
483
467
if not os.path.splitext(basename)[1]:
484
468
basename = appname + '.exe'
487
hkey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,
488
'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\' +
490
except EnvironmentError:
495
path, type_id = _winreg.QueryValueEx(hkey, '')
471
fullpath = _winreg.QueryValue(hkey, basename)
496
472
except WindowsError:
499
475
_winreg.CloseKey(hkey)
501
if type_id == REG_SZ:
503
if type_id == REG_EXPAND_SZ and has_win32api:
504
fullpath = win32api.ExpandEnvironmentStrings(path)
505
if len(fullpath) > 1 and fullpath[0] == '"' and fullpath[-1] == '"':
506
fullpath = fullpath[1:-1] # remove quotes around value
511
480
def set_file_attr_hidden(path):
512
481
"""Set file attributes to hidden if possible"""
513
482
if has_win32file:
514
if winver != 'Windows 98':
515
SetFileAttributes = win32file.SetFileAttributesW
517
SetFileAttributes = win32file.SetFileAttributes
519
SetFileAttributes(path, win32file.FILE_ATTRIBUTE_HIDDEN)
520
except pywintypes.error, e:
521
from bzrlib import trace
522
trace.mutter('Unable to set hidden attribute on %r: %s', path, e)
526
class UnicodeShlex(object):
527
"""This is a very simplified version of shlex.shlex.
529
The main change is that it supports non-ascii input streams. The internal
530
structure is quite simplified relative to shlex.shlex, since we aren't
531
trying to handle multiple input streams, etc. In fact, we don't use a
532
file-like api either.
535
def __init__(self, uni_string):
536
self._input = uni_string
537
self._input_iter = iter(self._input)
538
self._whitespace_match = re.compile(u'\s').match
539
self._word_match = re.compile(u'\S').match
540
self._quote_chars = u'"'
541
# self._quote_match = re.compile(u'[\'"]').match
542
self._escape_match = lambda x: None # Never matches
545
# ' ' - after whitespace, starting a new token
546
# 'a' - after text, currently working on a token
547
# '"' - after ", currently in a "-delimited quoted section
548
# "\" - after '\', checking the next char
550
self._token = [] # Current token being parsed
552
def _get_token(self):
553
# Were there quote chars as part of this token?
556
for nextchar in self._input_iter:
557
if self._state == ' ':
558
if self._whitespace_match(nextchar):
559
# if self._token: return token
561
elif nextchar in self._quote_chars:
562
self._state = nextchar # quoted state
563
elif self._word_match(nextchar):
564
self._token.append(nextchar)
567
raise AssertionError('wtttf?')
568
elif self._state in self._quote_chars:
570
if nextchar == self._state: # End of quote
571
self._state = 'a' # posix allows 'foo'bar to translate to
573
elif self._state == '"' and nextchar == self._escape:
574
quoted_state = self._state
575
self._state = nextchar
577
self._token.append(nextchar)
578
elif self._state == self._escape:
580
self._token.append('\\')
581
elif nextchar == '"':
582
self._token.append(nextchar)
584
self._token.append('\\' + nextchar)
585
self._state = quoted_state
586
elif self._state == 'a':
587
if self._whitespace_match(nextchar):
589
break # emit this token
591
continue # no token to emit
592
elif nextchar in self._quote_chars:
593
# Start a new quoted section
594
self._state = nextchar
596
elif (self._word_match(nextchar)
597
or nextchar in self._quote_chars
598
# or whitespace_split?
600
self._token.append(nextchar)
602
raise AssertionError('state == "a", char: %r'
605
raise AssertionError('unknown state: %r' % (self._state,))
606
result = ''.join(self._token)
608
if not quoted and result == '':
610
return quoted, result
616
quoted, token = self._get_token()
622
def _command_line_to_argv(command_line):
623
"""Convert a Unicode command line into a set of argv arguments.
625
This does wildcard expansion, etc. It is intended to make wildcards act
626
closer to how they work in posix shells, versus how they work by default on
629
s = UnicodeShlex(command_line)
630
# Now that we've split the content, expand globs
631
# TODO: Use 'globbing' instead of 'glob.glob', this gives us stuff like
634
for is_quoted, arg in s:
635
if is_quoted or not glob.has_magic(arg):
638
args.extend(glob_one(arg))
642
if has_ctypes and winver != 'Windows 98':
643
def get_unicode_argv():
644
LPCWSTR = ctypes.c_wchar_p
646
POINTER = ctypes.POINTER
647
prototype = ctypes.WINFUNCTYPE(LPCWSTR)
648
GetCommandLine = prototype(("GetCommandLineW",
649
ctypes.windll.kernel32))
650
prototype = ctypes.WINFUNCTYPE(POINTER(LPCWSTR), LPCWSTR, POINTER(INT))
651
command_line = GetCommandLine()
652
# Skip the first argument, since we only care about parameters
653
argv = _command_line_to_argv(command_line)[1:]
654
if getattr(sys, 'frozen', None) is None:
655
# Invoked via 'python.exe' which takes the form:
656
# python.exe [PYTHON_OPTIONS] C:\Path\bzr [BZR_OPTIONS]
657
# we need to get only BZR_OPTIONS part,
658
# We already removed 'python.exe' so we remove everything up to and
659
# including the first non-option ('-') argument.
660
for idx in xrange(len(argv)):
661
if argv[idx][:1] != '-':
666
get_unicode_argv = None
483
win32file.SetFileAttributes(path, win32file.FILE_ATTRIBUTE_HIDDEN)