Generate *.narinfo files on the fly to support the binary cache substituter
This commit is contained in:
parent
fe2dab6fe8
commit
1b3cf68b77
|
@ -195,9 +195,28 @@ sub nar :Local :Args(1) {
|
|||
}
|
||||
|
||||
|
||||
sub narinfo :Path('*.narinfo') {
|
||||
sub hashToPath {
|
||||
my ($c, $hash) = @_;
|
||||
die if length($hash) != 32;
|
||||
# FIXME: doing a glob is very inefficient. Should do a database
|
||||
# lookup.
|
||||
my @glob = glob("/nix/store/$hash*");
|
||||
foreach my $storePath (@glob) {
|
||||
if (isValidPath($storePath)) {
|
||||
print STDERR "FOUND: $hash -> $storePath\n";
|
||||
return $storePath;
|
||||
}
|
||||
#return $storePath if isValidPath($storePath);
|
||||
}
|
||||
notFound($c, "Store path with hash ‘$hash’ does not exist.");
|
||||
}
|
||||
|
||||
|
||||
sub narinfo :LocalRegex('^([a-z0-9]+).narinfo$') :Args(0) {
|
||||
my ($self, $c) = @_;
|
||||
$c->stash->{current_view} = 'NixInfo';
|
||||
my $hash = $c->req->captures->[0];
|
||||
$c->stash->{storePath} = hashToPath($c, $hash);
|
||||
$c->stash->{current_view} = 'NARInfo';
|
||||
}
|
||||
|
||||
|
||||
|
|
39
src/lib/Hydra/View/NARInfo.pm
Normal file
39
src/lib/Hydra/View/NARInfo.pm
Normal file
|
@ -0,0 +1,39 @@
|
|||
package Hydra::View::NARInfo;
|
||||
|
||||
use strict;
|
||||
use base qw/Catalyst::View/;
|
||||
use File::Basename;
|
||||
use Nix::Store;
|
||||
|
||||
sub process {
|
||||
my ($self, $c) = @_;
|
||||
|
||||
my $storePath = $c->stash->{storePath};
|
||||
|
||||
$c->response->content_type('text/x-nix-narinfo'); # !!! check MIME type
|
||||
|
||||
my ($deriver, $narHash, $time, $narSize, $refs) = queryPathInfo($storePath);
|
||||
|
||||
my $info;
|
||||
$info .= "StorePath: $storePath\n";
|
||||
$info .= "URL: nar/" . basename $storePath. "\n";
|
||||
$info .= "Compression: bzip2\n";
|
||||
#$info .= "FileHash: sha256:$compressedHash\n";
|
||||
#$info .= "FileSize: $compressedSize\n";
|
||||
$info .= "NarHash: $narHash\n";
|
||||
$info .= "NarSize: $narSize\n";
|
||||
$info .= "References: " . join(" ", map { basename $_ } @{$refs}) . "\n";
|
||||
if (defined $deriver) {
|
||||
$info .= "Deriver: " . basename $deriver . "\n";
|
||||
if (isValidPath($deriver)) {
|
||||
my $drv = derivationFromPath($deriver);
|
||||
$info .= "System: $drv->{platform}\n";
|
||||
}
|
||||
}
|
||||
|
||||
$c->response->body($info);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
1;
|
Loading…
Reference in a new issue