#! /usr/bin/perl -w 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 =~ /^\//; # Get all paths referenced by the normalisation of the given # Nix expression. system "nix --install $id > /dev/null"; if ($?) { die "`nix --install' failed"; } open PATHS, "nix --query --requisites --include-successors $id 2> /dev/null |" or die "nix -qr"; while () { 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) { die unless ($path =~ /\/[0-9a-z]{32}.*$/); print "$path\n"; # Construct a Fix expression that creates a Nix archive. my $fixexpr = "Call(IncludeFix(\"nar/nar.fix\"), " . "[ (\"path\", Closure([\"$path\"], [(\"$path\", [])]))" . "])"; print FIX "," unless ($first); $first = 0; print FIX $fixexpr; } } 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 () { chomp; die unless /^\//; push @nids, $_; } close NIDS; # Realise the Nix expression. print STDERR "creating archives...\n"; 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 () { chomp; die unless (/^\//); 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 = ; chomp $hash; $hash =~ /^[0-9a-z]{32}$/ or die "invalid hash"; close MD5; print MANIFEST "{\n"; print MANIFEST " StorePath: $storepath\n"; print MANIFEST " NarName: $narname\n"; print MANIFEST " MD5: $hash\n"; if ($storepath =~ /\.nix$/) { open PREDS, "nix --query --predecessors $storepath |" or die "cannot run nix"; while () { 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/"; }