nix-channel: Use binary caches advertised by channels
Channels can now advertise a binary cache by creating a file <channel-url>/binary-cache-url. The channel unpacker puts these in its "binary-caches" subdirectory. Thus, the URLS of the binary caches for the channels added by root appear in /nix/var/nix/profiles/per-user/eelco/channels/binary-caches/*. The binary cache substituter reads these and adds them to the list of binary caches.
This commit is contained in:
parent
79bba3782c
commit
5170c5691a
4 changed files with 49 additions and 20 deletions
|
@ -6,19 +6,23 @@ let
|
||||||
''
|
''
|
||||||
mkdir $out
|
mkdir $out
|
||||||
cd $out
|
cd $out
|
||||||
${bzip2} -d < $src | ${tar} xf - --warning=no-timestamp
|
${bzip2} -d < $src | ${tar} xf - --warning=no-timestamp
|
||||||
mv * $out/$channelName
|
mv * $out/$channelName
|
||||||
|
if [ -n "$binaryCacheURL" ]; then
|
||||||
|
mkdir $out/binary-caches
|
||||||
|
echo -n "$binaryCacheURL" > $out/binary-caches/$channelName
|
||||||
|
fi
|
||||||
'';
|
'';
|
||||||
|
|
||||||
in
|
in
|
||||||
|
|
||||||
{ name, channelName, src }:
|
{ name, channelName, src, binaryCacheURL ? "" }:
|
||||||
|
|
||||||
derivation {
|
derivation {
|
||||||
system = builtins.currentSystem;
|
system = builtins.currentSystem;
|
||||||
builder = shell;
|
builder = shell;
|
||||||
args = [ "-e" builder ];
|
args = [ "-e" builder ];
|
||||||
inherit name channelName src;
|
inherit name channelName src binaryCacheURL;
|
||||||
|
|
||||||
PATH = "${nixBinDir}:${coreutils}";
|
PATH = "${nixBinDir}:${coreutils}";
|
||||||
|
|
||||||
|
|
|
@ -329,6 +329,18 @@ build-use-chroot = /dev /proc /bin</programlisting>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
|
||||||
|
<varlistentry><term><literal>binary-caches-files</literal></term>
|
||||||
|
|
||||||
|
<listitem><para>A list of names of files that will be read to
|
||||||
|
obtain additional binary cache URLs. The default is
|
||||||
|
<literal>/nix/var/nix/profiles/per-user/root/channels/binary-caches/*</literal>,
|
||||||
|
which ensures that Nix will use the binary caches corresponding to
|
||||||
|
the channels installed by root. Do not set this option to read
|
||||||
|
files created by untrusted users!</para></listitem>
|
||||||
|
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
|
||||||
<varlistentry><term><literal>trusted-binary-caches</literal></term>
|
<varlistentry><term><literal>trusted-binary-caches</literal></term>
|
||||||
|
|
||||||
<listitem><para>A list of URLs of binary caches, separated by
|
<listitem><para>A list of URLs of binary caches, separated by
|
||||||
|
|
|
@ -176,6 +176,16 @@ sub getAvailableCaches {
|
||||||
($Nix::Config::config{"binary-caches"}
|
($Nix::Config::config{"binary-caches"}
|
||||||
// ($Nix::Config::storeDir eq "/nix/store" ? "http://nixos.org/binary-cache" : ""));
|
// ($Nix::Config::storeDir eq "/nix/store" ? "http://nixos.org/binary-cache" : ""));
|
||||||
|
|
||||||
|
my $urlsFiles = $Nix::Config::config{"binary-cache-files"}
|
||||||
|
// "/nix/var/nix/profiles/per-user/root/channels/binary-caches/*";
|
||||||
|
foreach my $urlFile (glob $urlsFiles) {
|
||||||
|
next unless -f $urlFile;
|
||||||
|
open FILE, "<$urlFile" or die "cannot open ‘$urlFile’\n";
|
||||||
|
my $url = <FILE>; chomp $url;
|
||||||
|
close FILE;
|
||||||
|
push @urls, strToList($url);
|
||||||
|
}
|
||||||
|
|
||||||
# Allow Nix daemon users to override the binary caches to a subset
|
# Allow Nix daemon users to override the binary caches to a subset
|
||||||
# of those listed in the config file. Note that ‘untrusted-*’
|
# of those listed in the config file. Note that ‘untrusted-*’
|
||||||
# denotes options passed by the client.
|
# denotes options passed by the client.
|
||||||
|
|
|
@ -22,7 +22,7 @@ my $nixDefExpr = "$home/.nix-defexpr";
|
||||||
my $userName = getpwuid($<) or die "cannot figure out user name";
|
my $userName = getpwuid($<) or die "cannot figure out user name";
|
||||||
my $profile = "$Nix::Config::stateDir/profiles/per-user/$userName/channels";
|
my $profile = "$Nix::Config::stateDir/profiles/per-user/$userName/channels";
|
||||||
mkpath(dirname $profile, 0, 0755);
|
mkpath(dirname $profile, 0, 0755);
|
||||||
|
|
||||||
my %channels;
|
my %channels;
|
||||||
|
|
||||||
|
|
||||||
|
@ -77,20 +77,14 @@ sub removeChannel {
|
||||||
# channels.
|
# channels.
|
||||||
sub update {
|
sub update {
|
||||||
my @channelNames = @_;
|
my @channelNames = @_;
|
||||||
|
|
||||||
readChannels;
|
readChannels;
|
||||||
|
|
||||||
# Create the manifests directory if it doesn't exist.
|
|
||||||
mkdir $manifestDir, 0755 unless -e $manifestDir;
|
|
||||||
|
|
||||||
# Do we have write permission to the manifests directory?
|
|
||||||
die "$0: you do not have write permission to `$manifestDir'!\n" unless -W $manifestDir;
|
|
||||||
|
|
||||||
# Download each channel.
|
# Download each channel.
|
||||||
my $exprs = "";
|
my $exprs = "";
|
||||||
foreach my $name (keys %channels) {
|
foreach my $name (keys %channels) {
|
||||||
next if scalar @channelNames > 0 && ! grep { $_ eq $name } @{channelNames};
|
next if scalar @channelNames > 0 && ! grep { $_ eq $name } @{channelNames};
|
||||||
|
|
||||||
my $url = $channels{$name};
|
my $url = $channels{$name};
|
||||||
my $origUrl = "$url/MANIFEST";
|
my $origUrl = "$url/MANIFEST";
|
||||||
|
|
||||||
|
@ -101,11 +95,20 @@ sub update {
|
||||||
die "$0: unable to check `$url'\n" if $? != 0;
|
die "$0: unable to check `$url'\n" if $? != 0;
|
||||||
$headers =~ s/\r//g;
|
$headers =~ s/\r//g;
|
||||||
$url = $1 if $headers =~ /^Location:\s*(.*)\s*$/m;
|
$url = $1 if $headers =~ /^Location:\s*(.*)\s*$/m;
|
||||||
|
|
||||||
# Pull the channel manifest.
|
# Check if the channel advertises a binary cache.
|
||||||
$ENV{'NIX_ORIG_URL'} = $origUrl;
|
my $binaryCacheURL = `$Nix::Config::curl --silent '$url'/binary-cache-url`;
|
||||||
system("$Nix::Config::binDir/nix-pull", "--skip-wrong-store", "$url/MANIFEST") == 0
|
my $extraAttrs = "";
|
||||||
or die "cannot pull manifest from `$url'\n";
|
if ($? == 0 && $binaryCacheURL ne "") {
|
||||||
|
$extraAttrs .= "binaryCacheURL = \"$binaryCacheURL\"; ";
|
||||||
|
} else {
|
||||||
|
# No binary cache, so pull the channel manifest.
|
||||||
|
mkdir $manifestDir, 0755 unless -e $manifestDir;
|
||||||
|
die "$0: you do not have write permission to `$manifestDir'!\n" unless -W $manifestDir;
|
||||||
|
$ENV{'NIX_ORIG_URL'} = $origUrl;
|
||||||
|
system("$Nix::Config::binDir/nix-pull", "--skip-wrong-store", "$url/MANIFEST") == 0
|
||||||
|
or die "cannot pull manifest from `$url'\n";
|
||||||
|
}
|
||||||
|
|
||||||
# Download the channel tarball.
|
# Download the channel tarball.
|
||||||
my $fullURL = "$url/nixexprs.tar.bz2";
|
my $fullURL = "$url/nixexprs.tar.bz2";
|
||||||
|
@ -120,7 +123,7 @@ sub update {
|
||||||
my $cname = $name;
|
my $cname = $name;
|
||||||
$cname .= $1 if basename($url) =~ /(-\d.*)$/;
|
$cname .= $1 if basename($url) =~ /(-\d.*)$/;
|
||||||
|
|
||||||
$exprs .= "'f: f { name = \"$cname\"; channelName = \"$name\"; src = builtins.storePath \"$path\"; }' ";
|
$exprs .= "'f: f { name = \"$cname\"; channelName = \"$name\"; src = builtins.storePath \"$path\"; $extraAttrs }' ";
|
||||||
}
|
}
|
||||||
|
|
||||||
# Unpack the channel tarballs into the Nix store and install them
|
# Unpack the channel tarballs into the Nix store and install them
|
||||||
|
@ -189,7 +192,7 @@ while (scalar @ARGV) {
|
||||||
update(@ARGV);
|
update(@ARGV);
|
||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
|
|
||||||
elsif ($arg eq "--help") {
|
elsif ($arg eq "--help") {
|
||||||
usageError;
|
usageError;
|
||||||
}
|
}
|
||||||
|
@ -198,7 +201,7 @@ while (scalar @ARGV) {
|
||||||
print "nix-channel (Nix) $Nix::Config::version\n";
|
print "nix-channel (Nix) $Nix::Config::version\n";
|
||||||
exit 0;
|
exit 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
else {
|
else {
|
||||||
die "unknown argument `$arg'; try `--help'";
|
die "unknown argument `$arg'; try `--help'";
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue