93 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable file
		
	
	
	
	
| #! @perl@ -w
 | |
| 
 | |
| use strict;
 | |
| use File::Basename;
 | |
| use IO::Handle;
 | |
| 
 | |
| my $binDir = $ENV{"NIX_BIN_DIR"} || "@bindir@";
 | |
| 
 | |
| 
 | |
| STDOUT->autoflush(1);
 | |
| 
 | |
| my @remoteStoresAll = split ':', ($ENV{"NIX_OTHER_STORES"} or "");
 | |
| 
 | |
| my @remoteStores;
 | |
| foreach my $dir (@remoteStoresAll) {
 | |
|     push @remoteStores, glob($dir);
 | |
| }
 | |
| 
 | |
| 
 | |
| $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>) {
 | |
|         my $cmd = $_; chomp $cmd;
 | |
| 
 | |
|         if ($cmd eq "have") {
 | |
|             my $storePath = <STDIN>; chomp $storePath;
 | |
|             print STDOUT (defined findStorePath($storePath) ? "1\n" : "0\n");
 | |
|         }
 | |
| 
 | |
|         elsif ($cmd eq "info") {
 | |
|             my $storePath = <STDIN>; chomp $storePath;
 | |
|             my ($store, $sourcePath) = findStorePath($storePath);
 | |
|             if (!defined $store) {
 | |
|                 print "0\n";
 | |
|                 next; # not an error
 | |
|             }
 | |
|             print "1\n";
 | |
| 
 | |
|             $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 "$deriver\n";
 | |
|             print scalar @references, "\n";
 | |
|             print "$_\n" foreach @references;
 | |
|             print "$narSize\n";
 | |
|             print "$narSize\n";
 | |
|         }
 | |
| 
 | |
|         else { die "unknown command `$cmd'"; }
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| elsif ($ARGV[0] eq "--substitute") {
 | |
|     die unless scalar @ARGV == 2;
 | |
|     my $storePath = $ARGV[1];
 | |
|     my ($store, $sourcePath) = findStorePath $storePath;
 | |
|     die unless $store;
 | |
|     print "\n*** Copying `$storePath' from `$sourcePath'\n\n";
 | |
|     system("$binDir/nix-store --dump $sourcePath | $binDir/nix-store --restore $storePath") == 0
 | |
|         or die "cannot copy `$sourcePath' to `$storePath'";
 | |
| }
 | |
| 
 | |
| 
 | |
| else { die; }
 |