#! /usr/bin/perl -w my $tmpfile = "@localstatedir@/nix/pull.tmp"; my $conffile = "@sysconfdir@/nix/prebuilts.conf"; my @subs; my @sucs; open CONFFILE, "<$conffile"; while () { 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 () { # 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})-([0-9a-z]{32})(-s-([0-9a-z]{32}))?.*\.nar\.bz2$/; my $hash = $1; my $id = $2; my $fsid = $4; print "registering $id -> $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\"), (\"md5\", \"$hash\")])"; my $fixexpr = "App(IncludeFix(\"nar/unnar.fix\"), " . "[ (\"nar\", $fetch)" . ", (\"name\", \"fetched-$id\")" . "])"; my $fixfile = "/tmp/nix-pull-tmp.fix"; open FIX, ">$fixfile"; print FIX $fixexpr; close FIX; # Instantiate a Nix expression from the Fix expression. my $nid = `fix $fixfile`; $? and die "instantiating Nix archive expression"; chomp $nid; die unless $nid =~ /^([0-9a-z]{32})$/; push @subs, $id; push @subs, $nid; # Does the name encode a successor relation? if (defined $fsid) { print "NORMAL $fsid -> $id\n"; push @sucs, $fsid; push @sucs, $id; } } close INDEX; unlink $tmpfile; } } system "nix --substitute @subs"; if ($?) { die "`nix --substitute' failed"; } system "nix --successor @sucs"; if ($?) { die "`nix --successor' failed"; }