-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
nix-collect-garbage: translate to C++ #522
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
programs += nix-collect-garbage | ||
|
||
nix-collect-garbage_DIR := $(d) | ||
|
||
nix-collect-garbage_SOURCES := $(d)/nix-collect-garbage.cc | ||
|
||
nix-collect-garbage_LIBS = libmain libstore libutil libformat |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
#include "hash.hh" | ||
#include "shared.hh" | ||
#include "globals.hh" | ||
|
||
#include <iostream> | ||
|
||
using namespace nix; | ||
|
||
std::string gen = ""; | ||
bool dryRun = false; | ||
|
||
void runProgramSimple(Path program, const Strings & args) | ||
{ | ||
checkInterrupt(); | ||
|
||
/* Fork. */ | ||
Pid pid = startProcess([&]() { | ||
Strings args_(args); | ||
args_.push_front(program); | ||
auto cargs = stringsToCharPtrs(args_); | ||
|
||
execv(program.c_str(), (char * *) &cargs[0]); | ||
|
||
throw SysError(format("executing ‘%1%’") % program); | ||
}); | ||
|
||
pid.wait(true); | ||
} | ||
|
||
|
||
/* If `-d' was specified, remove all old generations of all profiles. | ||
* Of course, this makes rollbacks to before this point in time | ||
* impossible. */ | ||
|
||
void removeOldGenerations(std::string dir) | ||
{ | ||
for (auto & i : readDirectory(dir)) { | ||
checkInterrupt(); | ||
|
||
auto path = dir + "/" + i.name; | ||
auto type = getFileType(path); | ||
|
||
if (type == DT_LNK) { | ||
auto link = readLink(path); | ||
if (link.find("link") != string::npos) { | ||
printMsg(lvlInfo, format("removing old generations of profile %1%") % path); | ||
|
||
runProgramSimple(settings.nixBinDir + "/nix-env", Strings{"-p", path, "--delete-generations", gen, dryRun ? "--dry-run" : ""}); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Rather than calling There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm not yet confident with doing this, can we accept this in the while as a 1:1 translation? |
||
} | ||
} else if (type == DT_DIR) { | ||
removeOldGenerations(path); | ||
} | ||
} | ||
} | ||
|
||
int main(int argc, char * * argv) | ||
{ | ||
bool removeOld = false; | ||
Strings extraArgs; | ||
|
||
return handleExceptions(argv[0], [&]() { | ||
initNix(); | ||
|
||
parseCmdLine(argc, argv, [&](Strings::iterator & arg, const Strings::iterator & end) { | ||
if (*arg == "--help") | ||
showManPage("nix-collect-garbage"); | ||
else if (*arg == "--version") | ||
printVersion("nix-collect-garbage"); | ||
else if (*arg == "--delete-old" || *arg == "-d") removeOld = true; | ||
else if (*arg == "--delete-older-than") { | ||
removeOld = true; | ||
gen = getArg(*arg, arg, end); | ||
} | ||
else if (*arg == "--dry-run") dryRun = true; | ||
else | ||
extraArgs.push_back(*arg); | ||
return true; | ||
}); | ||
|
||
auto profilesDir = settings.nixStateDir + "/profiles"; | ||
if (removeOld) removeOldGenerations(profilesDir); | ||
|
||
// Run the actual garbage collector. | ||
if (!dryRun) runProgramSimple(settings.nixBinDir + "/nix-store", Strings{"--gc"}); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Here you can just call There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same as above. |
||
}); | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Doesn't
runProgram()
work?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
runProgram grabs the output, here I just let the child inherit the stdout.