about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am4
-rwxr-xr-xscripts/nix-channel.in21
2 files changed, 22 insertions, 3 deletions
diff --git a/Makefile.am b/Makefile.am
index 9f9f9e0a9386..f65affaf4530 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -16,6 +16,7 @@ install-data-local: init-state
 if INIT_STATE
 if SETUID_HACK
 INIT_FLAGS = -g @NIX_GROUP@ -o @NIX_USER@
+GROUP_WRITABLE = -m 775
 endif
 init-state:
 	$(INSTALL) $(INIT_FLAGS) -d $(DESTDIR)$(localstatedir)/nix
@@ -23,7 +24,8 @@ init-state:
 	$(INSTALL) $(INIT_FLAGS) -d $(DESTDIR)$(localstatedir)/log/nix
 	$(INSTALL) $(INIT_FLAGS) -d $(DESTDIR)$(localstatedir)/nix/profiles
 	$(INSTALL) $(INIT_FLAGS) -d $(DESTDIR)$(localstatedir)/nix/gcroots
-	$(INSTALL) $(INIT_FLAGS) -d $(DESTDIR)$(localstatedir)/nix/gcroots/tmp
+	$(INSTALL) $(INIT_FLAGS) $(GROUP_WRITABLE) -d $(DESTDIR)$(localstatedir)/nix/gcroots/tmp
+	$(INSTALL) $(INIT_FLAGS) $(GROUP_WRITABLE) -d $(DESTDIR)$(localstatedir)/nix/gcroots/channels
 	rm -f $(DESTDIR)$(localstatedir)/nix/gcroots/profiles
 	ln -s $(localstatedir)/nix/profiles $(DESTDIR)$(localstatedir)/nix/gcroots/profiles
 	$(INSTALL) $(INIT_FLAGS) -d $(DESTDIR)$(prefix)/store
diff --git a/scripts/nix-channel.in b/scripts/nix-channel.in
index f554380e2841..d05751512d62 100755
--- a/scripts/nix-channel.in
+++ b/scripts/nix-channel.in
@@ -2,6 +2,8 @@
 
 use strict;
 
+my $rootsDir = "@localstatedir@/nix/gcroots/channels";
+
 
 # Figure out the name of the `.nix-channels' file to use.
 my $home = $ENV{"HOME"};
@@ -79,18 +81,33 @@ sub update {
         "(import @datadir@/nix/corepkgs/channels/unpack.nix) " .
         "{inputs = $nixExpr; system = \"@system@\";}";
 
-    # Instantiate and realise it.
+    # Instantiate the Nix expression.
     my $storeExpr = `echo '$nixExpr' | @bindir@/nix-instantiate -`
         or die "cannot instantiate Nix expression";
     chomp $storeExpr;
 
-    my $outPath = `nix-store -qnfB '$storeExpr'`
+    # Register the store expression as a root of the garbage
+    # collector.
+    my $userName = getpwuid($<);
+    die "who ARE you? go away" unless defined $userName;
+
+    my $rootFile = "$rootsDir/$userName.gcroot";
+    my $tmpRootFile = "$rootsDir/$userName-tmp.gcroot";
+    
+    open ROOT, ">$tmpRootFile" or die "cannot create `$tmpRootFile'";
+    print ROOT "$storeExpr";
+    close ROOT;
+
+    # Realise the store expression.
+    my $outPath = `nix-store -qnf '$storeExpr'`
         or die "cannot realise store expression";
     chomp $outPath;
 
     # Make it the default Nix expression for `nix-env'.
     system "@bindir@/nix-env --import '$outPath'";
     die "cannot pull set default Nix expression to `$outPath'" if ($? != 0);
+
+    rename $tmpRootFile, $rootFile or die "cannot rename `$tmpRootFile' to `$rootFile'";
 }