replaceSymlink(): Handle the case where the temporary file already exists

Not really necessary anymore for #849, but still nice to have.

(cherry picked from commit 2965d40612)
This commit is contained in:
Eelco Dolstra 2017-07-11 23:20:01 +02:00
parent 2a0112a370
commit 7577d35895
No known key found for this signature in database
GPG Key ID: 8170B4726D7198DE
1 changed files with 13 additions and 4 deletions

View File

@ -431,12 +431,21 @@ void createSymlink(const Path & target, const Path & link)
void replaceSymlink(const Path & target, const Path & link)
{
Path tmp = canonPath(dirOf(link) + "/.new_" + baseNameOf(link));
for (unsigned int n = 0; true; n++) {
Path tmp = canonPath(fmt("%s/.%d_%s", dirOf(link), n, baseNameOf(link)));
createSymlink(target, tmp);
try {
createSymlink(target, tmp);
} catch (SysError & e) {
if (e.errNo == EEXIST) continue;
throw;
}
if (rename(tmp.c_str(), link.c_str()) != 0)
throw SysError(format("renaming %1% to %2%") % tmp % link);
if (rename(tmp.c_str(), link.c_str()) != 0)
throw SysError(format("renaming %1% to %2%") % tmp % link);
break;
}
}