~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/osutils.py

Abbreviate pack_stat struct format to '>6L'

Show diffs side-by-side

added added

removed removed

Lines of Context:
42
42
 
43
43
from bzrlib import (
44
44
    cache_utf8,
 
45
    config,
45
46
    errors,
46
47
    trace,
47
48
    win32utils,
48
49
    )
 
50
from bzrlib.i18n import gettext
49
51
""")
50
52
 
51
53
from bzrlib.symbol_versioning import (
53
55
    deprecated_in,
54
56
    )
55
57
 
56
 
# sha and md5 modules are deprecated in python2.6 but hashlib is available as
57
 
# of 2.5
58
 
if sys.version_info < (2, 5):
59
 
    import md5 as _mod_md5
60
 
    md5 = _mod_md5.new
61
 
    import sha as _mod_sha
62
 
    sha = _mod_sha.new
63
 
else:
64
 
    from hashlib import (
65
 
        md5,
66
 
        sha1 as sha,
67
 
        )
 
58
from hashlib import (
 
59
    md5,
 
60
    sha1 as sha,
 
61
    )
68
62
 
69
63
 
70
64
import bzrlib
96
90
        user_encoding = get_user_encoding()
97
91
        return [a.decode(user_encoding) for a in sys.argv[1:]]
98
92
    except UnicodeDecodeError:
99
 
        raise errors.BzrError("Parameter %r encoding is unsupported by %s "
100
 
            "application locale." % (a, user_encoding))
 
93
        raise errors.BzrError(gettext("Parameter {0!r} encoding is unsupported by {1} "
 
94
            "application locale.").format(a, user_encoding))
101
95
 
102
96
 
103
97
def make_readonly(filename):
197
191
            if e.errno == errno.ENOENT:
198
192
                return False;
199
193
            else:
200
 
                raise errors.BzrError("lstat/stat of (%r): %r" % (f, e))
 
194
                raise errors.BzrError(gettext("lstat/stat of ({0!r}): {1!r}").format(f, e))
201
195
 
202
196
 
203
197
def fancy_rename(old, new, rename_func, unlink_func):
269
263
            else:
270
264
                rename_func(tmp_name, new)
271
265
    if failure_exc is not None:
272
 
        raise failure_exc[0], failure_exc[1], failure_exc[2]
 
266
        try:
 
267
            raise failure_exc[0], failure_exc[1], failure_exc[2]
 
268
        finally:
 
269
            del failure_exc
273
270
 
274
271
 
275
272
# In Python 2.4.2 and older, os.path.abspath and os.path.realpath
929
926
    rps = []
930
927
    for f in ps:
931
928
        if f == '..':
932
 
            raise errors.BzrError("sorry, %r not allowed in path" % f)
 
929
            raise errors.BzrError(gettext("sorry, %r not allowed in path") % f)
933
930
        elif (f == '.') or (f == ''):
934
931
            pass
935
932
        else:
940
937
def joinpath(p):
941
938
    for f in p:
942
939
        if (f == '..') or (f is None) or (f == ''):
943
 
            raise errors.BzrError("sorry, %r not allowed in path" % f)
 
940
            raise errors.BzrError(gettext("sorry, %r not allowed in path") % f)
944
941
    return pathjoin(*p)
945
942
 
946
943
 
990
987
def report_extension_load_failures():
991
988
    if not _extension_load_failures:
992
989
        return
993
 
    from bzrlib.config import GlobalConfig
994
 
    if GlobalConfig().get_user_option_as_bool('ignore_missing_extensions'):
 
990
    if config.GlobalStack().get('ignore_missing_extensions'):
995
991
        return
996
992
    # the warnings framework should by default show this only once
997
993
    from bzrlib.trace import warning
1159
1155
 
1160
1156
    if len(base) < MIN_ABS_PATHLENGTH:
1161
1157
        # must have space for e.g. a drive letter
1162
 
        raise ValueError('%r is too short to calculate a relative path'
 
1158
        raise ValueError(gettext('%r is too short to calculate a relative path')
1163
1159
            % (base,))
1164
1160
 
1165
1161
    rp = abspath(path)
2183
2179
    return file_kind_from_stat_mode(mode)
2184
2180
file_kind_from_stat_mode = file_kind_from_stat_mode_thunk
2185
2181
 
2186
 
 
2187
 
def file_kind(f, _lstat=os.lstat):
 
2182
def file_stat(f, _lstat=os.lstat):
2188
2183
    try:
2189
 
        return file_kind_from_stat_mode(_lstat(f).st_mode)
 
2184
        # XXX cache?
 
2185
        return _lstat(f)
2190
2186
    except OSError, e:
2191
2187
        if getattr(e, 'errno', None) in (errno.ENOENT, errno.ENOTDIR):
2192
2188
            raise errors.NoSuchFile(f)
2193
2189
        raise
2194
2190
 
 
2191
def file_kind(f, _lstat=os.lstat):
 
2192
    stat_value = file_stat(f, _lstat)
 
2193
    return file_kind_from_stat_mode(stat_value.st_mode)
2195
2194
 
2196
2195
def until_no_eintr(f, *a, **kw):
2197
2196
    """Run f(*a, **kw), retrying if an EINTR error occurs.
2257
2256
            termios.tcsetattr(fd, termios.TCSADRAIN, settings)
2258
2257
        return ch
2259
2258
 
2260
 
if sys.platform == 'linux2':
 
2259
if sys.platform.startswith('linux'):
2261
2260
    def _local_concurrency():
2262
2261
        try:
2263
2262
            return os.sysconf('SC_NPROCESSORS_ONLN')
2386
2385
    except UnicodeDecodeError:
2387
2386
        raise errors.BzrError("Can't decode username as %s." % \
2388
2387
                user_encoding)
 
2388
    except ImportError, e:
 
2389
        if sys.platform != 'win32':
 
2390
            raise
 
2391
        if str(e) != 'No module named pwd':
 
2392
            raise
 
2393
        # https://bugs.launchpad.net/bzr/+bug/660174
 
2394
        # getpass.getuser() is unable to return username on Windows
 
2395
        # if there is no USERNAME environment variable set.
 
2396
        # That could be true if bzr is running as a service,
 
2397
        # e.g. running `bzr serve` as a service on Windows.
 
2398
        # We should not fail with traceback in this case.
 
2399
        username = u'UNKNOWN'
2389
2400
    return username
2390
2401
 
2391
2402
 
2453
2464
            if os.access(f, os.X_OK):
2454
2465
                return f
2455
2466
    return None
 
2467
 
 
2468
 
 
2469
def _posix_is_local_pid_dead(pid):
 
2470
    """True if pid doesn't correspond to live process on this machine"""
 
2471
    try:
 
2472
        # Special meaning of unix kill: just check if it's there.
 
2473
        os.kill(pid, 0)
 
2474
    except OSError, e:
 
2475
        if e.errno == errno.ESRCH:
 
2476
            # On this machine, and really not found: as sure as we can be
 
2477
            # that it's dead.
 
2478
            return True
 
2479
        elif e.errno == errno.EPERM:
 
2480
            # exists, though not ours
 
2481
            return False
 
2482
        else:
 
2483
            mutter("os.kill(%d, 0) failed: %s" % (pid, e))
 
2484
            # Don't really know.
 
2485
            return False
 
2486
    else:
 
2487
        # Exists and our process: not dead.
 
2488
        return False
 
2489
 
 
2490
if sys.platform == "win32":
 
2491
    is_local_pid_dead = win32utils.is_local_pid_dead
 
2492
else:
 
2493
    is_local_pid_dead = _posix_is_local_pid_dead
 
2494
 
 
2495
 
 
2496
def fdatasync(fileno):
 
2497
    """Flush file contents to disk if possible.
 
2498
    
 
2499
    :param fileno: Integer OS file handle.
 
2500
    :raises TransportNotPossible: If flushing to disk is not possible.
 
2501
    """
 
2502
    fn = getattr(os, 'fdatasync', getattr(os, 'fsync', None))
 
2503
    if fn is not None:
 
2504
        fn(fileno)