forked from lix-project/lix
bae75ca5a1
path can be created by copying it from another location in the file system. This is useful in the NixOS installation.
53 lines
1.3 KiB
Perl
Executable file
53 lines
1.3 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 %localPaths;
|
|
my %patches;
|
|
|
|
readManifest $manifest, \%narFiles, \%localPaths, \%patches;
|
|
|
|
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;
|