diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2007-08-22T14·52+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2007-08-22T14·52+0000 |
commit | 7d5836b34df363c2b2e7fc1574aaba1dde9a697e (patch) | |
tree | 4e91e197e429d8a02d2bbbfeaf3a419449eff7e3 /scripts | |
parent | 2629998e9167b2d7897a2f34a6f531affc4033db (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.)
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/nix-channel.in | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/scripts/nix-channel.in b/scripts/nix-channel.in index 1ef9c58447b3..1efb1a03a128 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"; |