#! @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 () { my $cmd = $_; chomp $cmd; if ($cmd eq "have") { my $storePath = ; chomp $storePath; print STDOUT (defined findStorePath($storePath) ? "1\n" : "0\n"); } elsif ($cmd eq "info") { my $storePath = ; 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; print "$deriver\n"; print scalar @references, "\n"; print "$_\n" foreach @references; print "0\n"; # !!! showing size not supported (yet) } 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; }