Fix handling of SGPath::rename

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)
This commit is contained in:
James Turner
2013-10-26 21:03:00 +01:00
parent 7cbfa76be4
commit f26f3b606d
2 changed files with 10 additions and 4 deletions

View 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);
}

View 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));