aboutsummaryrefslogtreecommitdiff
path: root/scripts/nix-push
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/nix-push')
-rw-r--r--scripts/nix-push60
1 files changed, 60 insertions, 0 deletions
diff --git a/scripts/nix-push b/scripts/nix-push
new file mode 100644
index 000000000..14b7e2834
--- /dev/null
+++ b/scripts/nix-push
@@ -0,0 +1,60 @@
+#! /usr/bin/perl -w
+
+my @pushlist;
+
+foreach my $hash (@ARGV) {
+
+ die unless $hash =~ /^([0-9a-z]{32})$/;
+
+ # Get all paths referenced by the normalisation of the given
+ # fstate expression.
+ my @paths;
+ open PATHS, "nix -qrh $hash 2> /dev/null |" or die "nix -qrh";
+ while (<PATHS>) {
+ chomp;
+ next unless /^\//;
+ push @paths, $_;
+ }
+ close PATHS;
+
+ # For each path, create a Fix expression that turns the path into
+ # a Nix archive.
+ foreach my $path (@paths) {
+
+ # Hash the path.
+ my $phash = `nix-hash $path`;
+ $? and die "nix-hash";
+ chomp $phash;
+ die unless $phash =~ /^([0-9a-z]{32})$/;
+
+ # Construct a Fix expression that creates a Nar archive.
+ my $fixexpr =
+ "App(IncludeFix(\"nar/nar.fix\"), " .
+ "[ (\"path\", Path(\"$path\", Hash(\"$phash\"), [Include(\"$hash\")]))" .
+ ", (\"name\", \"$phash.nar\")" .
+ "])";
+
+ my $fixfile = "/tmp/nix-push-tmp.fix";
+ open FIX, ">$fixfile";
+ print FIX $fixexpr;
+ close FIX;
+
+ # Instantiate a Nix expression from the Fix expression.
+ my $nhash = `fix $fixfile`;
+ $? and die "instantiating Nix archive expression";
+ chomp $nhash;
+ die unless $nhash =~ /^([0-9a-z]{32})$/;
+
+ # Realise the Nix expression.
+ my $npath = `nix -qph $nhash 2> /dev/null`;
+ $? and die "creating Nix archive";
+ chomp $npath;
+
+ push @pushlist, $npath;
+
+ print "$path -> $npath\n";
+ }
+}
+
+# Push the prebuilts to the server. !!! FIXME
+system "rsync -av -e ssh @pushlist eelco\@losser.st-lab.cs.uu.nl:/home/eelco/public_html/nix-dist/";