about summary refs log tree commit diff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/nix-push.in55
-rw-r--r--scripts/readmanifest.pm.in72
2 files changed, 86 insertions, 41 deletions
diff --git a/scripts/nix-push.in b/scripts/nix-push.in
index 9f1d5d22b459..2c5fb792f556 100644
--- a/scripts/nix-push.in
+++ b/scripts/nix-push.in
@@ -2,6 +2,7 @@
 
 use strict;
 use POSIX qw(tmpnam);
+use readmanifest;
 
 my $tmpdir;
 do { $tmpdir = tmpnam(); }
@@ -25,7 +26,7 @@ my $manifest_put_url = shift @ARGV;
 
 # From the given store expressions, determine the requisite store
 # paths.
-my %storepaths;
+my %storePaths;
 
 foreach my $storeexpr (@ARGV) {
     die unless $storeexpr =~ /^\//;
@@ -39,12 +40,12 @@ foreach my $storeexpr (@ARGV) {
     while (<PATHS>) {
         chomp;
         die "bad: $_" unless /^\//;
-        $storepaths{$_} = "";
+        $storePaths{$_} = "";
     }
     close PATHS;
 }
 
-my @storepaths = keys %storepaths;
+my @storePaths = keys %storePaths;
 
 
 # For each path, create a Nix expression that turns the path into
@@ -52,14 +53,14 @@ my @storepaths = keys %storepaths;
 open NIX, ">$nixfile";
 print NIX "[";
 
-foreach my $storepath (@storepaths) {
-    die unless ($storepath =~ /\/[0-9a-z]{32}.*$/);
+foreach my $storePath (@storePaths) {
+    die unless ($storePath =~ /\/[0-9a-z]{32}.*$/);
 
     # Construct a Nix expression that creates a Nix archive.
     my $nixexpr = 
         "((import @datadir@/nix/corepkgs/nar/nar.nix) " .
-        # !!! $storepath should be represented as a closure
-        "{path = \"$storepath\"; system = \"@system@\";}) ";
+        # !!! $storePath should be represented as a closure
+        "{path = \"$storePath\"; system = \"@system@\";}) ";
     
     print NIX $nixexpr;
 }
@@ -108,21 +109,23 @@ while (scalar @tmp > 0) {
 # Create the manifest.
 print STDERR "creating manifest...\n";
 
-open MANIFEST, ">$manifest";
+my %narFiles;
+my %patches;
+my %successors;
 
 my @nararchives;
-for (my $n = 0; $n < scalar @storepaths; $n++) {
-    my $storepath = $storepaths[$n];
+for (my $n = 0; $n < scalar @storePaths; $n++) {
+    my $storePath = $storePaths[$n];
     my $nardir = $narpaths[$n];
     
-    $storepath =~ /\/([^\/]*)$/;
+    $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";
+    (-f $narfile) or die "narfile for $storePath not found";
     push @nararchives, $narfile;
 
     open MD5, "$nardir/narbz2-hash" or die "cannot open narbz2-hash";
@@ -137,34 +140,34 @@ for (my $n = 0; $n < scalar @storepaths; $n++) {
     $narHash =~ /^[0-9a-z]{32}$/ or die "invalid hash";
     close MD5;
     
-    my $size = (stat $narfile)[7];
+    my $narbz2Size = (stat $narfile)[7];
 
-    print MANIFEST "{\n";
-    print MANIFEST "  StorePath: $storepath\n";
-    print MANIFEST "  NarURL: $archives_get_url/$narname\n";
-    print MANIFEST "  MD5: $narbz2Hash\n";
-    print MANIFEST "  NarHash: $narHash\n";
-    print MANIFEST "  Size: $size\n";
-
-    if ($storepath =~ /\.store$/) {
-        open PREDS, "@bindir@/nix-store --query --predecessors $storepath |" or die "cannot run nix";
+    $narFiles{$storePath} = [
+        { url => $archives_get_url/$narname
+        , hash => $narbz2Hash
+        , size => $narbz2Size
+        , narHash => $narHash
+        }
+    ];
+                            
+    if ($storePath =~ /\.store$/) {
+        open PREDS, "@bindir@/nix-store --query --predecessors $storePath |" or die "cannot run nix";
         while (<PREDS>) {
             chomp;
             die unless (/^\//);
             my $pred = $_;
             # Only include predecessors that are themselves being
             # pushed.
-            if (defined $storepaths{$pred}) {
-                print MANIFEST "  SuccOf: $pred\n";
+            if (defined $storePaths{$pred}) {
+                $successors{$pred} = $storePath;
             }
         }
         close PREDS;
     }
 
-    print MANIFEST "}\n";
 }
 
-close MANIFEST;
+writeManifest $manifest, \%narFiles, \%patches, \%successors;
 
 
 # Upload the archives.
diff --git a/scripts/readmanifest.pm.in b/scripts/readmanifest.pm.in
index 7f41bd55f267..6e2477994a1d 100644
--- a/scripts/readmanifest.pm.in
+++ b/scripts/readmanifest.pm.in
@@ -1,5 +1,6 @@
 use strict;
 
+
 sub readManifest {
     my $manifest = shift;
     my $narFiles = shift;
@@ -27,28 +28,22 @@ sub readManifest {
         next if (/^$/);
 
         if (!$inside) {
-            if (/^\{$/) {
-                $type = "narfile";
+
+            if (/^\s*(\w*)\s*\{$/) {
+                $type = $1;
+                $type = "narfile" if $type eq "";
                 $inside = 1;
                 undef $storePath;
                 undef $url;
                 undef $hash;
-                $size = 999999999;
+                undef $size;
                 @preds = ();
                 undef $narHash;
-	    }
-            elsif (/^patch \{$/) {
-                $type = "patch";
-                $inside = 1;
-                undef $url;
-                undef $hash;
-                undef $size;
                 undef $basePath;
                 undef $baseHash;
                 undef $patchType;
-                undef $narHash;
-            }
-            else { die "bad line: $_"; }
+	    }
+
         } else {
             
             if (/^\}$/) {
@@ -107,7 +102,7 @@ sub readManifest {
                         push @{$patchList},
                             { url => $url, hash => $hash, size => $size
                             , basePath => $basePath, baseHash => $baseHash
-                            , narHash => $narHash
+                            , narHash => $narHash, type => $patchType
                             };
                     }
                     
@@ -129,7 +124,6 @@ sub readManifest {
             elsif (/^\s*NarURL:\s*(\S+)\s*$/) { $url = $1; }
             elsif (/^\s*MD5:\s*(\S+)\s*$/) { $hash = $1; }
 
-            else { die "bad line: $_"; }
         }
     }
 
@@ -137,4 +131,52 @@ sub readManifest {
 }
 
 
+sub writeManifest
+{
+    my $manifest = shift;
+    my $narFiles = shift;
+    my $patches = shift;
+    my $successors = shift;
+
+    open MANIFEST, ">$manifest";
+
+    foreach my $storePath (keys %{$narFiles}) {
+        my $narFileList = $$narFiles{$storePath};
+        foreach my $narFile (@{$narFileList}) {
+            print MANIFEST "{\n";
+            print MANIFEST "  StorePath: $storePath\n";
+            print MANIFEST "  NarURL: $narFile->{url}\n";
+            print MANIFEST "  MD5: $narFile->{hash}\n";
+            print MANIFEST "  NarHash: $narFile->{narHash}\n";
+            print MANIFEST "  Size: $narFile->{size}\n";
+            foreach my $p (keys %{$successors}) { # !!! quadratic
+                if ($$successors{$p} eq $storePath) {
+                    print MANIFEST "  SuccOf: $p\n";
+                }
+            }
+            print MANIFEST "}\n";
+        }
+    }
+    
+    foreach my $storePath (keys %{$patches}) {
+        my $patchList = $$patches{$storePath};
+        foreach my $patch (@{$patchList}) {
+            print MANIFEST "patch {\n";
+            print MANIFEST "  StorePath: $storePath\n";
+            print MANIFEST "  NarURL: $patch->{url}\n";
+            print MANIFEST "  MD5: $patch->{hash}\n";
+            print MANIFEST "  NarHash: $patch->{narHash}\n";
+            print MANIFEST "  Size: $patch->{size}\n";
+            print MANIFEST "  BasePath: $patch->{basePath}\n";
+            print MANIFEST "  BaseHash: $patch->{baseHash}\n";
+            print MANIFEST "  Type: $patch->{patchType}\n";
+            print MANIFEST "}\n";
+        }
+    }
+    
+    
+    close MANIFEST;
+}
+
+
 return 1;