* Downloading closures.
This commit is contained in:
parent
9f1f939226
commit
f6462ff5bb
|
@ -13,7 +13,10 @@ use Catalyst qw/-Debug
|
|||
/;
|
||||
our $VERSION = '0.01';
|
||||
|
||||
__PACKAGE__->config( name => 'HydraFrontend' );
|
||||
__PACKAGE__->config(
|
||||
name => 'HydraFrontend',
|
||||
default_view => "TT"
|
||||
);
|
||||
|
||||
__PACKAGE__->setup();
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@ package HydraFrontend::Controller::Root;
|
|||
use strict;
|
||||
use warnings;
|
||||
use parent 'Catalyst::Controller';
|
||||
use HydraFrontend::Helper::Nix;
|
||||
|
||||
#
|
||||
# Sets the actions in this controller to be registered with no prefix
|
||||
|
@ -391,7 +392,13 @@ sub closure :Local {
|
|||
my $product = $build->buildproducts->find({productnr => $productnr});
|
||||
return error($c, "Build $buildId doesn't have a product $productnr.") if !defined $product;
|
||||
|
||||
return error($c, "Not yet implemented.");
|
||||
return error($c, "Product is not a Nix build.") if $product->type ne "nix-build";
|
||||
|
||||
return error($c, "Path " . $product->path . " is no longer available.") unless HydraFrontend::Helper::Nix::isValidPath($product->path);
|
||||
|
||||
$c->stash->{current_view} = 'HydraFrontend::View::NixClosure';
|
||||
$c->stash->{storePath} = $product->path;
|
||||
$c->stash->{name} = $build->nixname;
|
||||
}
|
||||
|
||||
|
||||
|
|
14
src/HydraFrontend/lib/HydraFrontend/Helper/Nix.pm
Normal file
14
src/HydraFrontend/lib/HydraFrontend/Helper/Nix.pm
Normal file
|
@ -0,0 +1,14 @@
|
|||
package HydraFrontend::Helper::Nix;
|
||||
|
||||
use strict;
|
||||
|
||||
|
||||
sub isValidPath {
|
||||
my $path = shift;
|
||||
$SIG{CHLD} = 'DEFAULT'; # !!! work around system() failing if SIGCHLD is ignored
|
||||
return system("nix-store --check-validity $path") == 0;
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
|
26
src/HydraFrontend/lib/HydraFrontend/View/NixClosure.pm
Normal file
26
src/HydraFrontend/lib/HydraFrontend/View/NixClosure.pm
Normal file
|
@ -0,0 +1,26 @@
|
|||
package HydraFrontend::View::NixClosure;
|
||||
|
||||
use strict;
|
||||
use base qw/Catalyst::View/;
|
||||
use IO::Pipe;
|
||||
use POSIX qw(dup2);
|
||||
|
||||
sub process {
|
||||
my ( $self, $c ) = @_;
|
||||
|
||||
$c->response->content_type('application/x-nix-export');
|
||||
$c->response->header('Content-Disposition' => 'attachment; filename=' . $c->stash->{name} . '.closure.gz');
|
||||
|
||||
my $storePath = $c->stash->{storePath};
|
||||
|
||||
open(OUTPUT, "nix-store --export `nix-store -qR $storePath` | gzip |");
|
||||
|
||||
my $fh = new IO::Handle;
|
||||
$fh->fdopen(fileno(OUTPUT), "r") or die;
|
||||
|
||||
$c->response->body($fh);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
1;
|
|
@ -1,5 +1,6 @@
|
|||
[% WRAPPER layout.tt title="Hydra Overview" %]
|
||||
[% PROCESS common.tt %]
|
||||
[% USE HTML %]
|
||||
[% USE date %]
|
||||
[% USE mibs=format("%.2f") %]
|
||||
|
||||
|
@ -205,6 +206,24 @@
|
|||
<img src="/static/images/nix-build.png" alt="Source" />
|
||||
Nix build of path <tt>[% product.path %]</tt>
|
||||
</a>
|
||||
[<a class="productDetailsToggle" href="javascript:">help</a>]
|
||||
<div class="help productDetails">
|
||||
<p>If you have Nix installed on your machine, this build and all
|
||||
its dependencies can be unpacked into your local Nix store by
|
||||
doing:</p>
|
||||
|
||||
<pre>$ gunzip < [% HTML.escape(build.nixname) %].closure.gz | nix-store --import</pre>
|
||||
|
||||
or to download and unpack in one command:
|
||||
|
||||
<pre>$ curl [% c.uri_for('/closure' build.id product.productnr) %] | gunzip | nix-store --import</pre>
|
||||
|
||||
<p>The package can then be found in the path <tt>[%
|
||||
product.path %]</tt>. If you get the error message “imported
|
||||
archive lacks a signature”, you should make sure that you have
|
||||
sufficient access rights to the Nix store, e.g., run the
|
||||
command as <tt>root</tt>.</p>
|
||||
</div>
|
||||
|
||||
[% CASE "file" %]
|
||||
<a href="[% c.uri_for('/download' build.id product.productnr product.name) %]">
|
||||
|
|
|
@ -205,6 +205,17 @@ div.jobset-edit h3, div.jobset h3 {
|
|||
margin-top: 0.5em;
|
||||
}
|
||||
|
||||
div.help {
|
||||
border: solid black 1px;
|
||||
padding-left: 1em;
|
||||
padding-right: 1em;
|
||||
}
|
||||
|
||||
div.help pre {
|
||||
padding-left: 1.5em;
|
||||
color: #400000;
|
||||
}
|
||||
|
||||
|
||||
/* Sortable tables */
|
||||
|
||||
|
|
Loading…
Reference in a new issue