From eb2dd4815c05fcc592d049bddcd2f42d13216eab Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 13 Mar 2007 11:30:57 +0000 Subject: [PATCH] * Remove old generations in all directories under /nix/var/nix/profiles, not just in that directory itself. (NixOS puts profiles in /nix/var/nix/profiles/per-user.) --- scripts/nix-collect-garbage.in | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/scripts/nix-collect-garbage.in b/scripts/nix-collect-garbage.in index f1ea09b8e..b92deefc2 100644 --- a/scripts/nix-collect-garbage.in +++ b/scripts/nix-collect-garbage.in @@ -21,22 +21,31 @@ for my $arg (@ARGV) { # If `-d' was specified, remove all old generations of all profiles. # Of course, this makes rollbacks to before this point in time # impossible. -if ($removeOld) { - opendir DIR, $profilesDir or die; +sub removeOldGenerations; +sub removeOldGenerations { + my $dir = shift; - foreach my $name (sort (readdir DIR)) { - $name = $profilesDir . "/" . $name; + 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("@bindir@/nix-env", "-p", $name, "--delete-generations", "old"); } + elsif (! -l $name && -d $name) { + removeOldGenerations $name; + } } - closedir DIR or die; - + closedir $dh or die; } +removeOldGenerations $profilesDir if $removeOld; + # Run the actual garbage collector. exec "@bindir@/nix-store", "--gc", @args;