/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: Robert Collins
  • Date: 2010-05-06 11:08:10 UTC
  • mto: This revision was merged to the branch mainline in revision 5223.
  • Revision ID: robertc@robertcollins.net-20100506110810-h3j07fh5gmw54s25
Cleaner matcher matching revised unlocking protocol.

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