/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/win32utils.py

Merge 2.0 into 2.1 resolving conflicts

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
 
22
22
import glob
23
23
import os
 
24
import re
24
25
import struct
25
26
import sys
26
27
 
27
 
from bzrlib import cmdline
28
28
 
29
29
# Windows version
30
30
if sys.platform == 'win32':
135
135
                'WorkingSetSize': mem_struct.WorkingSetSize,
136
136
                'QuotaPeakPagedPoolUsage': mem_struct.QuotaPeakPagedPoolUsage,
137
137
                'QuotaPagedPoolUsage': mem_struct.QuotaPagedPoolUsage,
138
 
                'QuotaPeakNonPagedPoolUsage':
139
 
                    mem_struct.QuotaPeakNonPagedPoolUsage,
 
138
                'QuotaPeakNonPagedPoolUsage': mem_struct.QuotaPeakNonPagedPoolUsage,
140
139
                'QuotaNonPagedPoolUsage': mem_struct.QuotaNonPagedPoolUsage,
141
140
                'PagefileUsage': mem_struct.PagefileUsage,
142
141
                'PeakPagefileUsage': mem_struct.PeakPagefileUsage,
153
152
                   ' or win32process')
154
153
        return
155
154
    if short:
156
 
        # using base-2 units (see HACKING.txt).
157
 
        trace.note('WorkingSize %7dKiB'
158
 
                   '\tPeakWorking %7dKiB\t%s',
 
155
        trace.note('WorkingSize %7dKB'
 
156
                   '\tPeakWorking %7dKB\t%s',
159
157
                   info['WorkingSetSize'] / 1024,
160
158
                   info['PeakWorkingSetSize'] / 1024,
161
159
                   message)
162
160
        return
163
161
    if message:
164
162
        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)
 
163
    trace.note('WorkingSize       %8d KB', info['WorkingSetSize'] / 1024)
 
164
    trace.note('PeakWorking       %8d KB', info['PeakWorkingSetSize'] / 1024)
 
165
    trace.note('PagefileUsage     %8d KB', info.get('PagefileUsage', 0) / 1024)
 
166
    trace.note('PeakPagefileUsage %8d KB', info.get('PeakPagefileUsage', 0) / 1024)
 
167
    trace.note('PrivateUsage      %8d KB', info.get('PrivateUsage', 0) / 1024)
171
168
    trace.note('PageFaultCount    %8d', info.get('PageFaultCount', 0))
172
169
 
173
170
 
190
187
 
191
188
    if res:
192
189
        (bufx, bufy, curx, cury, wattr,
193
 
        left, top, right, bottom, maxx, maxy) = struct.unpack(
194
 
            "hhhhHhhhhhh", csbi.raw)
 
190
        left, top, right, bottom, maxx, maxy) = struct.unpack("hhhhHhhhhhh", csbi.raw)
195
191
        sizex = right - left + 1
196
192
        sizey = bottom - top + 1
197
193
        return (sizex, sizey)
414
410
 
415
411
 
416
412
def _ensure_with_dir(path):
417
 
    if (not os.path.split(path)[0] or path.startswith(u'*')
418
 
        or path.startswith(u'?')):
 
413
    if not os.path.split(path)[0] or path.startswith(u'*') or path.startswith(u'?'):
419
414
        return u'./' + path, True
420
415
    else:
421
416
        return path, False
522
517
            trace.mutter('Unable to set hidden attribute on %r: %s', path, e)
523
518
 
524
519
 
525
 
def _command_line_to_argv(command_line, single_quotes_allowed=False):
526
 
    """Convert a Unicode command line into a list of argv arguments.
527
 
 
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.
531
 
 
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
535
 
                                  default.
536
 
    :return: A list of unicode strings.
537
 
    """
538
 
    s = cmdline.Splitter(command_line, single_quotes_allowed=single_quotes_allowed)
539
 
    # Now that we've split the content, expand globs if necessary
 
520
 
 
521
class UnicodeShlex(object):
 
522
    """This is a very simplified version of shlex.shlex.
 
523
 
 
524
    The main change is that it supports non-ascii input streams. The internal
 
525
    structure is quite simplified relative to shlex.shlex, since we aren't
 
526
    trying to handle multiple input streams, etc. In fact, we don't use a
 
527
    file-like api either.
 
528
    """
 
529
 
 
530
    def __init__(self, uni_string):
 
531
        self._input = uni_string
 
532
        self._input_iter = iter(self._input)
 
533
        self._whitespace_match = re.compile(u'\s').match
 
534
        self._word_match = re.compile(u'\S').match
 
535
        self._quote_chars = u'"'
 
536
        # self._quote_match = re.compile(u'[\'"]').match
 
537
        self._escape_match = lambda x: None # Never matches
 
538
        self._escape = '\\'
 
539
        self._token = [] # Current token being parsed
 
540
 
 
541
    def _get_token(self):
 
542
        # Were there quote chars as part of this token?
 
543
        quoted = None   # state:
 
544
                        #  None - the string is not quoted
 
545
                        #  empty string ('') - there was quoted substring
 
546
                        #  double quote (") - we're inside quoted chunk
 
547
        number_of_backslashes = 0
 
548
        for nextchar in self._input_iter:
 
549
            if self._whitespace_match(nextchar):
 
550
                if quoted:
 
551
                    self._token.append(nextchar)
 
552
                elif self._token:
 
553
                    break
 
554
            elif nextchar == '\\':
 
555
                number_of_backslashes += 1
 
556
            elif nextchar in self._quote_chars:
 
557
                if number_of_backslashes:
 
558
                    self._token.append('\\'*(number_of_backslashes/2))
 
559
                    if number_of_backslashes % 2:
 
560
                        self._token.append('"')
 
561
                    else:
 
562
                        if quoted:
 
563
                            quoted = ''
 
564
                        else:
 
565
                            quoted = nextchar
 
566
                    number_of_backslashes = 0
 
567
                elif nextchar == quoted:
 
568
                    # end of quoted string
 
569
                    quoted = ''
 
570
                else:
 
571
                    quoted = nextchar
 
572
            else:
 
573
                if number_of_backslashes:
 
574
                    self._token.append('\\'*number_of_backslashes)
 
575
                    number_of_backslashes = 0
 
576
                self._token.append(nextchar)
 
577
        if number_of_backslashes > 0:
 
578
            self._token.append('\\'*number_of_backslashes)
 
579
        result = ''.join(self._token)
 
580
        self._token = []
 
581
        quoted = quoted is not None
 
582
        if not quoted and result == '':
 
583
            result = None
 
584
        return quoted, result
 
585
 
 
586
    def __iter__(self):
 
587
        return self
 
588
 
 
589
    def next(self):
 
590
        quoted, token = self._get_token()
 
591
        if token is None:
 
592
            raise StopIteration
 
593
        return quoted, token
 
594
 
 
595
 
 
596
def _command_line_to_argv(command_line):
 
597
    """Convert a Unicode command line into a set of argv arguments.
 
598
 
 
599
    This does wildcard expansion, etc. It is intended to make wildcards act
 
600
    closer to how they work in posix shells, versus how they work by default on
 
601
    Windows.
 
602
    """
 
603
    s = UnicodeShlex(command_line)
 
604
    # Now that we've split the content, expand globs
540
605
    # TODO: Use 'globbing' instead of 'glob.glob', this gives us stuff like
541
606
    #       '**/' style globs
542
607
    args = []
550
615
 
551
616
if has_ctypes and winver != 'Windows 98':
552
617
    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()
 
618
        LPCWSTR = ctypes.c_wchar_p
 
619
        INT = ctypes.c_int
 
620
        POINTER = ctypes.POINTER
 
621
        prototype = ctypes.WINFUNCTYPE(LPCWSTR)
 
622
        GetCommandLine = prototype(("GetCommandLineW",
 
623
                                    ctypes.windll.kernel32))
 
624
        prototype = ctypes.WINFUNCTYPE(POINTER(LPCWSTR), LPCWSTR, POINTER(INT))
 
625
        command_line = GetCommandLine()
559
626
        # Skip the first argument, since we only care about parameters
560
627
        argv = _command_line_to_argv(command_line)[1:]
561
628
        if getattr(sys, 'frozen', None) is None: