/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/osutils.py

  • Committer: Aaron Bentley
  • Date: 2010-05-10 11:34:20 UTC
  • mfrom: (5218 +trunk)
  • mto: This revision was merged to the branch mainline in revision 5221.
  • Revision ID: aaron@aaronbentley.com-20100510113420-toh2d5yioobb5uq1
Merged bzr.dev into transform-commit-full.

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
import os
18
18
import re
19
19
import stat
20
 
from stat import (S_ISREG, S_ISDIR, S_ISLNK, ST_MODE, ST_SIZE,
21
 
                  S_ISCHR, S_ISBLK, S_ISFIFO, S_ISSOCK)
 
20
from stat import S_ISREG, S_ISDIR, S_ISLNK, ST_MODE, ST_SIZE
22
21
import sys
23
22
import time
24
23
import codecs
25
 
import warnings
26
24
 
27
25
from bzrlib.lazy_import import lazy_import
28
26
lazy_import(globals(), """
29
27
from datetime import datetime
30
28
import errno
 
29
import getpass
31
30
from ntpath import (abspath as _nt_abspath,
32
31
                    join as _nt_join,
33
32
                    normpath as _nt_normpath,
39
38
from shutil import (
40
39
    rmtree,
41
40
    )
42
 
import signal
43
41
import socket
44
42
import subprocess
45
43
import tempfile
363
361
    return _win32_fixdrive(tempfile.mkdtemp(*args, **kwargs).replace('\\', '/'))
364
362
 
365
363
 
 
364
def _add_rename_error_details(e, old, new):
 
365
    new_e = OSError(e.errno, "failed to rename %s to %s: %s"
 
366
        % (old, new, e.strerror))
 
367
    new_e.filename = old
 
368
    new_e.to_filename = new
 
369
    return new_e
 
370
 
 
371
 
366
372
def _win32_rename(old, new):
367
373
    """We expect to be able to atomically replace 'new' with old.
368
374
 
370
376
    and then deleted.
371
377
    """
372
378
    try:
373
 
        fancy_rename(old, new, rename_func=os.rename, unlink_func=os.unlink)
 
379
        fancy_rename(old, new, rename_func=_wrapped_rename, unlink_func=os.unlink)
374
380
    except OSError, e:
375
381
        if e.errno in (errno.EPERM, errno.EACCES, errno.EBUSY, errno.EINVAL):
376
382
            # If we try to rename a non-existant file onto cwd, we get
381
387
        raise
382
388
 
383
389
 
 
390
def _wrapped_rename(old, new):
 
391
    """Rename a file or directory"""
 
392
    try:
 
393
        os.rename(old, new)
 
394
    except (IOError, OSError), e:
 
395
        # this is eventually called by all rename-like functions, so should 
 
396
        # catch all of them
 
397
        raise _add_rename_error_details(e, old, new)
 
398
 
 
399
 
384
400
def _mac_getcwd():
385
401
    return unicodedata.normalize('NFC', os.getcwdu())
386
402
 
391
407
realpath = _posix_realpath
392
408
pathjoin = os.path.join
393
409
normpath = os.path.normpath
 
410
rename = _wrapped_rename # overridden below on win32
394
411
getcwd = os.getcwdu
395
 
rename = os.rename
396
412
dirname = os.path.dirname
397
413
basename = os.path.basename
398
414
split = os.path.split
1132
1148
 
1133
1149
 
1134
1150
def relpath(base, path):
1135
 
    """Return path relative to base, or raise exception.
 
1151
    """Return path relative to base, or raise PathNotChild exception.
1136
1152
 
1137
1153
    The path may be either an absolute path or a path relative to the
1138
1154
    current working directory.
1140
1156
    os.path.commonprefix (python2.4) has a bad bug that it works just
1141
1157
    on string prefixes, assuming that '/u' is a prefix of '/u2'.  This
1142
1158
    avoids that problem.
 
1159
 
 
1160
    NOTE: `base` should not have a trailing slash otherwise you'll get
 
1161
    PathNotChild exceptions regardless of `path`.
1143
1162
    """
1144
1163
 
1145
1164
    if len(base) < MIN_ABS_PATHLENGTH:
1366
1385
        platform or Python version.
1367
1386
    """
1368
1387
    try:
 
1388
        import signal
1369
1389
        siginterrupt = signal.siginterrupt
 
1390
    except ImportError:
 
1391
        # This python implementation doesn't provide signal support, hence no
 
1392
        # handler exists
 
1393
        return None
1370
1394
    except AttributeError:
1371
1395
        # siginterrupt doesn't exist on this platform, or for this version
1372
1396
        # of Python.
1483
1507
 
1484
1508
 
1485
1509
_registered_sigwinch = False
1486
 
 
1487
1510
def watch_sigwinch():
1488
 
    """Register for SIGWINCH, once and only once."""
 
1511
    """Register for SIGWINCH, once and only once.
 
1512
 
 
1513
    Do nothing if the signal module is not available.
 
1514
    """
1489
1515
    global _registered_sigwinch
1490
1516
    if not _registered_sigwinch:
1491
 
        if sys.platform == 'win32':
1492
 
            # Martin (gz) mentioned WINDOW_BUFFER_SIZE_RECORD from
1493
 
            # ReadConsoleInput but I've no idea how to plug that in
1494
 
            # the current design -- vila 20091216
 
1517
        try:
 
1518
            import signal
 
1519
            if getattr(signal, "SIGWINCH", None) is not None:
 
1520
                set_signal_handler(signal.SIGWINCH, _terminal_size_changed)
 
1521
        except ImportError:
 
1522
            # python doesn't provide signal support, nothing we can do about it
1495
1523
            pass
1496
 
        else:
1497
 
            set_signal_handler(signal.SIGWINCH, _terminal_size_changed)
1498
1524
        _registered_sigwinch = True
1499
1525
 
1500
1526
 
1821
1847
            real_handlers[kind](abspath, relpath)
1822
1848
 
1823
1849
 
1824
 
def copy_ownership(dst, src=None):
 
1850
def copy_ownership_from_path(dst, src=None):
1825
1851
    """Copy usr/grp ownership from src file/dir to dst file/dir.
1826
1852
 
1827
1853
    If src is None, the containing directory is used as source. If chown
1843
1869
        trace.warning("Unable to copy ownership from '%s' to '%s': IOError: %s." % (src, dst, e))
1844
1870
 
1845
1871
 
1846
 
def mkdir_with_ownership(path, ownership_src=None):
1847
 
    """Create the directory 'path' with specified ownership.
1848
 
 
1849
 
    If ownership_src is given, copies (chown) usr/grp ownership
1850
 
    from 'ownership_src' to 'path'. If ownership_src is None, use the
1851
 
    containing dir ownership.
1852
 
    """
1853
 
    os.mkdir(path)
1854
 
    copy_ownership(path, ownership_src)
1855
 
 
1856
 
 
1857
 
def open_with_ownership(filename, mode='r', bufsize=-1, ownership_src=None):
1858
 
    """Open the file 'filename' with the specified ownership.
1859
 
 
1860
 
    If ownership_src is specified, copy usr/grp ownership from ownership_src
1861
 
    to filename. If ownership_src is None, copy ownership from containing
1862
 
    directory.
1863
 
    Returns the opened file object.
1864
 
    """
1865
 
    f = open(filename, mode, bufsize)
1866
 
    copy_ownership(filename, ownership_src)
1867
 
    return f
1868
 
 
1869
 
 
1870
1872
def path_prefix_key(path):
1871
1873
    """Generate a prefix-order path key for path.
1872
1874
 
2301
2303
        return os.fdopen(os.open(filename, flags), mode, bufsize)
2302
2304
else:
2303
2305
    open_file = open
 
2306
 
 
2307
 
 
2308
def getuser_unicode():
 
2309
    """Return the username as unicode.
 
2310
    """
 
2311
    try:
 
2312
        user_encoding = get_user_encoding()
 
2313
        username = getpass.getuser().decode(user_encoding)
 
2314
    except UnicodeDecodeError:
 
2315
        raise errors.BzrError("Can't decode username as %s." % \
 
2316
                user_encoding)
 
2317
    return username