mirror of
https://github.com/privatevoid-net/nix-super.git
synced 2024-11-15 02:36:16 +02:00
More std::filesystem
for nix-collect-garbage
Co-Authored-By: siddhantCodes <siddhantk232@gmail.com>
This commit is contained in:
parent
a97a08411c
commit
8bce63f30a
1 changed files with 12 additions and 7 deletions
|
@ -11,6 +11,8 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
|
|
||||||
|
namespace nix::fs { using namespace std::filesystem; }
|
||||||
|
|
||||||
using namespace nix;
|
using namespace nix;
|
||||||
|
|
||||||
std::string deleteOlderThan;
|
std::string deleteOlderThan;
|
||||||
|
@ -21,23 +23,23 @@ bool dryRun = false;
|
||||||
* Of course, this makes rollbacks to before this point in time
|
* Of course, this makes rollbacks to before this point in time
|
||||||
* impossible. */
|
* impossible. */
|
||||||
|
|
||||||
void removeOldGenerations(std::filesystem::path dir)
|
void removeOldGenerations(fs::path dir)
|
||||||
{
|
{
|
||||||
if (access(dir.string().c_str(), R_OK) != 0) return;
|
if (access(dir.string().c_str(), R_OK) != 0) return;
|
||||||
|
|
||||||
bool canWrite = access(dir.string().c_str(), W_OK) == 0;
|
bool canWrite = access(dir.string().c_str(), W_OK) == 0;
|
||||||
|
|
||||||
for (auto & i : std::filesystem::directory_iterator{dir}) {
|
for (auto & i : fs::directory_iterator{dir}) {
|
||||||
checkInterrupt();
|
checkInterrupt();
|
||||||
|
|
||||||
auto path = i.path().string();
|
auto path = i.path().string();
|
||||||
auto type = i.symlink_status().type();
|
auto type = i.symlink_status().type();
|
||||||
|
|
||||||
if (type == std::filesystem::file_type::symlink && canWrite) {
|
if (type == fs::file_type::symlink && canWrite) {
|
||||||
std::string link;
|
std::string link;
|
||||||
try {
|
try {
|
||||||
link = readLink(path);
|
link = readLink(path);
|
||||||
} catch (std::filesystem::filesystem_error & e) {
|
} catch (fs::filesystem_error & e) {
|
||||||
if (e.code() == std::errc::no_such_file_or_directory) continue;
|
if (e.code() == std::errc::no_such_file_or_directory) continue;
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
|
@ -49,7 +51,7 @@ void removeOldGenerations(std::filesystem::path dir)
|
||||||
} else
|
} else
|
||||||
deleteOldGenerations(path, dryRun);
|
deleteOldGenerations(path, dryRun);
|
||||||
}
|
}
|
||||||
} else if (type == std::filesystem::file_type::directory) {
|
} else if (type == fs::file_type::directory) {
|
||||||
removeOldGenerations(path);
|
removeOldGenerations(path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -81,8 +83,11 @@ static int main_nix_collect_garbage(int argc, char * * argv)
|
||||||
});
|
});
|
||||||
|
|
||||||
if (removeOld) {
|
if (removeOld) {
|
||||||
std::set<std::filesystem::path> dirsToClean = {
|
std::set<fs::path> dirsToClean = {
|
||||||
profilesDir(), settings.nixStateDir + "/profiles", dirOf(getDefaultProfile())};
|
profilesDir(),
|
||||||
|
fs::path{settings.nixStateDir} / "profiles",
|
||||||
|
fs::path{getDefaultProfile()}.parent_path(),
|
||||||
|
};
|
||||||
for (auto & dir : dirsToClean)
|
for (auto & dir : dirsToClean)
|
||||||
removeOldGenerations(dir);
|
removeOldGenerations(dir);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue