~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/osutils.py

(lifeless) Wrap os.rename to get better errors on failure. (Martin Pool)

Show diffs side-by-side

added added

removed removed

Lines of Context:
362
362
    return _win32_fixdrive(tempfile.mkdtemp(*args, **kwargs).replace('\\', '/'))
363
363
 
364
364
 
 
365
def _add_rename_error_details(e, old, new):
 
366
    new_e = OSError(e.errno, "failed to rename %s to %s: %s"
 
367
        % (old, new, e.strerror))
 
368
    new_e.filename = old
 
369
    new_e.to_filename = new
 
370
    return new_e
 
371
 
 
372
 
365
373
def _win32_rename(old, new):
366
374
    """We expect to be able to atomically replace 'new' with old.
367
375
 
369
377
    and then deleted.
370
378
    """
371
379
    try:
372
 
        fancy_rename(old, new, rename_func=os.rename, unlink_func=os.unlink)
 
380
        fancy_rename(old, new, rename_func=_wrapped_rename, unlink_func=os.unlink)
373
381
    except OSError, e:
374
382
        if e.errno in (errno.EPERM, errno.EACCES, errno.EBUSY, errno.EINVAL):
375
383
            # If we try to rename a non-existant file onto cwd, we get
380
388
        raise
381
389
 
382
390
 
 
391
def _wrapped_rename(old, new):
 
392
    """Rename a file or directory"""
 
393
    try:
 
394
        os.rename(old, new)
 
395
    except (IOError, OSError), e:
 
396
        # this is eventually called by all rename-like functions, so should 
 
397
        # catch all of them
 
398
        raise _add_rename_error_details(e, old, new)
 
399
 
 
400
 
383
401
def _mac_getcwd():
384
402
    return unicodedata.normalize('NFC', os.getcwdu())
385
403
 
390
408
realpath = _posix_realpath
391
409
pathjoin = os.path.join
392
410
normpath = os.path.normpath
 
411
rename = _wrapped_rename # overridden below on win32
393
412
getcwd = os.getcwdu
394
 
rename = os.rename
395
413
dirname = os.path.dirname
396
414
basename = os.path.basename
397
415
split = os.path.split