From 7d5836b34df363c2b2e7fc1574aaba1dde9a697e Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 22 Aug 2007 14:52:22 +0000 Subject: [PATCH] * 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.) --- scripts/nix-channel.in | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/scripts/nix-channel.in b/scripts/nix-channel.in index 1ef9c584..1efb1a03 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";