aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2004-06-21 09:51:23 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2004-06-21 09:51:23 +0000
commit37ee6cef992c1a80e790a294b75db8c116be8bbb (patch)
treec9296a3d00ce0768e6200d29b39d11beab48c406
parent3f3a3ae87b3d72d52842d9a2ffe7010f5b0066b9 (diff)
* Adapted nix-pull to use the new substitute mechanism.
-rw-r--r--configure.ac1
-rw-r--r--corepkgs/Makefile.am2
-rw-r--r--corepkgs/nix-pull/Makefile.am11
-rw-r--r--corepkgs/nix-pull/builder.sh.in34
-rw-r--r--corepkgs/nix-pull/default.nix7
-rw-r--r--scripts/nix-prefetch-url.in8
-rw-r--r--scripts/nix-pull.in82
-rw-r--r--scripts/readmanifest.pm.in12
8 files changed, 99 insertions, 58 deletions
diff --git a/configure.ac b/configure.ac
index 4b221bf31..851375194 100644
--- a/configure.ac
+++ b/configure.ac
@@ -152,6 +152,7 @@ AC_CONFIG_FILES([Makefile
corepkgs/nar/Makefile
corepkgs/buildenv/Makefile
corepkgs/channels/Makefile
+ corepkgs/nix-pull/Makefile
doc/Makefile
doc/manual/Makefile
misc/Makefile
diff --git a/corepkgs/Makefile.am b/corepkgs/Makefile.am
index c9ea11cef..ca4cea2fc 100644
--- a/corepkgs/Makefile.am
+++ b/corepkgs/Makefile.am
@@ -1 +1 @@
-SUBDIRS = fetchurl nar buildenv channels
+SUBDIRS = fetchurl nar buildenv channels nix-pull
diff --git a/corepkgs/nix-pull/Makefile.am b/corepkgs/nix-pull/Makefile.am
new file mode 100644
index 000000000..91adb4853
--- /dev/null
+++ b/corepkgs/nix-pull/Makefile.am
@@ -0,0 +1,11 @@
+all-local: builder.sh
+
+install-exec-local:
+ $(INSTALL) -d $(DESTDIR)$(datadir)/nix/corepkgs
+ $(INSTALL) -d $(DESTDIR)$(datadir)/nix/corepkgs/nix-pull
+ $(INSTALL_DATA) default.nix $(DESTDIR)$(datadir)/nix/corepkgs/nix-pull
+ $(INSTALL_PROGRAM) builder.sh $(DESTDIR)$(datadir)/nix/corepkgs/nix-pull
+
+include ../../substitute.mk
+
+EXTRA_DIST = default.nix builder.sh.in
diff --git a/corepkgs/nix-pull/builder.sh.in b/corepkgs/nix-pull/builder.sh.in
new file mode 100644
index 000000000..cc1a125d8
--- /dev/null
+++ b/corepkgs/nix-pull/builder.sh.in
@@ -0,0 +1,34 @@
+#! @shell@ -e
+
+export PATH=/bin:/usr/bin
+
+mkdir $out
+
+cat > $out/fetch <<EOF
+#! @shell@ -e
+
+export PATH=/bin:/usr/bin
+
+echo "downloading \$2..."
+
+export PRINT_PATH=1
+result=(\$(@bindir@/nix-prefetch-url \$2))
+
+hash=\${result[0]}
+path=\${result[1]}
+
+if test "\$hash" != "\$3"; then
+ echo "hash is \$hash, expected \$3"
+ exit 1
+fi
+
+echo "unpacking into \$1..."
+
+if ! @bunzip2@ < "\$path" | @bindir@/nix-store --restore "\$1"; then
+ exit 1
+fi
+
+exit 0
+EOF
+
+chmod +x $out/fetch
diff --git a/corepkgs/nix-pull/default.nix b/corepkgs/nix-pull/default.nix
new file mode 100644
index 000000000..700d72131
--- /dev/null
+++ b/corepkgs/nix-pull/default.nix
@@ -0,0 +1,7 @@
+{system}:
+
+derivation {
+ name = "nix-pull";
+ builder = ./builder.sh;
+ inherit system;
+}
diff --git a/scripts/nix-prefetch-url.in b/scripts/nix-prefetch-url.in
index 6a90e787c..45b3ed7ee 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 6472c7c64..a802760a5 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 bca6c4c8a..3bda0f067 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;