about summary refs log tree commit diff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/nix-collect-garbage.in16
-rwxr-xr-xscripts/nix-switch.in52
2 files changed, 50 insertions, 18 deletions
diff --git a/scripts/nix-collect-garbage.in b/scripts/nix-collect-garbage.in
index 8f54ba20f3e4..eaa706578117 100755
--- a/scripts/nix-collect-garbage.in
+++ b/scripts/nix-collect-garbage.in
@@ -5,13 +5,27 @@ my $storedir = "@prefix@/store";
 
 my %alive;
 
-open HASHES, "nix --query --refs \$(cat $linkdir/*.hash) |" or die "in `nix -qrh'";
+my $keepsuccessors = 0;
+my $invert = 0;
+
+foreach my $arg (@ARGV) {
+    if ($arg eq "--keep-successors") { $keepsuccessors = 1; }
+    if ($arg eq "--invert") { $invert = 1; }
+    else { die "unknown argument `$arg'" };
+}
+
+my $extraarg = "";
+if ($keepsuccessors) { $extraarg = "--include-successors"; };
+open HASHES, "nix --query --requisites $extraarg \$(cat $linkdir/*.id) |" or die "in `nix -qrh'";
 while (<HASHES>) {
 	chomp;
 	$alive{$_} = 1;
+	if ($invert) { print "$_\n"; };
 }
 close HASHES;
 
+exit 0 if ($invert);
+
 opendir(DIR, $storedir) or die "cannot opendir $storedir: $!";
 my @names = readdir(DIR);
 closedir DIR;
diff --git a/scripts/nix-switch.in b/scripts/nix-switch.in
index ddaca4e227ad..db0e96f3e7e8 100755
--- a/scripts/nix-switch.in
+++ b/scripts/nix-switch.in
@@ -3,39 +3,56 @@
 use strict;
 
 my $keep = 0;
-
-if (scalar @ARGV > 0 && $ARGV[0] eq "--keep") {
-    shift @ARGV;
-    $keep = 1;
+my $sourceroot = 0;
+my $srcid;
+
+foreach my $arg (@ARGV) {
+    if ($arg eq "--keep") { $keep = 1; }
+    elsif ($arg eq "--source-root") { $sourceroot = 1; }
+    elsif ($arg =~ /^([0-9a-z]{32})$/) { $srcid = $arg; }
+    else { die "unknown argument `$arg'" };
 }
 
-my $hash = $ARGV[0];
-$hash || die "no package hash specified";
-
 my $linkdir = "@localstatedir@/nix/links";
 
 # Build the specified package, and all its dependencies.
-system "nix --install $hash";
+my $nfid = `nix --install $srcid`;
 if ($?) { die "`nix --install' failed"; }
+chomp $nfid;
+die unless $nfid =~ /^([0-9a-z]{32})$/;
 
-my $pkgdir = `nix --query --list $hash`;
+my $pkgdir = `nix --query --list $nfid`;
 if ($?) { die "`nix --query --list' failed"; }
 chomp $pkgdir;
 
 # Figure out a generation number.
+opendir(DIR, $linkdir);
 my $nr = 0;
-while (-e "$linkdir/$nr") { $nr++; }
+foreach my $n (sort(readdir(DIR))) {
+    next if (!($n =~ /^\d+$/));
+    $nr = $n + 1 if ($n >= $nr);
+}
+closedir(DIR);
+
 my $link = "$linkdir/$nr";
 
 # Create a symlink from $link to $pkgdir.
 symlink($pkgdir, $link) or die "cannot create $link: $!";
 
-# Also store the hash of $pkgdir.  This is useful for garbage
+# Store the id of the normal form.  This is useful for garbage
 # collection and the like.
-my $hashfile = "$linkdir/$nr.hash";
-open HASH, "> $hashfile" or die "cannot create $hashfile";
-print HASH "$hash\n";
-close HASH;
+my $idfile = "$linkdir/$nr.id";
+open ID, "> $idfile" or die "cannot create $idfile";
+print ID "$nfid\n";
+close ID;
+
+# Optionally store the source id.
+if ($sourceroot) {
+    $idfile = "$linkdir/$nr-src.id";
+    open ID, "> $idfile" or die "cannot create $idfile";
+    print ID "$srcid\n";
+    close ID;
+}
 
 my $current = "$linkdir/current";
 
@@ -59,6 +76,7 @@ rename($tmplink, $current) or die "cannot rename $tmplink";
 
 if (!$keep && defined $oldlink) {
     print "deleting old $oldlink\n";
-    unlink($oldlink) == 1 || print "cannot delete $oldlink\n";
-    unlink("$oldlink.hash") == 1 || print "cannot delete $oldlink.hash\n";
+    unlink($oldlink) == 1 or print "cannot delete $oldlink\n";
+    unlink("$oldlink.id") == 1 or print "cannot delete $oldlink.id\n";
+    unlink("$oldlink-src.id");
 }