77
78
O_BINARY = getattr(os, 'O_BINARY', 0)
81
def get_unicode_argv():
83
user_encoding = get_user_encoding()
84
return [a.decode(user_encoding) for a in sys.argv[1:]]
85
except UnicodeDecodeError:
86
raise errors.BzrError(("Parameter '%r' is unsupported by the current "
80
90
def make_readonly(filename):
81
91
"""Make a filename read-only."""
82
92
mod = os.lstat(filename).st_mode
98
108
:param paths: A container (and hence not None) of paths.
99
109
:return: A set of paths sufficient to include everything in paths via
100
is_inside_any, drawn from the paths parameter.
110
is_inside, drawn from the paths parameter.
105
other_paths = paths.difference([path])
106
if not is_inside_any(other_paths, path):
107
# this is a top level path, we must check it.
108
search_paths.add(path)
116
return path.split('/')
117
sorted_paths = sorted(list(paths), key=sort_key)
119
search_paths = [sorted_paths[0]]
120
for path in sorted_paths[1:]:
121
if not is_inside(search_paths[-1], path):
122
# This path is unique, add it
123
search_paths.append(path)
125
return set(search_paths)
384
400
def rmtree(path, ignore_errors=False, onerror=_win32_delete_readonly):
385
401
"""Replacer for shutil.rmtree: could remove readonly dirs/files"""
386
402
return shutil.rmtree(path, ignore_errors, onerror)
404
f = win32utils.get_unicode_argv # special function or None
387
408
elif sys.platform == 'darwin':
388
409
getcwd = _mac_getcwd
701
722
_format_date(t, offset, timezone, date_fmt, show_offset)
702
723
date_str = time.strftime(date_fmt, tt)
703
724
if not isinstance(date_str, unicode):
704
date_str = date_str.decode(bzrlib.user_encoding, 'replace')
725
date_str = date_str.decode(get_user_encoding(), 'replace')
705
726
return date_str + offset_str
707
728
def _format_date(t, offset, timezone, date_fmt, show_offset):
847
868
return pathjoin(*p)
871
def parent_directories(filename):
872
"""Return the list of parent directories, deepest first.
874
For example, parent_directories("a/b/c") -> ["a/b", "a"].
877
parts = splitpath(dirname(filename))
879
parents.append(joinpath(parts))
851
885
from bzrlib._chunks_to_lines_pyx import chunks_to_lines
852
886
except ImportError:
925
959
and sys.platform not in ('cygwin', 'win32'))
962
def readlink(abspath):
963
"""Return a string representing the path to which the symbolic link points.
965
:param abspath: The link absolute unicode path.
967
This his guaranteed to return the symbolic link in unicode in all python
970
link = abspath.encode(_fs_enc)
971
target = os.readlink(link)
972
target = target.decode(_fs_enc)
928
976
def contains_whitespace(s):
929
977
"""True if there are any whitespace characters in s."""
930
978
# string.whitespace can include '\xa0' in certain locales, because it is
1392
1440
# for win98 anyway.
1394
1442
from bzrlib._walkdirs_win32 import Win32ReadDir
1396
_selected_dir_reader = UnicodeDirReader()
1398
1443
_selected_dir_reader = Win32ReadDir()
1399
elif fs_encoding not in ('UTF-8', 'US-ASCII', 'ANSI_X3.4-1968'):
1446
elif fs_encoding in ('UTF-8', 'US-ASCII', 'ANSI_X3.4-1968'):
1400
1447
# ANSI_X3.4-1968 is a form of ASCII
1401
_selected_dir_reader = UnicodeDirReader()
1404
1449
from bzrlib._readdir_pyx import UTF8DirReader
1406
# No optimised code path
1407
_selected_dir_reader = UnicodeDirReader()
1409
1450
_selected_dir_reader = UTF8DirReader()
1454
if _selected_dir_reader is None:
1455
# Fallback to the python version
1456
_selected_dir_reader = UnicodeDirReader()
1410
1458
# 0 - relpath, 1- basename, 2- kind, 3- stat, 4-toppath
1411
1459
# But we don't actually uses 1-3 in pending, so set them to None
1412
1460
pending = [[_selected_dir_reader.top_prefix_to_starting_dir(top, prefix)]]
1743
1791
def re_compile_checked(re_string, flags=0, where=""):
1744
1792
"""Return a compiled re, or raise a sensible error.
1746
1794
This should only be used when compiling user-supplied REs.
1748
1796
:param re_string: Text form of regular expression.
1749
1797
:param flags: eg re.IGNORECASE
1750
:param where: Message explaining to the user the context where
1798
:param where: Message explaining to the user the context where
1751
1799
it occurred, eg 'log search filter'.
1753
1801
# from https://bugs.launchpad.net/bzr/+bug/251352
1780
1828
termios.tcsetattr(fd, termios.TCSADRAIN, settings)
1832
if sys.platform == 'linux2':
1833
def _local_concurrency():
1835
prefix = 'processor'
1836
for line in file('/proc/cpuinfo', 'rb'):
1837
if line.startswith(prefix):
1838
concurrency = int(line[line.find(':')+1:]) + 1
1840
elif sys.platform == 'darwin':
1841
def _local_concurrency():
1842
return subprocess.Popen(['sysctl', '-n', 'hw.availcpu'],
1843
stdout=subprocess.PIPE).communicate()[0]
1844
elif sys.platform[0:7] == 'freebsd':
1845
def _local_concurrency():
1846
return subprocess.Popen(['sysctl', '-n', 'hw.ncpu'],
1847
stdout=subprocess.PIPE).communicate()[0]
1848
elif sys.platform == 'sunos5':
1849
def _local_concurrency():
1850
return subprocess.Popen(['psrinfo', '-p',],
1851
stdout=subprocess.PIPE).communicate()[0]
1852
elif sys.platform == "win32":
1853
def _local_concurrency():
1854
# This appears to return the number of cores.
1855
return os.environ.get('NUMBER_OF_PROCESSORS')
1857
def _local_concurrency():
1862
_cached_local_concurrency = None
1864
def local_concurrency(use_cache=True):
1865
"""Return how many processes can be run concurrently.
1867
Rely on platform specific implementations and default to 1 (one) if
1868
anything goes wrong.
1870
global _cached_local_concurrency
1871
if _cached_local_concurrency is not None and use_cache:
1872
return _cached_local_concurrency
1875
concurrency = _local_concurrency()
1876
except (OSError, IOError):
1879
concurrency = int(concurrency)
1880
except (TypeError, ValueError):
1883
_cached_concurrency = concurrency