From 3c92ea399d717dc45b3fa91424c0dadc0239ebf2 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Sat, 2 Aug 2008 12:54:35 +0000 Subject: * Make nix-env --dry-run print the paths to be substituted correctly again. (After the previous substituter mechanism refactoring I didn't update the code that obtains the references of substitutable paths.) This required some refactoring: the substituter programs are now kept running and receive/respond to info requests via stdin/stdout. --- scripts/copy-from-other-stores.pl.in | 71 ++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 32 deletions(-) (limited to 'scripts/copy-from-other-stores.pl.in') diff --git a/scripts/copy-from-other-stores.pl.in b/scripts/copy-from-other-stores.pl.in index 74efbd745..00de3ff99 100644 --- a/scripts/copy-from-other-stores.pl.in +++ b/scripts/copy-from-other-stores.pl.in @@ -2,6 +2,9 @@ use strict; use File::Basename; +use IO::Handle; + +STDOUT->autoflush(1); my @remoteStoresAll = split ':', ($ENV{"NIX_OTHER_STORES"} or ""); @@ -33,42 +36,46 @@ sub findStorePath { } -if ($ARGV[0] eq "--query-paths") { - foreach my $store (@remoteStores) { - opendir DIR, "$store/var/nix/db/info" or next; - print "@storedir@/$_\n" foreach readdir DIR; - closedir DIR; - } -} +if ($ARGV[0] eq "--query") { + while () { + my $cmd = $_; chomp $cmd; -elsif ($ARGV[0] eq "--query-info") { - shift @ARGV; - - foreach my $storePath (@ARGV) { - - (my $infoFile) = findStorePath $storePath; - next unless $infoFile; - - my $deriver = ""; - my @references = (); - - open INFO, "<$infoFile" or die "cannot read info file $infoFile\n"; - while () { - chomp; - #print STDERR "GOT $_\n"; - /^([\w-]+): (.*)$/ or die "bad info file"; - my $key = $1; - my $value = $2; - if ($key eq "Deriver") { $deriver = $value; } - elsif ($key eq "References") { @references = split ' ', $value; } + if ($cmd eq "have") { + my $storePath = ; chomp $storePath; + (my $infoFile) = findStorePath $storePath; + print STDOUT ($infoFile ? "1\n" : "0\n"); + } + + elsif ($cmd eq "info") { + my $storePath = ; chomp $storePath; + (my $infoFile) = findStorePath $storePath; + if (!$infoFile) { + print "0\n"; + next; # not an error + } + print "1\n"; + + my $deriver = ""; + my @references = (); + + open INFO, "<$infoFile" or die "cannot read info file $infoFile\n"; + while () { + chomp; + /^([\w-]+): (.*)$/ or die "bad info file"; + my $key = $1; + my $value = $2; + if ($key eq "Deriver") { $deriver = $value; } + elsif ($key eq "References") { @references = split ' ', $value; } + } + close INFO; + + print "$deriver\n"; + print scalar @references, "\n"; + print "$_\n" foreach @references; } - close INFO; - print "$storePath\n"; - print "$deriver\n"; - print scalar @references, "\n"; - print "$_\n" foreach @references; + else { die "unknown command `$cmd'"; } } } -- cgit v1.2.3