hydra/src/lib/Hydra/Base/Controller/NixChannel.pm

92 lines
2.3 KiB
Perl
Raw Normal View History

2009-03-04 12:23:54 +00:00
package Hydra::Base::Controller::NixChannel;
2009-02-25 14:34:29 +00:00
use strict;
use warnings;
use base 'Catalyst::Controller';
2009-02-25 14:34:29 +00:00
use Hydra::Helper::Nix;
use Hydra::Helper::CatalystUtils;
sub closure : Chained('nix') PathPart {
my ($self, $c) = @_;
$c->stash->{current_view} = 'Hydra::View::NixClosure';
# !!! quick hack; this is to make HEAD requests return the right
# MIME type. This is set in the view as well, but the view isn't
# called for HEAD requests. There should be a cleaner solution...
$c->response->content_type('application/x-nix-export');
}
2009-03-03 14:21:27 +00:00
sub manifest : Chained('nix') PathPart("MANIFEST") Args(0) {
2009-02-25 14:34:29 +00:00
my ($self, $c) = @_;
$c->stash->{current_view} = 'Hydra::View::NixManifest';
2009-02-25 14:50:17 +00:00
$c->stash->{narBase} = $c->uri_for($self->action_for("nar"), $c->req->captures);
}
sub nar : Chained('nix') PathPart {
my ($self, $c, @rest) = @_;
my $path .= "/" . join("/", @rest);
if (!isValidPath($path)) {
2010-02-05 20:24:20 +00:00
$c->response->status(410); # "Gone"
error($c, "Path " . $path . " is no longer available.");
}
2009-02-25 14:50:17 +00:00
# !!! check that $path is in the closure of $c->stash->{storePaths}.
$c->stash->{current_view} = 'Hydra::View::NixNAR';
$c->stash->{storePath} = $path;
2009-02-25 14:34:29 +00:00
}
2009-02-25 15:39:51 +00:00
sub pkg : Chained('nix') PathPart Args(1) {
my ($self, $c, $pkgName) = @_;
my $pkg = $c->stash->{nixPkgs}->{$pkgName};
notFound($c, "Unknown Nix package `$pkgName'.")
unless defined $pkg;
$c->stash->{build} = $pkg->{build};
2009-02-25 15:39:51 +00:00
2009-02-26 21:33:29 +00:00
$c->stash->{manifestUri} = $c->uri_for($self->action_for("manifest"), $c->req->captures);
2009-02-25 15:39:51 +00:00
$c->stash->{current_view} = 'Hydra::View::NixPkg';
$c->response->content_type('application/nix-package');
}
sub nixexprs : Chained('nix') PathPart('nixexprs.tar.bz2') Args(0) {
my ($self, $c) = @_;
$c->stash->{current_view} = 'Hydra::View::NixExprs';
}
sub name {
my ($build) = @_;
return $build->get_column('releasename') || $build->nixname;
}
2009-03-04 15:47:42 +00:00
sub sortPkgs {
# Sort by name, then timestamp.
return sort
{ lc(name($a->{build})) cmp lc(name($b->{build}))
or $a->{build}->timestamp <=> $b->{build}->timestamp
} @_;
}
sub channel_contents : Chained('nix') PathPart('') Args(0) {
my ($self, $c) = @_;
$c->stash->{template} = 'channel-contents.tt';
2009-03-04 15:47:42 +00:00
$c->stash->{nixPkgs} = [sortPkgs (values %{$c->stash->{nixPkgs}})];
}
2009-02-25 14:34:29 +00:00
1;