1d1c3691d2
hash for which no local expansion is available, Nix can execute a `substitute' which should produce a path with such a hash. This is policy-free since Nix does not in any way specify how the substitute should work, i.e., it's an arbitrary (unnormalised) fstate expression. For example, `nix-pull' registers substitutes that fetch Nix archives from the network (through `wget') and unpack them, but any other method is possible as well. This is an improvement over the old Nix sharing scheme, which had a policy (fetching through `wget') built in. The sharing scheme doesn't work completely yet because successors from fstate rewriting have to be registered on the receiving side. Probably the whole successor stuff can be folded up into the substitute mechanism; this would be a nice simplification.
67 lines
1.7 KiB
Perl
67 lines
1.7 KiB
Perl
#! /usr/bin/perl -w
|
|
|
|
my $prefix = $ENV{"NIX"} || "/tmp/nix"; # !!! use prefix
|
|
my $etcdir = "$prefix/etc/nix";
|
|
my $tmpfile = "$prefix/var/nix/pull.tmp";
|
|
|
|
my $conffile = "$etcdir/prebuilts.conf";
|
|
|
|
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})-([0-9a-z]{32})\.nar/;
|
|
my $hash = $2;
|
|
|
|
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})$/;
|
|
|
|
system "nix --substitute $hash $nhash";
|
|
if ($?) { die "`nix --substitute' failed"; }
|
|
}
|
|
|
|
close INDEX;
|
|
|
|
unlink $tmpfile;
|
|
}
|
|
|
|
}
|