103 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable file
		
	
	
	
	
| #! @perl@ -w @perlFlags@
 | ||
| 
 | ||
| use utf8;
 | ||
| use strict;
 | ||
| use File::Basename;
 | ||
| use IO::Handle;
 | ||
| 
 | ||
| my $binDir = $ENV{"NIX_BIN_DIR"} || "@bindir@";
 | ||
| 
 | ||
| 
 | ||
| STDOUT->autoflush(1);
 | ||
| binmode STDERR, ":encoding(utf8)";
 | ||
| 
 | ||
| my @remoteStoresAll = split ':', ($ENV{"NIX_OTHER_STORES"} or "");
 | ||
| 
 | ||
| my @remoteStores;
 | ||
| foreach my $dir (@remoteStoresAll) {
 | ||
|     push @remoteStores, glob($dir);
 | ||
| }
 | ||
| 
 | ||
| exit if scalar @remoteStores == 0;
 | ||
| print "\n";
 | ||
| 
 | ||
| 
 | ||
| $ENV{"NIX_REMOTE"} = "";
 | ||
| 
 | ||
| 
 | ||
| sub findStorePath {
 | ||
|     my $storePath = shift;
 | ||
|     foreach my $store (@remoteStores) {
 | ||
|         my $sourcePath = "$store/store/" . basename $storePath;
 | ||
|         next unless -e $sourcePath || -l $sourcePath;
 | ||
|         $ENV{"NIX_DB_DIR"} = "$store/var/nix/db";
 | ||
|         return ($store, $sourcePath) if
 | ||
|             system("$binDir/nix-store --check-validity $storePath") == 0;
 | ||
|     }
 | ||
|     return undef;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| if ($ARGV[0] eq "--query") {
 | ||
| 
 | ||
|     while (<STDIN>) {
 | ||
|         chomp;
 | ||
|         my ($cmd, @args) = split " ", $_;
 | ||
| 
 | ||
|         if ($cmd eq "have") {
 | ||
|             foreach my $storePath (@args) {
 | ||
|                 print "$storePath\n" if defined findStorePath($storePath);
 | ||
|             }
 | ||
|             print "\n";
 | ||
|         }
 | ||
| 
 | ||
|         elsif ($cmd eq "info") {
 | ||
|             foreach my $storePath (@args) {
 | ||
|                 my ($store, $sourcePath) = findStorePath($storePath);
 | ||
|                 next unless defined $store;
 | ||
| 
 | ||
|                 $ENV{"NIX_DB_DIR"} = "$store/var/nix/db";
 | ||
| 
 | ||
|                 my $deriver = `$binDir/nix-store --query --deriver $storePath`;
 | ||
|                 die "cannot query deriver of ‘$storePath’" if $? != 0;
 | ||
|                 chomp $deriver;
 | ||
|                 $deriver = "" if $deriver eq "unknown-deriver";
 | ||
| 
 | ||
|                 my @references = split "\n",
 | ||
|                     `$binDir/nix-store --query --references $storePath`;
 | ||
|                 die "cannot query references of ‘$storePath’" if $? != 0;
 | ||
| 
 | ||
|                 my $narSize = `$binDir/nix-store --query --size $storePath`;
 | ||
|                 die "cannot query size of ‘$storePath’" if $? != 0;
 | ||
|                 chomp $narSize;
 | ||
| 
 | ||
|                 print "$storePath\n";
 | ||
|                 print "$deriver\n";
 | ||
|                 print scalar @references, "\n";
 | ||
|                 print "$_\n" foreach @references;
 | ||
|                 print "0\n";
 | ||
|                 print "$narSize\n";
 | ||
|             }
 | ||
| 
 | ||
|             print "\n";
 | ||
|         }
 | ||
| 
 | ||
|         else { die "unknown command ‘$cmd’"; }
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| elsif ($ARGV[0] eq "--substitute") {
 | ||
|     die unless scalar @ARGV == 3;
 | ||
|     my $storePath = $ARGV[1];
 | ||
|     my $destPath = $ARGV[2];
 | ||
|     my ($store, $sourcePath) = findStorePath $storePath;
 | ||
|     die unless $store;
 | ||
|     print STDERR "\n*** Copying ‘$storePath’ from ‘$sourcePath’\n\n";
 | ||
|     system("@coreutils@/cp", "-rpd", $sourcePath, $destPath) == 0
 | ||
|         or die "cannot copy ‘$sourcePath’ to ‘$storePath’";
 | ||
|     print "\n"; # no hash to verify
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| else { die; }
 |