diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2008-08-02 12:54:35 +0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2008-08-02 12:54:35 +0000 |
commit | 3c92ea399d717dc45b3fa91424c0dadc0239ebf2 (patch) | |
tree | 7cde9f533a6ee575615da5452e04c05dc0939f02 /scripts | |
parent | fc691e1cbdcddb8c553cba06d4089bc1b60e3d98 (diff) |
* 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.
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/copy-from-other-stores.pl.in | 71 | ||||
-rw-r--r-- | scripts/download-using-manifests.pl.in | 77 |
2 files changed, 81 insertions, 67 deletions
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 (<STDIN>) { + 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 (<INFO>) { - 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 = <STDIN>; chomp $storePath; + (my $infoFile) = findStorePath $storePath; + print STDOUT ($infoFile ? "1\n" : "0\n"); + } + + elsif ($cmd eq "info") { + my $storePath = <STDIN>; 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 (<INFO>) { + 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'"; } } } diff --git a/scripts/download-using-manifests.pl.in b/scripts/download-using-manifests.pl.in index c0b822b91..e862a2d9f 100644 --- a/scripts/download-using-manifests.pl.in +++ b/scripts/download-using-manifests.pl.in @@ -5,27 +5,18 @@ use readmanifest; use POSIX qw(strftime); use File::Temp qw(tempdir); +STDOUT->autoflush(1); + my $manifestDir = "@localstatedir@/nix/manifests"; my $logFile = "@localstatedir@/log/nix/downloads"; -# Create a temporary directory. -my $tmpDir = tempdir("nix-download.XXXXXX", CLEANUP => 1, TMPDIR => 1) - or die "cannot create a temporary directory"; - -chdir $tmpDir or die "cannot change to `$tmpDir': $!"; - -my $tmpNar = "$tmpDir/nar"; -my $tmpNar2 = "$tmpDir/nar2"; - - # Load all manifests. my %narFiles; my %localPaths; my %patches; for my $manifest (glob "$manifestDir/*.nixmanifest") { -# print STDERR "reading $manifest\n"; if (readManifest($manifest, \%narFiles, \%localPaths, \%patches) < 3) { print STDERR "you have an old-style manifest `$manifest'; please delete it\n"; exit 1; @@ -35,34 +26,40 @@ for my $manifest (glob "$manifestDir/*.nixmanifest") { # Parse the arguments. -if ($ARGV[0] eq "--query-paths") { - foreach my $storePath (keys %narFiles) { print "$storePath\n"; } - foreach my $storePath (keys %localPaths) { print "$storePath\n"; } - exit 0; -} +if ($ARGV[0] eq "--query") { -elsif ($ARGV[0] eq "--query-info") { - shift @ARGV; - foreach my $storePath (@ARGV) { - my $info; - if (defined $narFiles{$storePath}) { - $info = @{$narFiles{$storePath}}[0]; - } - elsif (defined $localPaths{$storePath}) { - $info = @{$localPaths{$storePath}}[0]; - } - else { - next; # not an error + while (<STDIN>) { + my $cmd = $_; chomp $cmd; + + if ($cmd eq "have") { + my $storePath = <STDIN>; chomp $storePath; + print STDOUT ((defined $narFiles{$storePath} or defined $localPaths{$storePath}) + ? "1\n" : "0\n"); } - print "$storePath\n"; - print "$info->{deriver}\n"; - my @references = split " ", $info->{references}; - my $count = scalar @references; - print "$count\n"; - foreach my $reference (@references) { - print "$reference\n"; + + elsif ($cmd eq "info") { + my $storePath = <STDIN>; chomp $storePath; + my $info; + if (defined $narFiles{$storePath}) { + $info = @{$narFiles{$storePath}}[0]; + } + elsif (defined $localPaths{$storePath}) { + $info = @{$localPaths{$storePath}}[0]; + } + else { + print "0\n"; + next; # not an error + } + print "1\n"; + print "$info->{deriver}\n"; + my @references = split " ", $info->{references}; + print scalar @references, "\n"; + print "$_\n" foreach @references; } + + else { die "unknown command `$cmd'"; } } + exit 0; } @@ -75,6 +72,16 @@ die unless scalar @ARGV == 2; my $targetPath = $ARGV[1]; +# Create a temporary directory. +my $tmpDir = tempdir("nix-download.XXXXXX", CLEANUP => 1, TMPDIR => 1) + or die "cannot create a temporary directory"; + +chdir $tmpDir or die "cannot change to `$tmpDir': $!"; + +my $tmpNar = "$tmpDir/nar"; +my $tmpNar2 = "$tmpDir/nar2"; + + open LOGFILE, ">>$logFile" or die "cannot open log file $logFile"; my $date = strftime ("%F %H:%M:%S UTC", gmtime (time)); |