53 lines
1.4 KiB
Perl
Executable file
53 lines
1.4 KiB
Perl
Executable file
#! /usr/bin/perl -w -I.
|
|
|
|
use strict;
|
|
use readmanifest;
|
|
|
|
die unless scalar @ARGV == 2;
|
|
|
|
my $cache = $ARGV[0];
|
|
my $manifest = $ARGV[1];
|
|
my %narFiles;
|
|
my %patches;
|
|
my %successors;
|
|
|
|
readManifest $manifest, \%narFiles, \%patches, \%successors;
|
|
|
|
foreach my $storePath (keys %narFiles) {
|
|
my $narFileList = $narFiles{$storePath};
|
|
|
|
foreach my $narFile (@{$narFileList}) {
|
|
if (!defined $narFile->{size} or
|
|
!defined $narFile->{narHash})
|
|
{
|
|
$narFile->{url} =~ /\/([^\/]+)$/;
|
|
die unless defined $1;
|
|
my $fn = "$cache/$1";
|
|
|
|
my @info = stat $fn or die;
|
|
$narFile->{size} = $info[7];
|
|
|
|
my $narHash;
|
|
my $hashFile = "$fn.NARHASH";
|
|
if (-e $hashFile) {
|
|
open HASH, "<$hashFile" or die;
|
|
$narHash = <HASH>;
|
|
close HASH;
|
|
} else {
|
|
print "$fn\n";
|
|
$narHash = `bunzip2 < '$fn' | nix-hash --flat /dev/stdin` or die;
|
|
open HASH, ">$hashFile" or die;
|
|
print HASH $narHash;
|
|
close HASH;
|
|
}
|
|
chomp $narHash;
|
|
$narFile->{narHash} = $narHash;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (! -e "$manifest.backup") {
|
|
system "mv --reply=no '$manifest' '$manifest.backup'";
|
|
}
|
|
|
|
writeManifest $manifest, \%narFiles, \%patches, \%successors;
|