~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/osutils.py

  • Committer: John Arbash Meinel
  • Date: 2010-11-05 20:54:32 UTC
  • mfrom: (5526 +trunk)
  • mto: This revision was merged to the branch mainline in revision 5527.
  • Revision ID: john@arbash-meinel.com-20101105205432-rmyozu8sthyhmri8
Merge bzr.dev to resolve bzr-2.3.txt (aka NEWS)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2011 Canonical Ltd
 
1
# Copyright (C) 2005-2010 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
96
96
        user_encoding = get_user_encoding()
97
97
        return [a.decode(user_encoding) for a in sys.argv[1:]]
98
98
    except UnicodeDecodeError:
99
 
        raise errors.BzrError("Parameter %r encoding is unsupported by %s "
100
 
            "application locale." % (a, user_encoding))
 
99
        raise errors.BzrError(("Parameter '%r' is unsupported by the current "
 
100
                                                            "encoding." % a))
101
101
 
102
102
 
103
103
def make_readonly(filename):
392
392
# These were already lazily imported into local scope
393
393
# mkdtemp = tempfile.mkdtemp
394
394
# rmtree = shutil.rmtree
395
 
lstat = os.lstat
396
 
fstat = os.fstat
397
 
 
398
 
def wrap_stat(st):
399
 
    return st
400
 
 
401
395
 
402
396
MIN_ABS_PATHLENGTH = 1
403
397
 
413
407
    getcwd = _win32_getcwd
414
408
    mkdtemp = _win32_mkdtemp
415
409
    rename = _win32_rename
416
 
    try:
417
 
        from bzrlib import _walkdirs_win32
418
 
    except ImportError:
419
 
        pass
420
 
    else:
421
 
        lstat = _walkdirs_win32.lstat
422
 
        fstat = _walkdirs_win32.fstat
423
 
        wrap_stat = _walkdirs_win32.wrap_stat
424
410
 
425
411
    MIN_ABS_PATHLENGTH = 3
426
412
 
981
967
    # they tend to happen very early in startup when we can't check config
982
968
    # files etc, and also we want to report all failures but not spam the user
983
969
    # with 10 warnings.
 
970
    from bzrlib import trace
984
971
    exception_str = str(exception)
985
972
    if exception_str not in _extension_load_failures:
986
973
        trace.mutter("failed to load compiled extension: %s" % exception_str)
1475
1462
    # a similar effect.
1476
1463
 
1477
1464
    # If BZR_COLUMNS is set, take it, user is always right
1478
 
    # Except if they specified 0 in which case, impose no limit here
1479
1465
    try:
1480
 
        width = int(os.environ['BZR_COLUMNS'])
 
1466
        return int(os.environ['BZR_COLUMNS'])
1481
1467
    except (KeyError, ValueError):
1482
 
        width = None
1483
 
    if width is not None:
1484
 
        if width > 0:
1485
 
            return width
1486
 
        else:
1487
 
            return None
 
1468
        pass
1488
1469
 
1489
1470
    isatty = getattr(sys.stdout, 'isatty', None)
1490
1471
    if isatty is None or not isatty():
1894
1875
        s = os.stat(src)
1895
1876
        chown(dst, s.st_uid, s.st_gid)
1896
1877
    except OSError, e:
1897
 
        trace.warning(
1898
 
            'Unable to copy ownership from "%s" to "%s". '
1899
 
            'You may want to set it manually.', src, dst)
1900
 
        trace.log_exception_quietly()
 
1878
        trace.warning("Unable to copy ownership from '%s' to '%s': IOError: %s." % (src, dst, e))
1901
1879
 
1902
1880
 
1903
1881
def path_prefix_key(path):
2015
1993
# data at once.
2016
1994
MAX_SOCKET_CHUNK = 64 * 1024
2017
1995
 
2018
 
_end_of_stream_errors = [errno.ECONNRESET]
2019
 
for _eno in ['WSAECONNRESET', 'WSAECONNABORTED']:
2020
 
    _eno = getattr(errno, _eno, None)
2021
 
    if _eno is not None:
2022
 
        _end_of_stream_errors.append(_eno)
2023
 
del _eno
2024
 
 
2025
 
 
2026
1996
def read_bytes_from_socket(sock, report_activity=None,
2027
1997
        max_read_size=MAX_SOCKET_CHUNK):
2028
1998
    """Read up to max_read_size of bytes from sock and notify of progress.
2036
2006
            bytes = sock.recv(max_read_size)
2037
2007
        except socket.error, e:
2038
2008
            eno = e.args[0]
2039
 
            if eno in _end_of_stream_errors:
 
2009
            if eno == getattr(errno, "WSAECONNRESET", errno.ECONNRESET):
2040
2010
                # The connection was closed by the other side.  Callers expect
2041
2011
                # an empty string to signal end-of-stream.
2042
2012
                return ""
2257
2227
            termios.tcsetattr(fd, termios.TCSADRAIN, settings)
2258
2228
        return ch
2259
2229
 
 
2230
 
2260
2231
if sys.platform == 'linux2':
2261
2232
    def _local_concurrency():
2262
 
        try:
2263
 
            return os.sysconf('SC_NPROCESSORS_ONLN')
2264
 
        except (ValueError, OSError, AttributeError):
2265
 
            return None
 
2233
        concurrency = None
 
2234
        prefix = 'processor'
 
2235
        for line in file('/proc/cpuinfo', 'rb'):
 
2236
            if line.startswith(prefix):
 
2237
                concurrency = int(line[line.find(':')+1:]) + 1
 
2238
        return concurrency
2266
2239
elif sys.platform == 'darwin':
2267
2240
    def _local_concurrency():
2268
2241
        return subprocess.Popen(['sysctl', '-n', 'hw.availcpu'],
2269
2242
                                stdout=subprocess.PIPE).communicate()[0]
2270
 
elif "bsd" in sys.platform:
 
2243
elif sys.platform[0:7] == 'freebsd':
2271
2244
    def _local_concurrency():
2272
2245
        return subprocess.Popen(['sysctl', '-n', 'hw.ncpu'],
2273
2246
                                stdout=subprocess.PIPE).communicate()[0]
2301
2274
    concurrency = os.environ.get('BZR_CONCURRENCY', None)
2302
2275
    if concurrency is None:
2303
2276
        try:
2304
 
            import multiprocessing
2305
 
        except ImportError:
2306
 
            # multiprocessing is only available on Python >= 2.6
2307
 
            try:
2308
 
                concurrency = _local_concurrency()
2309
 
            except (OSError, IOError):
2310
 
                pass
2311
 
        else:
2312
 
            concurrency = multiprocessing.cpu_count()
 
2277
            concurrency = _local_concurrency()
 
2278
        except (OSError, IOError):
 
2279
            pass
2313
2280
    try:
2314
2281
        concurrency = int(concurrency)
2315
2282
    except (TypeError, ValueError):
2407
2374
        counter += 1
2408
2375
        name = "%s.~%d~" % (base, counter)
2409
2376
    return name
2410
 
 
2411
 
 
2412
 
def set_fd_cloexec(fd):
2413
 
    """Set a Unix file descriptor's FD_CLOEXEC flag.  Do nothing if platform
2414
 
    support for this is not available.
2415
 
    """
2416
 
    try:
2417
 
        import fcntl
2418
 
        old = fcntl.fcntl(fd, fcntl.F_GETFD)
2419
 
        fcntl.fcntl(fd, fcntl.F_SETFD, old | fcntl.FD_CLOEXEC)
2420
 
    except (ImportError, AttributeError):
2421
 
        # Either the fcntl module or specific constants are not present
2422
 
        pass
2423
 
 
2424
 
 
2425
 
def find_executable_on_path(name):
2426
 
    """Finds an executable on the PATH.
2427
 
    
2428
 
    On Windows, this will try to append each extension in the PATHEXT
2429
 
    environment variable to the name, if it cannot be found with the name
2430
 
    as given.
2431
 
    
2432
 
    :param name: The base name of the executable.
2433
 
    :return: The path to the executable found or None.
2434
 
    """
2435
 
    path = os.environ.get('PATH')
2436
 
    if path is None:
2437
 
        return None
2438
 
    path = path.split(os.pathsep)
2439
 
    if sys.platform == 'win32':
2440
 
        exts = os.environ.get('PATHEXT', '').split(os.pathsep)
2441
 
        exts = [ext.lower() for ext in exts]
2442
 
        base, ext = os.path.splitext(name)
2443
 
        if ext != '':
2444
 
            if ext.lower() not in exts:
2445
 
                return None
2446
 
            name = base
2447
 
            exts = [ext]
2448
 
    else:
2449
 
        exts = ['']
2450
 
    for ext in exts:
2451
 
        for d in path:
2452
 
            f = os.path.join(d, name) + ext
2453
 
            if os.access(f, os.X_OK):
2454
 
                return f
2455
 
    return None