diff options
Diffstat (limited to 'scripts/nix-pull.in')
-rwxr-xr-x | scripts/nix-pull.in | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/scripts/nix-pull.in b/scripts/nix-pull.in new file mode 100755 index 000000000000..58dd2cf27eee --- /dev/null +++ b/scripts/nix-pull.in @@ -0,0 +1,103 @@ +#! @perl@ -w @perlFlags@ + +use strict; +use File::Temp qw(tempdir); +use Nix::Config; +use Nix::Manifest; + +my $tmpDir = tempdir("nix-pull.XXXXXX", CLEANUP => 1, TMPDIR => 1) + or die "cannot create a temporary directory"; + +my $manifestDir = $Nix::Config::manifestDir; + + +# Prevent access problems in shared-stored installations. +umask 0022; + + +# Create the manifests directory if it doesn't exist. +if (! -e $manifestDir) { + mkdir $manifestDir, 0755 or die "cannot create directory `$manifestDir'"; +} + + +# Make sure that the manifests directory is scanned for GC roots. +my $gcRootsDir = "$Nix::Config::stateDir/gcroots"; +my $manifestDirLink = "$gcRootsDir/manifests"; +if (! -l $manifestDirLink) { + symlink($manifestDir, $manifestDirLink) or die "cannot create symlink `$manifestDirLink'"; +} + + +# Process the URLs specified on the command line. + +sub downloadFile { + my $url = shift; + $ENV{"PRINT_PATH"} = 1; + $ENV{"QUIET"} = 1; + my ($dummy, $path) = `$Nix::Config::binDir/nix-prefetch-url '$url'`; + die "cannot fetch `$url'" if $? != 0; + die "nix-prefetch-url did not return a path" unless defined $path; + chomp $path; + return $path; +} + +sub processURL { + my $url = shift; + + $url =~ s/\/$//; + + my $manifest; + + my $origUrl = $ENV{'NIX_ORIG_URL'} || $url; + + # First see if a bzipped manifest is available. + if (system("$Nix::Config::curl --fail --silent --location --head '$url'.bz2 > /dev/null") == 0) { + print "fetching list of Nix archives at `$url.bz2'...\n"; + $manifest = downloadFile "$url.bz2"; + } + + # Otherwise, just get the uncompressed manifest. + else { + print "fetching list of Nix archives at `$url'...\n"; + $manifest = downloadFile $url; + } + + my $baseName = "unnamed"; + if ($url =~ /\/([^\/]+)\/[^\/]+$/) { # get the forelast component + $baseName = $1; + } + + my $hash = `$Nix::Config::binDir/nix-hash --flat '$manifest'` + or die "cannot hash `$manifest'"; + chomp $hash; + + my $urlFile = "$manifestDir/$baseName-$hash.url"; + open URL, ">$urlFile" or die "cannot create `$urlFile'"; + print URL $origUrl; + close URL; + + my $finalPath = "$manifestDir/$baseName-$hash.nixmanifest"; + + unlink $finalPath if -e $finalPath; + + symlink("$manifest", "$finalPath") + or die "cannot link `$finalPath to `$manifest'"; + + deleteOldManifests($origUrl, $urlFile); +} + +while (@ARGV) { + my $url = shift @ARGV; + if ($url eq "--help") { + exec "man nix-pull" or die; + } elsif ($url eq "--skip-wrong-store") { + # No-op, no longer supported. + } else { + processURL $url; + } +} + + +# Update the cache. +updateManifestDB(); |