1470
1462
# a similar effect.
1472
1464
# If BZR_COLUMNS is set, take it, user is always right
1473
# Except if they specified 0 in which case, impose no limit here
1475
width = int(os.environ['BZR_COLUMNS'])
1466
return int(os.environ['BZR_COLUMNS'])
1476
1467
except (KeyError, ValueError):
1478
if width is not None:
1484
1470
isatty = getattr(sys.stdout, 'isatty', None)
1485
1471
if isatty is None or not isatty():
2010
1993
# data at once.
2011
1994
MAX_SOCKET_CHUNK = 64 * 1024
2013
_end_of_stream_errors = [errno.ECONNRESET]
2014
for _eno in ['WSAECONNRESET', 'WSAECONNABORTED']:
2015
_eno = getattr(errno, _eno, None)
2016
if _eno is not None:
2017
_end_of_stream_errors.append(_eno)
2021
1996
def read_bytes_from_socket(sock, report_activity=None,
2022
1997
max_read_size=MAX_SOCKET_CHUNK):
2023
1998
"""Read up to max_read_size of bytes from sock and notify of progress.
2252
2227
termios.tcsetattr(fd, termios.TCSADRAIN, settings)
2255
2231
if sys.platform == 'linux2':
2256
2232
def _local_concurrency():
2258
return os.sysconf('SC_NPROCESSORS_ONLN')
2259
except (ValueError, OSError, AttributeError):
2234
prefix = 'processor'
2235
for line in file('/proc/cpuinfo', 'rb'):
2236
if line.startswith(prefix):
2237
concurrency = int(line[line.find(':')+1:]) + 1
2261
2239
elif sys.platform == 'darwin':
2262
2240
def _local_concurrency():
2263
2241
return subprocess.Popen(['sysctl', '-n', 'hw.availcpu'],
2264
2242
stdout=subprocess.PIPE).communicate()[0]
2265
elif "bsd" in sys.platform:
2243
elif sys.platform[0:7] == 'freebsd':
2266
2244
def _local_concurrency():
2267
2245
return subprocess.Popen(['sysctl', '-n', 'hw.ncpu'],
2268
2246
stdout=subprocess.PIPE).communicate()[0]
2296
2274
concurrency = os.environ.get('BZR_CONCURRENCY', None)
2297
2275
if concurrency is None:
2299
import multiprocessing
2301
# multiprocessing is only available on Python >= 2.6
2303
concurrency = _local_concurrency()
2304
except (OSError, IOError):
2307
concurrency = multiprocessing.cpu_count()
2277
concurrency = _local_concurrency()
2278
except (OSError, IOError):
2309
2281
concurrency = int(concurrency)
2310
2282
except (TypeError, ValueError):
2381
2353
except UnicodeDecodeError:
2382
2354
raise errors.BzrError("Can't decode username as %s." % \
2384
except ImportError, e:
2385
if sys.platform != 'win32':
2387
if str(e) != 'No module named pwd':
2389
# https://bugs.launchpad.net/bzr/+bug/660174
2390
# getpass.getuser() is unable to return username on Windows
2391
# if there is no USERNAME environment variable set.
2392
# That could be true if bzr is running as a service,
2393
# e.g. running `bzr serve` as a service on Windows.
2394
# We should not fail with traceback in this case.
2395
username = u'UNKNOWN'
2396
2356
return username
2399
def available_backup_name(base, exists):
2400
"""Find a non-existing backup file name.
2402
This will *not* create anything, this only return a 'free' entry. This
2403
should be used for checking names in a directory below a locked
2404
tree/branch/repo to avoid race conditions. This is LBYL (Look Before You
2405
Leap) and generally discouraged.
2407
:param base: The base name.
2409
:param exists: A callable returning True if the path parameter exists.
2412
name = "%s.~%d~" % (base, counter)
2415
name = "%s.~%d~" % (base, counter)
2419
def set_fd_cloexec(fd):
2420
"""Set a Unix file descriptor's FD_CLOEXEC flag. Do nothing if platform
2421
support for this is not available.
2425
old = fcntl.fcntl(fd, fcntl.F_GETFD)
2426
fcntl.fcntl(fd, fcntl.F_SETFD, old | fcntl.FD_CLOEXEC)
2427
except (ImportError, AttributeError):
2428
# Either the fcntl module or specific constants are not present
2432
def find_executable_on_path(name):
2433
"""Finds an executable on the PATH.
2435
On Windows, this will try to append each extension in the PATHEXT
2436
environment variable to the name, if it cannot be found with the name
2439
:param name: The base name of the executable.
2440
:return: The path to the executable found or None.
2442
path = os.environ.get('PATH')
2445
path = path.split(os.pathsep)
2446
if sys.platform == 'win32':
2447
exts = os.environ.get('PATHEXT', '').split(os.pathsep)
2448
exts = [ext.lower() for ext in exts]
2449
base, ext = os.path.splitext(name)
2451
if ext.lower() not in exts:
2459
f = os.path.join(d, name) + ext
2460
if os.access(f, os.X_OK):
2465
def _posix_is_local_pid_dead(pid):
2466
"""True if pid doesn't correspond to live process on this machine"""
2468
# Special meaning of unix kill: just check if it's there.
2471
if e.errno == errno.ESRCH:
2472
# On this machine, and really not found: as sure as we can be
2475
elif e.errno == errno.EPERM:
2476
# exists, though not ours
2479
mutter("os.kill(%d, 0) failed: %s" % (pid, e))
2480
# Don't really know.
2483
# Exists and our process: not dead.
2486
if sys.platform == "win32":
2487
is_local_pid_dead = win32utils.is_local_pid_dead
2489
is_local_pid_dead = _posix_is_local_pid_dead