Merge pull request #522 from lethalman/nix-collect-garbage
nix-collect-garbage: translate to C++
This commit is contained in:
commit
4bbcfaf87f
5 changed files with 95 additions and 66 deletions
1
Makefile
1
Makefile
|
@ -10,6 +10,7 @@ makefiles = \
|
||||||
src/nix-instantiate/local.mk \
|
src/nix-instantiate/local.mk \
|
||||||
src/nix-env/local.mk \
|
src/nix-env/local.mk \
|
||||||
src/nix-daemon/local.mk \
|
src/nix-daemon/local.mk \
|
||||||
|
src/nix-collect-garbage/local.mk \
|
||||||
src/download-via-ssh/local.mk \
|
src/download-via-ssh/local.mk \
|
||||||
src/nix-log2xml/local.mk \
|
src/nix-log2xml/local.mk \
|
||||||
src/bsdiff-4.3/local.mk \
|
src/bsdiff-4.3/local.mk \
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
nix_bin_scripts := \
|
nix_bin_scripts := \
|
||||||
$(d)/nix-build \
|
$(d)/nix-build \
|
||||||
$(d)/nix-channel \
|
$(d)/nix-channel \
|
||||||
$(d)/nix-collect-garbage \
|
|
||||||
$(d)/nix-copy-closure \
|
$(d)/nix-copy-closure \
|
||||||
$(d)/nix-generate-patches \
|
$(d)/nix-generate-patches \
|
||||||
$(d)/nix-install-package \
|
$(d)/nix-install-package \
|
||||||
|
|
|
@ -1,65 +0,0 @@
|
||||||
#! @perl@ -w @perlFlags@
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use Nix::Config;
|
|
||||||
|
|
||||||
my $profilesDir = "@localstatedir@/nix/profiles";
|
|
||||||
|
|
||||||
|
|
||||||
# Process the command line arguments.
|
|
||||||
my @args = ();
|
|
||||||
my $arg;
|
|
||||||
|
|
||||||
my $removeOld = 0;
|
|
||||||
my $gen;
|
|
||||||
my $dryRun = 0;
|
|
||||||
|
|
||||||
while ($arg = shift) {
|
|
||||||
if ($arg eq "--delete-old" || $arg eq "-d") {
|
|
||||||
$removeOld = 1;
|
|
||||||
$gen = "old";
|
|
||||||
} elsif ($arg eq "--delete-older-than") {
|
|
||||||
$removeOld = 1;
|
|
||||||
$gen = shift;
|
|
||||||
} elsif ($arg eq "--dry-run") {
|
|
||||||
$dryRun = 1;
|
|
||||||
} elsif ($arg eq "--help") {
|
|
||||||
exec "man nix-collect-garbage" or die;
|
|
||||||
} else {
|
|
||||||
push @args, $arg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
# If `-d' was specified, remove all old generations of all profiles.
|
|
||||||
# Of course, this makes rollbacks to before this point in time
|
|
||||||
# impossible.
|
|
||||||
|
|
||||||
sub removeOldGenerations;
|
|
||||||
sub removeOldGenerations {
|
|
||||||
my $dir = shift;
|
|
||||||
|
|
||||||
my $dh;
|
|
||||||
opendir $dh, $dir or die;
|
|
||||||
|
|
||||||
foreach my $name (sort (readdir $dh)) {
|
|
||||||
next if $name eq "." || $name eq "..";
|
|
||||||
$name = $dir . "/" . $name;
|
|
||||||
if (-l $name && (readlink($name) =~ /link/)) {
|
|
||||||
print STDERR "removing old generations of profile $name\n";
|
|
||||||
|
|
||||||
system("$Nix::Config::binDir/nix-env", "-p", $name, "--delete-generations", $gen, $dryRun ? "--dry-run" : ());
|
|
||||||
}
|
|
||||||
elsif (! -l $name && -d $name) {
|
|
||||||
removeOldGenerations $name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
closedir $dh or die;
|
|
||||||
}
|
|
||||||
|
|
||||||
removeOldGenerations $profilesDir if $removeOld;
|
|
||||||
|
|
||||||
|
|
||||||
# Run the actual garbage collector.
|
|
||||||
exec "$Nix::Config::binDir/nix-store", "--gc", @args unless $dryRun;
|
|
7
src/nix-collect-garbage/local.mk
Normal file
7
src/nix-collect-garbage/local.mk
Normal file
|
@ -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
src/nix-collect-garbage/nix-collect-garbage.cc
Normal file
87
src/nix-collect-garbage/nix-collect-garbage.cc
Normal file
|
@ -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"});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue