diff --git a/scripts/nix-push.in b/scripts/nix-push.in index 9f1d5d22b4..2c5fb792f5 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 () { 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 () { 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 7f41bd55f2..6e2477994a 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;