diff options
author | owsla <owsla@2b77aa54-bcbc-44c9-a7ec-4f6cf2b41109> | 2008-06-10 12:55:59 +0000 |
---|---|---|
committer | owsla <owsla@2b77aa54-bcbc-44c9-a7ec-4f6cf2b41109> | 2008-06-10 12:55:59 +0000 |
commit | fce09cb7e56fa39daaecce4ee320fffe2960d162 (patch) | |
tree | 5e9f7b94dc1cbe9bb03433cc3a1ac8ff74d23b72 /rdiff-backup/rdiff_backup/rpath.py | |
parent | 78436fc6a88a0d5c6d8bddc884b8a8814ac4466c (diff) | |
download | rdiff-backup-fce09cb7e56fa39daaecce4ee320fffe2960d162.tar.gz |
Do not use inode numbers on Windows and gracefully handle attempts to
rename over existing files on Windows. (Patch from Josh Nisly)
git-svn-id: http://svn.savannah.nongnu.org/svn/rdiff-backup/trunk@886 2b77aa54-bcbc-44c9-a7ec-4f6cf2b41109
Diffstat (limited to 'rdiff-backup/rdiff_backup/rpath.py')
-rw-r--r-- | rdiff-backup/rdiff_backup/rpath.py | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/rdiff-backup/rdiff_backup/rpath.py b/rdiff-backup/rdiff_backup/rpath.py index b33bf14..b0fe10b 100644 --- a/rdiff-backup/rdiff_backup/rpath.py +++ b/rdiff-backup/rdiff_backup/rpath.py @@ -244,12 +244,22 @@ def rename(rp_source, rp_dest): log.Log(lambda: "Renaming %s to %s" % (rp_source.path, rp_dest.path), 7) if not rp_source.lstat(): rp_dest.delete() else: - if rp_dest.lstat() and rp_source.getinode() == rp_dest.getinode(): + if rp_dest.lstat() and rp_source.getinode() == rp_dest.getinode() and \ + rp_source.getinode() != -1: log.Log("Warning: Attempt to rename over same inode: %s to %s" % (rp_source.path, rp_dest.path), 2) # You can't rename one hard linked file over another rp_source.delete() - else: rp_source.conn.os.rename(rp_source.path, rp_dest.path) + else: + try: + rp_source.conn.os.rename(rp_source.path, rp_dest.path) + except OSError, error: + if error.errno != errno.EEXIST: raise + + # On Windows, files can't be renamed on top of an existing file + rp_source.conn.os.unlink(rp_dest.path) + rp_source.conn.os.rename(rp_source.path, rp_dest.path) + rp_dest.data = rp_source.data rp_source.data = {'type': None} |