#! /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})(-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\"), (\"md5\", \"ignore\")])"; 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"; }