aboutsummaryrefslogtreecommitdiff
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
parent2629998e9167b2d7897a2f34a6f531affc4033db (diff)
* 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.)
-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 1ef9c5844..1efb1a03a 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";