about summary refs log tree commit diff
path: root/scripts/nix-push.in
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/nix-push.in')
-rw-r--r--scripts/nix-push.in110
1 files changed, 78 insertions, 32 deletions
diff --git a/scripts/nix-push.in b/scripts/nix-push.in
index d9f5cf756b2f..c0aba5322b8f 100644
--- a/scripts/nix-push.in
+++ b/scripts/nix-push.in
@@ -1,21 +1,32 @@
 #! /usr/bin/perl -w
 
-my $fixfile = "/tmp/nix-push-tmp.fix";
+use strict;
+use POSIX qw(tmpnam);
+
+my $tmpdir;
+do { $tmpdir = tmpnam(); }
+until mkdir $tmpdir, 0777;
+
+my $fixfile = "$tmpdir/create-nars.fix";
+my $manifest = "$tmpdir/MANIFEST";
+
+END { unlink $manifest; unlink $fixfile; rmdir $tmpdir; }
+
 open FIX, ">$fixfile";
 print FIX "[";
 my $first = 1;
 
+my @paths;
+
 foreach my $id (@ARGV) {
 
-    die unless $id =~ /^([0-9a-z]{32})$/;
+    die unless $id =~ /^\//;
 
     # Get all paths referenced by the normalisation of the given 
     # Nix expression.
-    system "nix --install $id";
+    system "nix --install $id > /dev/null";
     if ($?) { die "`nix --install' failed"; }
 
-    my @paths;
-
     open PATHS, "nix --query --requisites --include-successors $id 2> /dev/null |" or die "nix -qr";
     while (<PATHS>) {
         chomp;
@@ -24,35 +35,17 @@ foreach my $id (@ARGV) {
     }
     close PATHS;
 
-    # Also add all normal forms that are contained in these paths.
-#    open PATHS, "nix --query --generators --path @paths |" or die "nix -qg";
-#    while (<PATHS>) {
-#	chomp;
-#        die "bad: $_" unless /^\//;
-#	push @paths, $_;
-#    }
-#    close PATHS;
-
     # For each path, create a Fix expression that turns the path into
     # a Nix archive.
     foreach my $path (@paths) {
 
-	next unless ($path =~ /\/([0-9a-z]{32})[^\/]*/);
+	die unless ($path =~ /\/[0-9a-z]{32}.*$/);
 	print "$path\n";
-	my $pathid = $1;
-
-        # Construct a name for the Nix archive.  If the file is an
-        # fstate successor, encode this into the name.
-        my $name = $pathid;
-        if ($path =~ /-s-([0-9a-z]{32}).nix$/) {
-            $name = "$name-s-$1";
-        }
-        $name = $name . ".nar.bz2";
 
         # Construct a Fix expression that creates a Nix archive.
         my $fixexpr = 
-          "App(IncludeFix(\"nar/nar.fix\"), " .
-          "[ (\"path\", Closure([\"$path\"], [(\"$path\", \"$pathid\", [])]))" .
+          "Call(IncludeFix(\"nar/nar.fix\"), " .
+          "[ (\"path\", Closure([\"$path\"], [(\"$path\", [])]))" .
           "])";
 	
 	print FIX "," unless ($first);
@@ -65,32 +58,85 @@ foreach my $id (@ARGV) {
 print FIX "]";
 close FIX;
 
+
 # Instantiate a Nix expression from the Fix expression.
 my @nids;
 print STDERR "running fix...\n";
 open NIDS, "fix $fixfile |" or die "cannot run fix";
 while (<NIDS>) {
     chomp;
-    die unless /^([0-9a-z]{32})$/;
-    push @nids, $1;
+    die unless /^\//;
+    push @nids, $_;
 }
+close NIDS;
 
 
 # Realise the Nix expression.
-my @pushlist;
 print STDERR "creating archives...\n";
-system "nix --install @nids > /dev/null";
+system "nix --install -v @nids > /dev/null";
 if ($?) { die "`nix --install' failed"; }
 
+my @narpaths;
 open NIDS, "nix --query --list @nids |" or die "cannot run nix";
 while (<NIDS>) {
     chomp;
     die unless (/^\//);
-    print "$_\n";
-    push @pushlist, "$_/*";
+    push @narpaths, "$_";
 }
+close NIDS;
+
+    
+# Create the manifest.
+print STDERR "creating manifest...\n";
+
+open MANIFEST, ">$manifest";
+
+my @pushlist;
+push @pushlist, $manifest;
+
+for (my $n = 0; $n < scalar @paths; $n++) {
+    my $storepath = $paths[$n];
+    my $nardir = $narpaths[$n];
+    
+    $storepath =~ /\/([^\/]*)$/;
+    my $basename = $1;
+    defined $basename or die;
+
+    my $narname = "$basename.nar.bz2";
+
+    my $narfile = "$nardir/$narname";
+    (-f $narfile) or die "narfile for $storepath not found";
+    push @pushlist, $narfile;
+
+    open MD5, "$nardir/md5" or die "cannot open hash";
+    my $hash = <MD5>;
+    chomp $hash;
+    $hash =~ /^[0-9a-z]{32}$/ or die "invalid hash";
+    close MD5;
+
+    print MANIFEST "{\n";
+    print MANIFEST "  StorePath: $storepath\n";
+    print MANIFEST "  NarPath: $basename\n";
+    print MANIFEST "  MD5: $hash\n";
+
+    if ($storepath =~ /\.nix$/) {
+	open PREDS, "nix --query --predecessors $storepath |" or die "cannot run nix";
+	while (<PREDS>) {
+	    chomp;
+	    die unless (/^\//);
+	    print MANIFEST "  SuccOf: $_\n";
+	}
+	close PREDS;
+    }
+
+    print MANIFEST "}\n";
+}
+
+close MANIFEST;
+
 
 # Push the prebuilts to the server. !!! FIXME
+print STDERR "pushing to server...\n";
 if (scalar @pushlist > 0) {
     system "rsync -av -e ssh @pushlist eelco\@losser.st-lab.cs.uu.nl:/home/eelco/public_html/nix-dist/";
 }