* When checking whether a patch is applicable, for efficiency, use

`nix-store -q --hash' to get the hash of the base path rather than
  `nix-hash'.  However, only do this for estimating the size of a
  download, not for the actual substitution, because sometimes the
  contents of store paths are modified (which they shouldn't, of
  course).
This commit is contained in:
Eelco Dolstra 2010-11-17 17:41:59 +00:00
parent 3d38a49840
commit a4f0365b2d
1 changed files with 7 additions and 3 deletions

View File

@ -51,6 +51,7 @@ sub parseHash {
# given path.
sub computeSmallestDownload {
my $targetPath = shift;
my $fast = shift;
# Build a graph of all store paths that might contribute to the
# construction of $targetPath, and the special node "start". The
@ -110,8 +111,11 @@ sub computeSmallestDownload {
my ($baseHashAlgo, $baseHash) = parseHash $patch->{baseHash};
my $format = "--base32";
$format = "" if $baseHashAlgo eq "md5";
my $hash = `$binDir/nix-hash --type '$baseHashAlgo' $format "$patch->{basePath}"`;
my $hash = $fast && $baseHashAlgo eq "sha256"
? `$binDir/nix-store -q --hash "$patch->{basePath}"`
: `$binDir/nix-hash --type '$baseHashAlgo' $format "$patch->{basePath}"`;
chomp $hash;
$hash =~ s/.*://;
next if $hash ne $baseHash;
}
push @queue, $patch->{basePath};
@ -203,7 +207,7 @@ if ($ARGV[0] eq "--query") {
print scalar @references, "\n";
print "$_\n" foreach @references;
my @path = computeSmallestDownload $storePath;
my @path = computeSmallestDownload $storePath, 1;
my $downloadSize = 0;
while (scalar @path > 0) {
@ -269,7 +273,7 @@ foreach my $localPath (@{$localPathList}) {
# Compute the shortest path.
my @path = computeSmallestDownload $targetPath;
my @path = computeSmallestDownload $targetPath, 0;
die "don't know how to produce $targetPath\n" if scalar @path == 0;