forked from lix-project/lix
bae75ca5a1
path can be created by copying it from another location in the file system. This is useful in the NixOS installation.
124 lines
3.3 KiB
Plaintext
124 lines
3.3 KiB
Plaintext
#! @perl@ -w -I@libexecdir@/nix
|
|
|
|
use strict;
|
|
use File::Temp qw(tempdir);
|
|
use readmanifest;
|
|
|
|
my $tmpDir = tempdir("nix-pull.XXXXXX", CLEANUP => 1, TMPDIR => 1)
|
|
or die "cannot create a temporary directory";
|
|
|
|
my $manifest = "$tmpDir/manifest";
|
|
|
|
my $binDir = $ENV{"NIX_BIN_DIR"};
|
|
$binDir = "@bindir@" unless defined $binDir;
|
|
|
|
my $libexecDir = $ENV{"NIX_LIBEXEC_DIR"};
|
|
$libexecDir = "@libexecdir@" unless defined $libexecDir;
|
|
|
|
my $stateDir = $ENV{"NIX_STATE_DIR"};
|
|
$stateDir = "@localstatedir@/nix" unless defined $stateDir;
|
|
|
|
my $storeDir = $ENV{"NIX_STORE_DIR"};
|
|
$storeDir = "@storedir@" unless defined $storeDir;
|
|
|
|
|
|
# Prevent access problems in shared-stored installations.
|
|
umask 0022;
|
|
|
|
|
|
# Process the URLs specified on the command line.
|
|
my %narFiles;
|
|
my %localPaths;
|
|
my %patches;
|
|
|
|
my $skipWrongStore = 0;
|
|
|
|
sub processURL {
|
|
my $url = shift;
|
|
|
|
$url =~ s/\/$//;
|
|
print "obtaining list of Nix archives at $url...\n";
|
|
|
|
system("@curl@ --fail --silent --show-error --location --max-redirs 20 " .
|
|
"'$url' > '$manifest'") == 0
|
|
or die "curl failed: $?";
|
|
|
|
if (readManifest($manifest, \%narFiles, \%localPaths, \%patches) < 3) {
|
|
die "manifest `$url' is too old (i.e., for Nix <= 0.7)\n";
|
|
}
|
|
|
|
if ($skipWrongStore) {
|
|
foreach my $path (keys %narFiles) {
|
|
if (substr($path, 0, length($storeDir) + 1) ne "$storeDir/") {
|
|
print STDERR "warning: manifest `$url' assumes a Nix store at a different location than $storeDir, skipping...\n";
|
|
exit 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
my $baseName = "unnamed";
|
|
if ($url =~ /\/([^\/]+)\/[^\/]+$/) { # get the forelast component
|
|
$baseName = $1;
|
|
}
|
|
|
|
my $hash = `$binDir/nix-hash --flat '$manifest'`
|
|
or die "cannot hash `$manifest'";
|
|
chomp $hash;
|
|
|
|
my $finalPath = "$stateDir/manifests/$baseName-$hash.nixmanifest";
|
|
|
|
system ("@coreutils@/mv", "-f", "$manifest", "$finalPath") == 0
|
|
or die "cannot move `$manifest' to `$finalPath";
|
|
}
|
|
|
|
while (@ARGV) {
|
|
my $url = shift @ARGV;
|
|
if ($url eq "--skip-wrong-store") {
|
|
$skipWrongStore = 1;
|
|
} else {
|
|
processURL $url;
|
|
}
|
|
}
|
|
|
|
|
|
my $size = scalar (keys %narFiles) + scalar (keys %localPaths);
|
|
print "$size store paths in manifest\n";
|
|
|
|
|
|
# Register all substitutes.
|
|
print STDERR "registering substitutes...\n";
|
|
|
|
my $pid = open(WRITE, "|$binDir/nix-store --register-substitutes")
|
|
or die "cannot run nix-store";
|
|
|
|
sub writeRegistration {
|
|
my $storePath = shift;
|
|
my $object = shift;
|
|
print WRITE "$storePath\n";
|
|
print WRITE "$object->{deriver}\n";
|
|
print WRITE "$libexecDir/nix/download-using-manifests.pl\n";
|
|
print WRITE "0\n";
|
|
my @references = split " ", $object->{references};
|
|
my $count = scalar @references;
|
|
print WRITE "$count\n";
|
|
foreach my $reference (@references) {
|
|
print WRITE "$reference\n";
|
|
}
|
|
}
|
|
|
|
foreach my $storePath (keys %narFiles) {
|
|
my $narFileList = $narFiles{$storePath};
|
|
foreach my $narFile (@{$narFileList}) {
|
|
writeRegistration $storePath, $narFile;
|
|
}
|
|
}
|
|
|
|
foreach my $storePath (keys %localPaths) {
|
|
my $localPathList = $localPaths{$storePath};
|
|
foreach my $localPath (@{$localPathList}) {
|
|
writeRegistration $storePath, $localPath;
|
|
}
|
|
}
|
|
|
|
close WRITE or die "nix-store failed: $?";
|