~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/win32utils.py

  • Committer: Joe Julian
  • Date: 2010-01-10 02:25:31 UTC
  • mto: (4634.119.7 2.0)
  • mto: This revision was merged to the branch mainline in revision 4959.
  • Revision ID: joe@julianfamily.org-20100110022531-wqk61rsagz8xsiga
Added MANIFEST.in to allow bdist_rpm to have all the required include files and tools. bdist_rpm will still fail to build correctly on some distributions due to a disttools bug http://bugs.python.org/issue644744

Show diffs side-by-side

added added

removed removed

Lines of Context:
66
66
        suffix = 'W'
67
67
try:
68
68
    import win32file
 
69
    import pywintypes
69
70
    has_win32file = True
70
71
except ImportError:
71
72
    has_win32file = False
96
97
UNLEN = 256
97
98
MAX_COMPUTERNAME_LENGTH = 31
98
99
 
 
100
# Registry data type ids
 
101
REG_SZ = 1
 
102
REG_EXPAND_SZ = 2
 
103
 
99
104
 
100
105
def debug_memory_win32api(message='', short=True):
101
106
    """Use trace.note() to dump the running memory info."""
267
272
 
268
273
    Returned value can be unicode or plain string.
269
274
    To convert plain string to unicode use
270
 
    s.decode(bzrlib.user_encoding)
 
275
    s.decode(osutils.get_user_encoding())
271
276
    (XXX - but see bug 262874, which asserts the correct encoding is 'mbcs')
272
277
    """
273
278
    local = _get_sh_special_folder_path(CSIDL_LOCAL_APPDATA)
433
438
    import glob
434
439
    expanded_file_list = []
435
440
    for possible_glob in file_list:
436
 
 
437
441
        # work around bugs in glob.glob()
438
442
        # - Python bug #1001604 ("glob doesn't return unicode with ...")
439
443
        # - failing expansion for */* with non-iso-8859-* chars
463
467
                or appname itself if nothing found.
464
468
    """
465
469
    import _winreg
 
470
 
 
471
    basename = appname
 
472
    if not os.path.splitext(basename)[1]:
 
473
        basename = appname + '.exe'
 
474
 
466
475
    try:
467
476
        hkey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,
468
 
                               r'SOFTWARE\Microsoft\Windows'
469
 
                               r'\CurrentVersion\App Paths')
 
477
            'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\' +
 
478
            basename)
470
479
    except EnvironmentError:
471
480
        return appname
472
481
 
473
 
    basename = appname
474
 
    if not os.path.splitext(basename)[1]:
475
 
        basename = appname + '.exe'
476
482
    try:
477
483
        try:
478
 
            fullpath = _winreg.QueryValue(hkey, basename)
 
484
            path, type_id = _winreg.QueryValueEx(hkey, '')
479
485
        except WindowsError:
480
 
            fullpath = appname
 
486
            return appname
481
487
    finally:
482
488
        _winreg.CloseKey(hkey)
483
489
 
484
 
    return fullpath
 
490
    if type_id == REG_SZ:
 
491
        return path
 
492
    if type_id == REG_EXPAND_SZ and has_win32api:
 
493
        fullpath = win32api.ExpandEnvironmentStrings(path)
 
494
        if len(fullpath) > 1 and fullpath[0] == '"' and fullpath[-1] == '"':
 
495
            fullpath = fullpath[1:-1]   # remove quotes around value
 
496
        return fullpath
 
497
    return appname
485
498
 
486
499
 
487
500
def set_file_attr_hidden(path):
488
501
    """Set file attributes to hidden if possible"""
489
502
    if has_win32file:
490
 
        win32file.SetFileAttributes(path, win32file.FILE_ATTRIBUTE_HIDDEN)
 
503
        if winver != 'Windows 98':
 
504
            SetFileAttributes = win32file.SetFileAttributesW
 
505
        else:
 
506
            SetFileAttributes = win32file.SetFileAttributes
 
507
        try:
 
508
            SetFileAttributes(path, win32file.FILE_ATTRIBUTE_HIDDEN)
 
509
        except pywintypes.error, e:
 
510
            from bzrlib import trace
 
511
            trace.mutter('Unable to set hidden attribute on %r: %s', path, e)
 
512
 
 
513
 
 
514
if has_ctypes and winver != 'Windows 98':
 
515
    def get_unicode_argv():
 
516
        LPCWSTR = ctypes.c_wchar_p
 
517
        INT = ctypes.c_int
 
518
        POINTER = ctypes.POINTER
 
519
        prototype = ctypes.WINFUNCTYPE(LPCWSTR)
 
520
        GetCommandLine = prototype(("GetCommandLineW",
 
521
                                    ctypes.windll.kernel32))
 
522
        prototype = ctypes.WINFUNCTYPE(POINTER(LPCWSTR), LPCWSTR, POINTER(INT))
 
523
        CommandLineToArgv = prototype(("CommandLineToArgvW",
 
524
                                       ctypes.windll.shell32))
 
525
        c = INT(0)
 
526
        pargv = CommandLineToArgv(GetCommandLine(), ctypes.byref(c))
 
527
        # Skip the first argument, since we only care about parameters
 
528
        argv = [pargv[i] for i in range(1, c.value)]
 
529
        if getattr(sys, 'frozen', None) is None:
 
530
            # Invoked via 'python.exe' which takes the form:
 
531
            #   python.exe [PYTHON_OPTIONS] C:\Path\bzr [BZR_OPTIONS]
 
532
            # we need to get only BZR_OPTIONS part,
 
533
            # so let's using sys.argv[1:] as reference to get the tail
 
534
            # of unicode argv
 
535
            tail_len = len(sys.argv[1:])
 
536
            ix = len(argv) - tail_len
 
537
            argv = argv[ix:]
 
538
        return argv
 
539
else:
 
540
    get_unicode_argv = None