nix-collect-garbage: Add --delete-older-than option

This commit is contained in:
Ricardo M. Correia 2014-03-11 22:16:00 +01:00 committed by Eelco Dolstra
parent 7ef7597f71
commit 034b6f6062
2 changed files with 22 additions and 8 deletions

View file

@ -20,6 +20,7 @@
<command>nix-collect-garbage</command> <command>nix-collect-garbage</command>
<arg><option>--delete-old</option></arg> <arg><option>--delete-old</option></arg>
<arg><option>-d</option></arg> <arg><option>-d</option></arg>
<arg><option>--delete-older-than</option> <replaceable>period</replaceable></arg>
<group choice='opt'> <group choice='opt'>
<arg choice='plain'><option>--print-roots</option></arg> <arg choice='plain'><option>--print-roots</option></arg>
<arg choice='plain'><option>--print-live</option></arg> <arg choice='plain'><option>--print-live</option></arg>
@ -35,13 +36,18 @@
<para>The command <command>nix-collect-garbage</command> is mostly an <para>The command <command>nix-collect-garbage</command> is mostly an
alias of <link linkend="rsec-nix-store-gc"><command>nix-store alias of <link linkend="rsec-nix-store-gc"><command>nix-store
--gc</command></link>, that is, it deletes all unreachable paths in --gc</command></link>, that is, it deletes all unreachable paths in
the Nix store to clean up your system. However, it provides an the Nix store to clean up your system. However, it provides two
additional option <option>-d</option> (<option>--delete-old</option>) additional options: <option>-d</option> (<option>--delete-old</option>),
that deletes all old generations of all profiles in which deletes all old generations of all profiles in
<filename>/nix/var/nix/profiles</filename> by invoking <filename>/nix/var/nix/profiles</filename> by invoking
<literal>nix-env --delete-generations old</literal> on all profiles. <literal>nix-env --delete-generations old</literal> on all profiles
Of course, this makes rollbacks to previous configurations (of course, this makes rollbacks to previous configurations
impossible.</para> impossible); and
<option>--delete-older-than</option> <replaceable>period</replaceable>,
where period is a value such as <literal>30d</literal>, which deletes
all non-current generations that are older than the specified number of
days in all profiles in <filename>/nix/var/nix/profiles</filename>.
</para>
</refsection> </refsection>

View file

@ -8,12 +8,19 @@ my $profilesDir = "@localstatedir@/nix/profiles";
# Process the command line arguments. # Process the command line arguments.
my @args = (); my @args = ();
my $arg;
my $removeOld = 0; my $removeOld = 0;
my $gen;
my $dryRun = 0; my $dryRun = 0;
for my $arg (@ARGV) { while ($arg = shift) {
if ($arg eq "--delete-old" || $arg eq "-d") { if ($arg eq "--delete-old" || $arg eq "-d") {
$removeOld = 1; $removeOld = 1;
$gen = "old";
} elsif ($arg eq "--delete-older-than") {
$removeOld = 1;
$gen = shift;
} elsif ($arg eq "--dry-run") { } elsif ($arg eq "--dry-run") {
$dryRun = 1; $dryRun = 1;
} elsif ($arg eq "--help") { } elsif ($arg eq "--help") {
@ -40,7 +47,8 @@ sub removeOldGenerations {
$name = $dir . "/" . $name; $name = $dir . "/" . $name;
if (-l $name && (readlink($name) =~ /link/)) { if (-l $name && (readlink($name) =~ /link/)) {
print STDERR "removing old generations of profile $name\n"; print STDERR "removing old generations of profile $name\n";
system("$Nix::Config::binDir/nix-env", "-p", $name, "--delete-generations", "old", $dryRun ? "--dry-run" : ());
system("$Nix::Config::binDir/nix-env", "-p", $name, "--delete-generations", $gen, $dryRun ? "--dry-run" : ());
} }
elsif (! -l $name && -d $name) { elsif (! -l $name && -d $name) {
removeOldGenerations $name; removeOldGenerations $name;