1
1
Fork 0
mirror of https://github.com/NixOS/nix.git synced 2025-12-04 16:10:59 +01:00

Merge pull request #14676 from NixOS/fs-fixes

libstore: Use makeTempPath in optimizePath_, assorted fs fixes
This commit is contained in:
John Ericson 2025-12-01 01:55:20 +00:00 committed by GitHub
commit 1e9b1ff851
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 15 additions and 8 deletions

View file

@ -234,7 +234,7 @@ void LocalStore::optimisePath_(
its timestamp back to 0. */ its timestamp back to 0. */
MakeReadOnly makeReadOnly(mustToggle ? dirOfPath : ""); MakeReadOnly makeReadOnly(mustToggle ? dirOfPath : "");
std::filesystem::path tempLink = fmt("%1%/.tmp-link-%2%-%3%", config->realStoreDir, getpid(), rand()); std::filesystem::path tempLink = makeTempPath(config->realStoreDir.get(), ".tmp-link");
try { try {
std::filesystem::create_hard_link(linkPath, tempLink); std::filesystem::create_hard_link(linkPath, tempLink);
@ -255,8 +255,12 @@ void LocalStore::optimisePath_(
try { try {
std::filesystem::rename(tempLink, path); std::filesystem::rename(tempLink, path);
} catch (std::filesystem::filesystem_error & e) { } catch (std::filesystem::filesystem_error & e) {
std::filesystem::remove(tempLink); {
printError("unable to unlink %1%", tempLink); std::error_code ec;
remove(tempLink, ec); /* Clean up after ourselves. */
if (ec)
printError("unable to unlink %1%: %2%", tempLink, ec.message());
}
if (e.code() == std::errc::too_many_links) { if (e.code() == std::errc::too_many_links) {
/* Some filesystems generate too many links on the rename, /* Some filesystems generate too many links on the rename,
rather than on the original link. (Probably it rather than on the original link. (Probably it

View file

@ -737,11 +737,10 @@ std::filesystem::path makeTempPath(const std::filesystem::path & root, const std
void createSymlink(const Path & target, const Path & link) void createSymlink(const Path & target, const Path & link)
{ {
try { std::error_code ec;
std::filesystem::create_symlink(target, link); std::filesystem::create_symlink(target, link, ec);
} catch (std::filesystem::filesystem_error & e) { if (ec)
throw SysError("creating symlink '%1%' -> '%2%'", link, target); throw SysError(ec.value(), "creating symlink '%1%' -> '%2%'", link, target);
}
} }
void replaceSymlink(const std::filesystem::path & target, const std::filesystem::path & link) void replaceSymlink(const std::filesystem::path & target, const std::filesystem::path & link)

View file

@ -294,6 +294,10 @@ class AutoDelete
public: public:
AutoDelete(); AutoDelete();
AutoDelete(const std::filesystem::path & p, bool recursive = true); AutoDelete(const std::filesystem::path & p, bool recursive = true);
AutoDelete(AutoDelete &&) = delete;
AutoDelete(const AutoDelete &) = delete;
AutoDelete & operator=(AutoDelete &&) = delete;
AutoDelete & operator=(const AutoDelete &) = delete;
~AutoDelete(); ~AutoDelete();
void cancel(); void cancel();