diff --git a/scripts/nix-channel.in b/scripts/nix-channel.in index 19b012922..e3abc7ea5 100644 --- a/scripts/nix-channel.in +++ b/scripts/nix-channel.in @@ -23,6 +23,7 @@ sub readChannels { open CHANNELS, "<$channelsList" or die "cannot open `$channelsList': $!"; while () { chomp; + next if /^\s*\#/; push @channels, $_; } close CHANNELS; @@ -81,7 +82,7 @@ sub update { # Pull cache manifests. foreach my $url (@channels) { print "pulling cache manifest from `$url'\n"; - system("@bindir@/nix-pull", "$url/MANIFEST") == 0 + system("@bindir@/nix-pull", "--skip-wrong-store", "$url/MANIFEST") == 0 or die "cannot pull cache manifest from `$url'"; } diff --git a/scripts/nix-pull.in b/scripts/nix-pull.in index 0af036f6f..c7c20fb9b 100644 --- a/scripts/nix-pull.in +++ b/scripts/nix-pull.in @@ -21,6 +21,9 @@ $libexecDir = "@libexecdir@" unless defined $libexecDir; my $stateDir = $ENV{"NIX_STATE_DIR"}; $stateDir = "@localstatedir@/nix" unless defined $stateDir; +my $storeDir = $ENV{"NIX_STORE_DIR"}; +$storeDir = "@storedir@" unless defined $storeDir; + # Prevent access problems in shared-stored installations. umask 0022; @@ -31,6 +34,8 @@ my %narFiles; my %patches; my %successors; +my $skipWrongStore = 0; + sub processURL { my $url = shift; @@ -45,6 +50,15 @@ sub processURL { die "manifest `$url' is too old (i.e., for Nix <= 0.7)\n"; } + if ($skipWrongStore) { + foreach my $path (keys %narFiles) { + if (substr($path, 0, length($storeDir) + 1) ne "$storeDir/") { + print STDERR "warning: manifest `$url' assumes a Nix store at a different location than $storeDir, skipping...\n"; + exit 0; + } + } + } + my $baseName = "unnamed"; if ($url =~ /\/([^\/]+)\/[^\/]+$/) { # get the forelast component $baseName = $1; @@ -62,7 +76,11 @@ sub processURL { while (@ARGV) { my $url = shift @ARGV; - processURL $url; + if ($url eq "--skip-wrong-store") { + $skipWrongStore = 1; + } else { + processURL $url; + } }