summary refs log tree commit diff
path: root/scripts
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2007-08-22 14:52:22 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2007-08-22 14:52:22 +0000
commit7d5836b34df363c2b2e7fc1574aaba1dde9a697e (patch)
tree4e91e197e429d8a02d2bbbfeaf3a419449eff7e3 /scripts
parent2629998e9167b2d7897a2f34a6f531affc4033db (diff)
downloadguix-7d5836b34df363c2b2e7fc1574aaba1dde9a697e.tar.gz
* nix-channel: supports users who don't have write permission to the
  manifests directory.  In that case, we don't do a nix-pull, so the
  user gets pure source deployment.

  The directory /nix/var/nix/gcroots/per-user/$USER should be
  writable.  (It's created automatically if
  /nix/var/nix/gcroots/per-user is writable, e.g. if it has 1777
  permission.)

Diffstat (limited to 'scripts')
-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";