Skip to content

Commit

Permalink
Merge pull request #522 from lethalman/nix-collect-garbage
Browse files Browse the repository at this point in the history
nix-collect-garbage: translate to C++
  • Loading branch information
edolstra committed Apr 22, 2015
2 parents 4d65287 + ab2b3d6 commit 4bbcfaf
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 66 deletions.
1 change: 1 addition & 0 deletions Makefile
Expand Up @@ -10,6 +10,7 @@ makefiles = \
src/nix-instantiate/local.mk \
src/nix-env/local.mk \
src/nix-daemon/local.mk \
src/nix-collect-garbage/local.mk \
src/download-via-ssh/local.mk \
src/nix-log2xml/local.mk \
src/bsdiff-4.3/local.mk \
Expand Down
1 change: 0 additions & 1 deletion scripts/local.mk
@@ -1,7 +1,6 @@
nix_bin_scripts := \
$(d)/nix-build \
$(d)/nix-channel \
$(d)/nix-collect-garbage \
$(d)/nix-copy-closure \
$(d)/nix-generate-patches \
$(d)/nix-install-package \
Expand Down
65 changes: 0 additions & 65 deletions scripts/nix-collect-garbage.in

This file was deleted.

7 changes: 7 additions & 0 deletions src/nix-collect-garbage/local.mk
@@ -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
87 changes: 87 additions & 0 deletions src/nix-collect-garbage/nix-collect-garbage.cc
@@ -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" : ""});
}
} 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"});
});
}

0 comments on commit 4bbcfaf

Please sign in to comment.