summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--scripts/nix-channel.in33
1 files changed, 21 insertions, 12 deletions
diff --git a/scripts/nix-channel.in b/scripts/nix-channel.in
index 1ef9c58447..1efb1a03a1 100644
--- a/scripts/nix-channel.in
+++ b/scripts/nix-channel.in
@@ -2,7 +2,7 @@
 
 use strict;
 
-my $rootsDir = "@localstatedir@/nix/gcroots/channels";
+my $rootsDir = "@localstatedir@/nix/gcroots";
 
 my $stateDir = $ENV{"NIX_STATE_DIR"};
 $stateDir = "@localstatedir@/nix" unless defined $stateDir;
@@ -10,8 +10,8 @@ $stateDir = "@localstatedir@/nix" unless defined $stateDir;
 
 # Turn on caching in nix-prefetch-url.
 my $channelCache = "$stateDir/channel-cache";
-$ENV{'NIX_DOWNLOAD_CACHE'} = $channelCache;
 mkdir $channelCache, 0755 unless -e $channelCache;
+$ENV{'NIX_DOWNLOAD_CACHE'} = $channelCache if -W $channelCache;
 
 
 # Figure out the name of the `.nix-channels' file to use.
@@ -76,16 +76,25 @@ sub removeChannel {
 sub update {
     readChannels;
 
-    # Remove all the old manifests.
-    for my $manifest (glob "$stateDir/manifests/*.nixmanifest") {
-        unlink $manifest or die "cannot remove `$manifest': $!";
-    }
+    # Do we have write permission to the manifests directory?  If not,
+    # then just skip pulling the manifest and just download the Nix
+    # expressions.  If the user is a non-privileged user in a
+    # multi-user Nix installation, he at least gets installation from
+    # source.
+    if (-W "$stateDir/manifests") {
+
+        # Remove all the old manifests.
+        for my $manifest (glob "$stateDir/manifests/*.nixmanifest") {
+            unlink $manifest or die "cannot remove `$manifest': $!";
+        }
+
+        # Pull cache manifests.
+        foreach my $url (@channels) {
+            #print "pulling cache manifest from `$url'\n";
+            system("@bindir@/nix-pull", "--skip-wrong-store", "$url/MANIFEST") == 0
+                or die "cannot pull cache manifest from `$url'";
+        }
 
-    # Pull cache manifests.
-    foreach my $url (@channels) {
-        #print "pulling cache manifest from `$url'\n";
-        system("@bindir@/nix-pull", "--skip-wrong-store", "$url/MANIFEST") == 0
-            or die "cannot pull cache manifest from `$url'";
     }
 
     # Create a Nix expression that fetches and unpacks the channel Nix
@@ -112,7 +121,7 @@ sub update {
     my $userName = getpwuid($<);
     die "who ARE you? go away" unless defined $userName;
 
-    my $rootFile = "$rootsDir/$userName";
+    my $rootFile = "$rootsDir/per-user/$userName/channels";
     
     # Instantiate the Nix expression.
     print "unpacking channel Nix expressions...\n";