diff options
Diffstat (limited to 'scripts/nix-pull.in')
-rw-r--r-- | scripts/nix-pull.in | 81 |
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"; } |