~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/win32utils.py

  • Committer: John Arbash Meinel
  • Date: 2007-05-04 18:59:36 UTC
  • mto: This revision was merged to the branch mainline in revision 2643.
  • Revision ID: john@arbash-meinel.com-20070504185936-1mjdoqmtz74xe5mg
A C implementation of _fields_to_entry_0_parents drops the time from 400ms to 330ms for a 21k-entry tree

Show diffs side-by-side

added added

removed removed

Lines of Context:
64
64
    else:
65
65
        create_buffer = ctypes.create_unicode_buffer
66
66
        suffix = 'W'
67
 
try:
68
 
    import win32file
69
 
    has_win32file = True
70
 
except ImportError:
71
 
    has_win32file = False
72
67
 
73
68
 
74
69
# Special Win32 API constants
174
169
    # at least return windows root directory
175
170
    windir = os.environ.get('windir')
176
171
    if windir:
177
 
        return os.path.splitdrive(windir)[0] + '/'
 
172
        return os.path.splitdrive(windir) + '/'
178
173
    # otherwise C:\ is good enough for 98% users
179
174
    return 'C:/'
180
175
 
243
238
 
244
239
def get_host_name_unicode():
245
240
    return _ensure_unicode(get_host_name())
246
 
 
247
 
 
248
 
def _ensure_with_dir(path):
249
 
    if not os.path.split(path)[0] or path.startswith(u'*') or path.startswith(u'?'):
250
 
        return u'./' + path, True
251
 
    else:
252
 
        return path, False
253
 
    
254
 
def _undo_ensure_with_dir(path, corrected):
255
 
    if corrected:
256
 
        return path[2:]
257
 
    else:
258
 
        return path
259
 
 
260
 
 
261
 
 
262
 
def glob_expand(file_list):
263
 
    """Replacement for glob expansion by the shell.
264
 
 
265
 
    Win32's cmd.exe does not do glob expansion (eg ``*.py``), so we do our own
266
 
    here.
267
 
 
268
 
    :param file_list: A list of filenames which may include shell globs.
269
 
    :return: An expanded list of filenames.
270
 
 
271
 
    Introduced in bzrlib 0.18.
272
 
    """
273
 
    if not file_list:
274
 
        return []
275
 
    import glob
276
 
    expanded_file_list = []
277
 
    for possible_glob in file_list:
278
 
        
279
 
        # work around bugs in glob.glob()
280
 
        # - Python bug #1001604 ("glob doesn't return unicode with ...")
281
 
        # - failing expansion for */* with non-iso-8859-* chars
282
 
        possible_glob, corrected = _ensure_with_dir(possible_glob)
283
 
        glob_files = glob.glob(possible_glob)
284
 
 
285
 
        if glob_files == []:
286
 
            # special case to let the normal code path handle
287
 
            # files that do not exists
288
 
            expanded_file_list.append(
289
 
                _undo_ensure_with_dir(possible_glob, corrected))
290
 
        else:
291
 
            glob_files = [_undo_ensure_with_dir(elem, corrected) for elem in glob_files]
292
 
            expanded_file_list += glob_files
293
 
            
294
 
    return [elem.replace(u'\\', u'/') for elem in expanded_file_list] 
295
 
 
296
 
 
297
 
def get_app_path(appname):
298
 
    """Look up in Windows registry for full path to application executable.
299
 
    Typicaly, applications create subkey with their basename
300
 
    in HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\
301
 
 
302
 
    :param  appname:    name of application (if no filename extension
303
 
                        is specified, .exe used)
304
 
    :return:    full path to aplication executable from registry,
305
 
                or appname itself if nothing found.
306
 
    """
307
 
    import _winreg
308
 
    try:
309
 
        hkey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,
310
 
                               r'SOFTWARE\Microsoft\Windows'
311
 
                               r'\CurrentVersion\App Paths')
312
 
    except EnvironmentError:
313
 
        return appname
314
 
 
315
 
    basename = appname
316
 
    if not os.path.splitext(basename)[1]:
317
 
        basename = appname + '.exe'
318
 
    try:
319
 
        try:
320
 
            fullpath = _winreg.QueryValue(hkey, basename)
321
 
        except WindowsError:
322
 
            fullpath = appname
323
 
    finally:
324
 
        _winreg.CloseKey(hkey)
325
 
 
326
 
    return fullpath
327
 
 
328
 
 
329
 
def set_file_attr_hidden(path):
330
 
    """Set file attributes to hidden if possible"""
331
 
    if has_win32file:
332
 
        win32file.SetFileAttributes(path, win32file.FILE_ATTRIBUTE_HIDDEN)