~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/osutils.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2011-02-09 08:51:29 UTC
  • mfrom: (5638.2.2 537442-annotate-removed)
  • Revision ID: pqm@pqm.ubuntu.com-20110209085129-0qspgtdaj4gfu2qr
(vila) Annotate deleted files if they can be found in the specified
 revision. (Andrew King)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2010 Canonical Ltd
 
1
# Copyright (C) 2005-2011 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
967
967
    # they tend to happen very early in startup when we can't check config
968
968
    # files etc, and also we want to report all failures but not spam the user
969
969
    # with 10 warnings.
970
 
    from bzrlib import trace
971
970
    exception_str = str(exception)
972
971
    if exception_str not in _extension_load_failures:
973
972
        trace.mutter("failed to load compiled extension: %s" % exception_str)
1462
1461
    # a similar effect.
1463
1462
 
1464
1463
    # If BZR_COLUMNS is set, take it, user is always right
 
1464
    # Except if they specified 0 in which case, impose no limit here
1465
1465
    try:
1466
 
        return int(os.environ['BZR_COLUMNS'])
 
1466
        width = int(os.environ['BZR_COLUMNS'])
1467
1467
    except (KeyError, ValueError):
1468
 
        pass
 
1468
        width = None
 
1469
    if width is not None:
 
1470
        if width > 0:
 
1471
            return width
 
1472
        else:
 
1473
            return None
1469
1474
 
1470
1475
    isatty = getattr(sys.stdout, 'isatty', None)
1471
1476
    if isatty is None or not isatty():
1875
1880
        s = os.stat(src)
1876
1881
        chown(dst, s.st_uid, s.st_gid)
1877
1882
    except OSError, e:
1878
 
        trace.warning("Unable to copy ownership from '%s' to '%s': IOError: %s." % (src, dst, e))
 
1883
        trace.warning(
 
1884
            'Unable to copy ownership from "%s" to "%s". '
 
1885
            'You may want to set it manually.', src, dst)
 
1886
        trace.log_exception_quietly()
1879
1887
 
1880
1888
 
1881
1889
def path_prefix_key(path):
1993
2001
# data at once.
1994
2002
MAX_SOCKET_CHUNK = 64 * 1024
1995
2003
 
 
2004
_end_of_stream_errors = [errno.ECONNRESET]
 
2005
for _eno in ['WSAECONNRESET', 'WSAECONNABORTED']:
 
2006
    _eno = getattr(errno, _eno, None)
 
2007
    if _eno is not None:
 
2008
        _end_of_stream_errors.append(_eno)
 
2009
del _eno
 
2010
 
 
2011
 
1996
2012
def read_bytes_from_socket(sock, report_activity=None,
1997
2013
        max_read_size=MAX_SOCKET_CHUNK):
1998
2014
    """Read up to max_read_size of bytes from sock and notify of progress.
2006
2022
            bytes = sock.recv(max_read_size)
2007
2023
        except socket.error, e:
2008
2024
            eno = e.args[0]
2009
 
            if eno == getattr(errno, "WSAECONNRESET", errno.ECONNRESET):
 
2025
            if eno in _end_of_stream_errors:
2010
2026
                # The connection was closed by the other side.  Callers expect
2011
2027
                # an empty string to signal end-of-stream.
2012
2028
                return ""
2354
2370
        raise errors.BzrError("Can't decode username as %s." % \
2355
2371
                user_encoding)
2356
2372
    return username
 
2373
 
 
2374
 
 
2375
def available_backup_name(base, exists):
 
2376
    """Find a non-existing backup file name.
 
2377
 
 
2378
    This will *not* create anything, this only return a 'free' entry.  This
 
2379
    should be used for checking names in a directory below a locked
 
2380
    tree/branch/repo to avoid race conditions. This is LBYL (Look Before You
 
2381
    Leap) and generally discouraged.
 
2382
 
 
2383
    :param base: The base name.
 
2384
 
 
2385
    :param exists: A callable returning True if the path parameter exists.
 
2386
    """
 
2387
    counter = 1
 
2388
    name = "%s.~%d~" % (base, counter)
 
2389
    while exists(name):
 
2390
        counter += 1
 
2391
        name = "%s.~%d~" % (base, counter)
 
2392
    return name
 
2393
 
 
2394
 
 
2395
def set_fd_cloexec(fd):
 
2396
    """Set a Unix file descriptor's FD_CLOEXEC flag.  Do nothing if platform
 
2397
    support for this is not available.
 
2398
    """
 
2399
    try:
 
2400
        import fcntl
 
2401
        old = fcntl.fcntl(fd, fcntl.F_GETFD)
 
2402
        fcntl.fcntl(fd, fcntl.F_SETFD, old | fcntl.FD_CLOEXEC)
 
2403
    except (ImportError, AttributeError):
 
2404
        # Either the fcntl module or specific constants are not present
 
2405
        pass
 
2406
 
 
2407
 
 
2408
def find_executable_on_path(name):
 
2409
    """Finds an executable on the PATH.
 
2410
    
 
2411
    On Windows, this will try to append each extension in the PATHEXT
 
2412
    environment variable to the name, if it cannot be found with the name
 
2413
    as given.
 
2414
    
 
2415
    :param name: The base name of the executable.
 
2416
    :return: The path to the executable found or None.
 
2417
    """
 
2418
    path = os.environ.get('PATH')
 
2419
    if path is None:
 
2420
        return None
 
2421
    path = path.split(os.pathsep)
 
2422
    if sys.platform == 'win32':
 
2423
        exts = os.environ.get('PATHEXT', '').split(os.pathsep)
 
2424
        exts = [ext.lower() for ext in exts]
 
2425
        base, ext = os.path.splitext(name)
 
2426
        if ext != '':
 
2427
            if ext.lower() not in exts:
 
2428
                return None
 
2429
            name = base
 
2430
            exts = [ext]
 
2431
    else:
 
2432
        exts = ['']
 
2433
    for ext in exts:
 
2434
        for d in path:
 
2435
            f = os.path.join(d, name) + ext
 
2436
            if os.access(f, os.X_OK):
 
2437
                return f
 
2438
    return None