~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/osutils.py

  • Committer: Martin Pool
  • Date: 2010-04-28 07:03:38 UTC
  • mfrom: (5188 +trunk)
  • mto: This revision was merged to the branch mainline in revision 5189.
  • Revision ID: mbp@sourcefrog.net-20100428070338-2af8y3takgfkrkyp
merge news

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
 
20
from stat import (S_ISREG, S_ISDIR, S_ISLNK, ST_MODE, ST_SIZE,
 
21
                  S_ISCHR, S_ISBLK, S_ISFIFO, S_ISSOCK)
21
22
import sys
22
23
import time
23
24
import codecs
 
25
import warnings
24
26
 
25
27
from bzrlib.lazy_import import lazy_import
26
28
lazy_import(globals(), """
360
362
    return _win32_fixdrive(tempfile.mkdtemp(*args, **kwargs).replace('\\', '/'))
361
363
 
362
364
 
363
 
def _add_rename_error_details(e, old, new):
364
 
    new_e = OSError(e.errno, "failed to rename %s to %s: %s"
365
 
        % (old, new, e.strerror))
366
 
    new_e.filename = old
367
 
    new_e.to_filename = new
368
 
    return new_e
369
 
 
370
 
 
371
365
def _win32_rename(old, new):
372
366
    """We expect to be able to atomically replace 'new' with old.
373
367
 
375
369
    and then deleted.
376
370
    """
377
371
    try:
378
 
        fancy_rename(old, new, rename_func=_wrapped_rename, unlink_func=os.unlink)
 
372
        fancy_rename(old, new, rename_func=os.rename, unlink_func=os.unlink)
379
373
    except OSError, e:
380
374
        if e.errno in (errno.EPERM, errno.EACCES, errno.EBUSY, errno.EINVAL):
381
375
            # If we try to rename a non-existant file onto cwd, we get
386
380
        raise
387
381
 
388
382
 
389
 
def _wrapped_rename(old, new):
390
 
    """Rename a file or directory"""
391
 
    try:
392
 
        os.rename(old, new)
393
 
    except (IOError, OSError), e:
394
 
        # this is eventually called by all rename-like functions, so should 
395
 
        # catch all of them
396
 
        raise _add_rename_error_details(e, old, new)
397
 
 
398
 
 
399
383
def _mac_getcwd():
400
384
    return unicodedata.normalize('NFC', os.getcwdu())
401
385
 
406
390
realpath = _posix_realpath
407
391
pathjoin = os.path.join
408
392
normpath = os.path.normpath
409
 
rename = _wrapped_rename # overridden below on win32
410
393
getcwd = os.getcwdu
 
394
rename = os.rename
411
395
dirname = os.path.dirname
412
396
basename = os.path.basename
413
397
split = os.path.split
1147
1131
 
1148
1132
 
1149
1133
def relpath(base, path):
1150
 
    """Return path relative to base, or raise PathNotChild exception.
 
1134
    """Return path relative to base, or raise exception.
1151
1135
 
1152
1136
    The path may be either an absolute path or a path relative to the
1153
1137
    current working directory.
1155
1139
    os.path.commonprefix (python2.4) has a bad bug that it works just
1156
1140
    on string prefixes, assuming that '/u' is a prefix of '/u2'.  This
1157
1141
    avoids that problem.
1158
 
 
1159
 
    NOTE: `base` should not have a trailing slash otherwise you'll get
1160
 
    PathNotChild exceptions regardless of `path`.
1161
1142
    """
1162
1143
 
1163
1144
    if len(base) < MIN_ABS_PATHLENGTH: