]> git.mxchange.org Git - simgear.git/commitdiff
Fix handling of SGPath::rename
authorJames Turner <zakalawe@mac.com>
Sat, 26 Oct 2013 20:03:00 +0000 (21:03 +0100)
committerJames Turner <zakalawe@mac.com>
Sat, 26 Oct 2013 20:03:00 +0000 (21:03 +0100)
Windows handling of ::rename differs from POSIX when the new name
exists. Check for this case on Windows and remove the file manually.
(This allows a work-around in SVNDirectory to be removed)

simgear/io/SVNDirectory.cxx
simgear/misc/sg_path.cxx

index 923993ac4b1df6c6ab23052d1fbeac1e9f5797a5..6983ef871f3aeb518d1a609754b6ea39c6830faa 100644 (file)
@@ -177,9 +177,6 @@ void SVNDirectory::writeCache()
 // approximately atomic delete + rename operation
     SGPath cacheName(localPath);
     cacheName.append(DAV_CACHE_NAME);
-    if (cacheName.exists()) {
-        cacheName.remove();
-    }
     p.rename(cacheName);
 }
 
index 4e11de3c305e4cb3a0c3e45610599fb827aa5e41..cc71a9af1e256e18f729310c23cf62ac16377cc3 100644 (file)
@@ -461,7 +461,8 @@ bool SGPath::remove()
     int err = ::unlink(c_str());
     if (err) {
         SG_LOG(SG_IO, SG_WARN,  "file remove failed: (" << str() << ") " << strerror(errno));
-    }
+       }
+       _cached = false; // stat again if required
     return (err == 0);
 }
 
@@ -483,6 +484,14 @@ bool SGPath::operator!=(const SGPath& other) const
 
 bool SGPath::rename(const SGPath& newName)
 {
+#ifdef SG_WINDOWS
+       if (newName.exists()) {
+               SGPath r(newName);
+               if (!r.remove()) {
+                       return false;
+               }
+       }
+#endif
     if (::rename(c_str(), newName.c_str()) != 0) {
         SG_LOG(SG_IO, SG_WARN, "renamed failed: from " << str() << " to " << newName.str()
             << " reason: " << strerror(errno));