about summary refs log tree commit diff
path: root/scripts/nix-pull.in
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/nix-pull.in')
-rw-r--r--scripts/nix-pull.in81
1 files changed, 81 insertions, 0 deletions
diff --git a/scripts/nix-pull.in b/scripts/nix-pull.in
new file mode 100644
index 000000000000..a75c1f258b1e
--- /dev/null
+++ b/scripts/nix-pull.in
@@ -0,0 +1,81 @@
+#! /usr/bin/perl -w
+
+my $tmpfile = "@localstatedir@/nix/pull.tmp";
+my $conffile = "@sysconfdir@/nix/prebuilts.conf";
+
+my @subs;
+my @sucs;
+
+open CONFFILE, "<$conffile";
+
+while (<CONFFILE>) {
+
+    chomp;
+    if (/^\s*(\S+)\s*(\#.*)?$/) {
+        my $url = $1;
+
+        print "obtaining list of Nix archives at $url...\n";
+
+        system "wget '$url' -O '$tmpfile' 2> /dev/null"; # !!! escape
+        if ($?) { die "`wget' failed"; }
+        
+        open INDEX, "<$tmpfile";
+
+        while (<INDEX>) {
+            # Get all links to prebuilts, that is, file names of the
+            # form foo-HASH-HASH.tar.bz2.
+            next unless (/HREF=\"([^\"]*)\"/);
+            my $fn = $1;
+            next if $fn =~ /\.\./;
+            next if $fn =~ /\//;
+            next unless $fn =~ /-([0-9a-z]{32})(-s-([0-9a-z]{32}))?\.nar.bz2$/;
+            my $hash = $1;
+            my $fshash = $3;
+
+            print "registering $hash -> $url/$fn\n";
+
+            # Construct a Fix expression that fetches and unpacks a
+            # Nix archive from the network.
+            my $fetch =
+              "App(IncludeFix(\"fetchurl/fetchurl.fix\"), " .
+              "[(\"url\", \"$url/$fn\"), (\"hash\", \"\")])";
+            my $fixexpr = 
+                "App(IncludeFix(\"nar/unnar.fix\"), " .
+                "[ (\"nar\", $fetch)" .
+                ", (\"name\", \"fetched-$hash\")" .
+                "])";
+            
+            my $fixfile = "/tmp/nix-pull-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})$/;
+
+            push @subs, $hash;
+            push @subs, $nhash;
+
+            # Does the name encode a successor relation?
+            if (defined $fshash) {
+                print "NORMAL $fshash -> $hash\n";
+                push @sucs, $fshash;
+                push @sucs, $hash;
+            }
+        }
+
+        close INDEX;
+
+        unlink $tmpfile;
+    }
+
+}
+
+system "nix --substitute @subs";
+if ($?) { die "`nix --substitute' failed"; }
+
+system "nix --successor @sucs";
+if ($?) { die "`nix --successor' failed"; }