~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/osutils.py

  • Committer: Martin
  • Date: 2010-05-16 15:18:43 UTC
  • mfrom: (5235 +trunk)
  • mto: This revision was merged to the branch mainline in revision 5239.
  • Revision ID: gzlist@googlemail.com-20100516151843-lu53u7caehm3ie3i
Merge bzr.dev to resolve conflicts in NEWS and _chk_map_pyx

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
 
17
import errno
17
18
import os
18
19
import re
19
20
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)
 
21
from stat import S_ISREG, S_ISDIR, S_ISLNK, ST_MODE, ST_SIZE
22
22
import sys
23
23
import time
24
24
import codecs
25
 
import warnings
26
25
 
27
26
from bzrlib.lazy_import import lazy_import
28
27
lazy_import(globals(), """
29
28
from datetime import datetime
30
 
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
1132
1130
 
1133
1131
 
1134
1132
def relpath(base, path):
1135
 
    """Return path relative to base, or raise exception.
 
1133
    """Return path relative to base, or raise PathNotChild exception.
1136
1134
 
1137
1135
    The path may be either an absolute path or a path relative to the
1138
1136
    current working directory.
1140
1138
    os.path.commonprefix (python2.4) has a bad bug that it works just
1141
1139
    on string prefixes, assuming that '/u' is a prefix of '/u2'.  This
1142
1140
    avoids that problem.
 
1141
 
 
1142
    NOTE: `base` should not have a trailing slash otherwise you'll get
 
1143
    PathNotChild exceptions regardless of `path`.
1143
1144
    """
1144
1145
 
1145
1146
    if len(base) < MIN_ABS_PATHLENGTH:
1366
1367
        platform or Python version.
1367
1368
    """
1368
1369
    try:
 
1370
        import signal
1369
1371
        siginterrupt = signal.siginterrupt
 
1372
    except ImportError:
 
1373
        # This python implementation doesn't provide signal support, hence no
 
1374
        # handler exists
 
1375
        return None
1370
1376
    except AttributeError:
1371
1377
        # siginterrupt doesn't exist on this platform, or for this version
1372
1378
        # of Python.
1483
1489
 
1484
1490
 
1485
1491
_registered_sigwinch = False
1486
 
 
1487
1492
def watch_sigwinch():
1488
 
    """Register for SIGWINCH, once and only once."""
 
1493
    """Register for SIGWINCH, once and only once.
 
1494
 
 
1495
    Do nothing if the signal module is not available.
 
1496
    """
1489
1497
    global _registered_sigwinch
1490
1498
    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
 
1499
        try:
 
1500
            import signal
 
1501
            if getattr(signal, "SIGWINCH", None) is not None:
 
1502
                set_signal_handler(signal.SIGWINCH, _terminal_size_changed)
 
1503
        except ImportError:
 
1504
            # python doesn't provide signal support, nothing we can do about it
1495
1505
            pass
1496
 
        else:
1497
 
            set_signal_handler(signal.SIGWINCH, _terminal_size_changed)
1498
1506
        _registered_sigwinch = True
1499
1507
 
1500
1508
 
1821
1829
            real_handlers[kind](abspath, relpath)
1822
1830
 
1823
1831
 
1824
 
def copy_ownership(dst, src=None):
 
1832
def copy_ownership_from_path(dst, src=None):
1825
1833
    """Copy usr/grp ownership from src file/dir to dst file/dir.
1826
1834
 
1827
1835
    If src is None, the containing directory is used as source. If chown
1843
1851
        trace.warning("Unable to copy ownership from '%s' to '%s': IOError: %s." % (src, dst, e))
1844
1852
 
1845
1853
 
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
1854
def path_prefix_key(path):
1871
1855
    """Generate a prefix-order path key for path.
1872
1856
 
2301
2285
        return os.fdopen(os.open(filename, flags), mode, bufsize)
2302
2286
else:
2303
2287
    open_file = open
 
2288
 
 
2289
 
 
2290
def getuser_unicode():
 
2291
    """Return the username as unicode.
 
2292
    """
 
2293
    try:
 
2294
        user_encoding = get_user_encoding()
 
2295
        username = getpass.getuser().decode(user_encoding)
 
2296
    except UnicodeDecodeError:
 
2297
        raise errors.BzrError("Can't decode username as %s." % \
 
2298
                user_encoding)
 
2299
    return username