#! /usr/bin/perl -w my $tmpfile = "@localstatedir@/nix/pull.tmp"; my $conffile = "@sysconfdir@/nix/prebuilts.conf"; my @ids; my @subs; my @sucs; my $fixfile = "/tmp/nix-pull-tmp.fix"; open FIX, ">$fixfile"; print FIX "["; my $first = 1; 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})(.*)\.nar\.bz2$/; my $hash = $1; my $id = $2; my $outname = $3; my $fsid; if ($outname =~ /^-/) { next unless $outname =~ /^-((s-([0-9a-z]{32}))?.*)$/; $outname = $1; $fsid = $3; } else { $outname = "unnamed"; } print STDERR "$id ($outname)\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\", \"$outname\")" . ", (\"id\", \"$id\")" . "])"; print FIX "," unless ($first); $first = 0; print FIX $fixexpr; push @ids, $id; # Does the name encode a successor relation? if (defined $fsid) { push @sucs, $fsid; push @sucs, $id; } } close INDEX; unlink $tmpfile; } } print FIX "]"; close FIX; # Instantiate Nix expressions from the Fix expressions we created above. print STDERR "running fix...\n"; open NIDS, "fix $fixfile |" or die "cannot run fix"; my $i = 0; while () { chomp; die unless /^([0-9a-z]{32})$/; $nid = $1; die unless ($i < scalar @ids); $id = $ids[$i++]; push @subs, $id; push @subs, $nid; } # Register all substitutes. print STDERR "registering substitutes...\n"; system "nix --substitute @subs"; if ($?) { die "`nix --substitute' failed"; } # Register all successors. print STDERR "registering successors...\n"; system "nix --successor @sucs"; if ($?) { die "`nix --successor' failed"; }