about summary refs log tree commit diff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/nix-pull.in23
1 files changed, 14 insertions, 9 deletions
diff --git a/scripts/nix-pull.in b/scripts/nix-pull.in
index 1fc5d863a225..d7b0523d6c95 100644
--- a/scripts/nix-pull.in
+++ b/scripts/nix-pull.in
@@ -1,5 +1,7 @@
 #! /usr/bin/perl -w
 
+use IPC::Open2;
+
 my $tmpfile = "@localstatedir@/nix/pull.tmp";
 my $conffile = "@sysconfdir@/nix/prebuilts.conf";
 
@@ -7,9 +9,7 @@ my @ids;
 my @subs;
 my @sucs;
 
-my $fixfile = "/tmp/nix-pull-tmp.fix";
-open FIX, ">$fixfile";
-print FIX "[";
+my $fullexpr = "[";
 my $first = 1;
 
 open CONFFILE, "<$conffile";
@@ -61,9 +61,9 @@ while (<CONFFILE>) {
                 ", (\"id\", \"$id\")" .
                 "])";
             
-	    print FIX "," unless ($first);
+	    if (!$first) { $fullexpr .= "," };
 	    $first = 0;
-	    print FIX $fixexpr;
+	    $fullexpr .= $fixexpr; # !!! O(n^2)?
 
 	    push @ids, $id;
 
@@ -81,14 +81,16 @@ while (<CONFFILE>) {
 
 }
 
-print FIX "]";
-close FIX;
+$fullexpr .= "]";
 
 # Instantiate Nix expressions from the Fix expressions we created above.
 print STDERR "running fix...\n";
-open NIDS, "fix $fixfile |" or die "cannot run fix";
+$pid = open2(\*READ, \*WRITE, "fix -") or die "cannot run fix";
+
+print WRITE $fullexpr;
+close WRITE;
 my $i = 0;
-while (<NIDS>) {
+while (<READ>) {
     chomp;
     die unless /^([0-9a-z]{32})$/;
     $nid = $1;
@@ -98,6 +100,9 @@ while (<NIDS>) {
     push @subs, $nid;
 }
 
+waitpid $pid, 0;
+$? == 0 or die "fix failed";
+
 # Register all substitutes.
 print STDERR "registering substitutes...\n";
 system "nix --substitute @subs";