Generate *.narinfo files on the fly to support the binary cache substituter

This commit is contained in:
Eelco Dolstra 2012-07-02 20:09:45 +02:00
parent fe2dab6fe8
commit 1b3cf68b77
2 changed files with 60 additions and 2 deletions

View file

@ -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';
}

View 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;