diff --git a/src/lib/Hydra/Controller/Root.pm b/src/lib/Hydra/Controller/Root.pm index b7c233e8..fadb1f20 100644 --- a/src/lib/Hydra/Controller/Root.pm +++ b/src/lib/Hydra/Controller/Root.pm @@ -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'; } diff --git a/src/lib/Hydra/View/NARInfo.pm b/src/lib/Hydra/View/NARInfo.pm new file mode 100644 index 00000000..64516365 --- /dev/null +++ b/src/lib/Hydra/View/NARInfo.pm @@ -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;