diff options
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/nix-prefetch-url.in | 8 | ||||
-rw-r--r-- | scripts/nix-pull.in | 82 | ||||
-rw-r--r-- | scripts/readmanifest.pm.in | 12 |
3 files changed, 45 insertions, 57 deletions
diff --git a/scripts/nix-prefetch-url.in b/scripts/nix-prefetch-url.in index 6a90e787c3f5..45b3ed7ee75c 100644 --- a/scripts/nix-prefetch-url.in +++ b/scripts/nix-prefetch-url.in @@ -25,13 +25,17 @@ test -e $tmpPath2 || mv $tmpPath1 $tmpPath2 # !!! race storeExpr=$( \ echo "(import @datadir@/nix/corepkgs/fetchurl) \ {url = $url; md5 = \"$hash\"; system = \"@system@\";}" \ - | nix-instantiate -) + | @bindir@/nix-instantiate -) # Realise it. -finalPath=$(nix-store -qnB --force-realise $storeExpr) +finalPath=$(@bindir@/nix-store -qnB --force-realise $storeExpr) echo "path is $finalPath" >&2 rm -rf $tmpPath2 || true echo $hash + +if test -n "$PRINT_PATH"; then + echo $finalPath +fi diff --git a/scripts/nix-pull.in b/scripts/nix-pull.in index 6472c7c64776..a802760a5293 100644 --- a/scripts/nix-pull.in +++ b/scripts/nix-pull.in @@ -10,18 +10,18 @@ do { $tmpdir = tmpnam(); } until mkdir $tmpdir, 0777; my $manifest = "$tmpdir/manifest"; -my $conffile = "@sysconfdir@/nix/prebuilts.conf"; +my $confFile = "@sysconfdir@/nix/prebuilts.conf"; #END { unlink $manifest; rmdir $tmpdir; } # Obtain URLs either from the command line or from a configuration file. -my %storepaths2urls; +my %storePaths2urls; my %urls2hashes; my %successors; sub doURL { my $url = shift; - processURL $manifest, $url, \%storepaths2urls, \%urls2hashes, \%successors; + processURL $manifest, $url, \%storePaths2urls, \%urls2hashes, \%successors; } if (scalar @ARGV > 0) { while (@ARGV) { @@ -29,7 +29,7 @@ if (scalar @ARGV > 0) { doURL $url; } } else { - open CONFFILE, "<$conffile"; + open CONFFILE, "<$confFile"; while (<CONFFILE>) { chomp; if (/^\s*(\S+)\s*(\#.*)?$/) { @@ -41,60 +41,44 @@ if (scalar @ARGV > 0) { } -# Create a Nix expression for the substitutes. -my $fullexpr = "["; - -my @storepaths; -foreach my $storepath (keys %storepaths2urls) { - # Construct a Nix expression that fetches and unpacks a - # Nix archive from the network. - my $url = $storepaths2urls{$storepath}; - my $hash = $urls2hashes{$url}; - my $fetch = - "(import @datadir@/nix/corepkgs/fetchurl) " . - "{url = $url; md5 = \"$hash\"; system = \"@system@\";}"; - my $nixexpr = - "((import @datadir@/nix/corepkgs/nar/unnar.nix) " . - "{narFile = ($fetch); outPath = \"$storepath\"; system = \"@system@\";}) "; - $fullexpr .= $nixexpr; # !!! O(n^2)? - push @storepaths, $storepath; -} +my $size = scalar (keys %storePaths2urls); +print "$size store paths in manifest\n"; -$fullexpr .= "]"; +# Instantiate a store expression that builds the substitute program +# (the program that fetches URLs and unpacks them into the store). +my $nixExpr = + "(import @datadir@/nix/corepkgs/nix-pull) " . + "{system = \"@system@\";}"; -# Instantiate store expressions from the Nix expressions we created above. -print STDERR "instantiating store expressions...\n"; -my $pid = open2(\*READ, \*WRITE, "@bindir@/nix-instantiate -") or die "cannot run nix-instantiate"; - -print WRITE $fullexpr; -close WRITE; -my $i = 0; -my %substitutes; -while (<READ>) { - chomp; - die unless /^\//; - my $subpath = $_; - die unless ($i < scalar @storepaths); - $substitutes{$storepaths[$i++]} = $subpath; -} - -waitpid $pid, 0; -$? == 0 or die "nix-instantiate failed"; +print STDERR "instantiating store expression...\n"; +my $storeExpr = `echo '$nixExpr' | @bindir@/nix-instantiate -` + or die "cannot instantiate Nix expression"; +chomp $storeExpr; # Register all substitutes. print STDERR "registering substitutes...\n"; -my @subs = %substitutes; -while (scalar @subs > 0) { - my $n = scalar @subs; - if ($n > 256) { $n = 256 }; - my @subs2 = @subs[0..$n - 1]; - @subs = @subs[$n..scalar @subs - 1]; - system "@bindir@/nix-store --substitute @subs2"; - if ($?) { die "`nix-store --substitute' failed"; } + +my $pid = open2(\*READ, \*WRITE, "@bindir@/nix-store --substitute") + or die "cannot run nix-store"; + +close READ; + +foreach my $storePath (keys %storePaths2urls) { + print WRITE "$storePath\n"; + print WRITE "$storeExpr\n"; + print WRITE "/fetch\n"; + print WRITE "2\n"; + print WRITE "$storePaths2urls{$storePath}\n"; + print WRITE "$urls2hashes{$storePaths2urls{$storePath}}\n"; } +close WRITE; + +waitpid $pid, 0; +$? == 0 or die "nix-store failed"; + # Register all successors. print STDERR "registering successors...\n"; diff --git a/scripts/readmanifest.pm.in b/scripts/readmanifest.pm.in index bca6c4c8acc5..3bda0f067b2f 100644 --- a/scripts/readmanifest.pm.in +++ b/scripts/readmanifest.pm.in @@ -3,7 +3,7 @@ use strict; sub processURL { my $manifest = shift; my $url = shift; - my $storepaths2urls = shift; + my $storePaths2urls = shift; my $urls2hashes = shift; my $successors = shift; @@ -18,7 +18,7 @@ sub processURL { my $inside = 0; - my $storepath; + my $storePath; my $narurl; my $hash; my @preds; @@ -31,7 +31,7 @@ sub processURL { if (!$inside) { if (/^\{$/) { $inside = 1; - undef $storepath; + undef $storePath; undef $narurl; undef $hash; @preds = (); @@ -41,16 +41,16 @@ sub processURL { if (/^\}$/) { $inside = 0; - $$storepaths2urls{$storepath} = $narurl; + $$storePaths2urls{$storePath} = $narurl; $$urls2hashes{$narurl} = $hash; foreach my $p (@preds) { - $$successors{$p} = $storepath; + $$successors{$p} = $storePath; } } elsif (/^\s*StorePath:\s*(\/\S+)\s*$/) { - $storepath = $1; + $storePath = $1; } elsif (/^\s*NarURL:\s*(\S+)\s*$/) { $narurl = $1; |