forked from lix-project/lix
![Eelco Dolstra](/assets/img/avatar_default.png)
substituting for (obvious, really). * For greater efficiency, nix-pull/unnar will place the output in a path that is probably the same as what is actually needed, thus preventing a path copy. * Even if a output id is given in a Fix package expression, ensure that the resulting Nix derive expression has a different id. This is because Nix expressions that are semantically equivalent (i.e., build the same result) might be different w.r.t. efficiency or divergence. It is absolutely vital for the substitute mechanism that such expressions are not used interchangeably.
92 lines
2.5 KiB
Perl
92 lines
2.5 KiB
Perl
#! /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})-([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 = "";
|
|
}
|
|
|
|
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\", \"$outname\")" .
|
|
", (\"id\", \"$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"; }
|