2011-07-18 15:03:15 +00:00
package Hydra::Controller::Jobset ;
2009-03-13 15:23:08 +00:00
use strict ;
use warnings ;
use base 'Hydra::Base::Controller::ListBuilds' ;
use Hydra::Helper::Nix ;
use Hydra::Helper::CatalystUtils ;
2013-06-17 12:34:21 -04:00
sub jobsetChain :Chained('/') :PathPart('jobset') :CaptureArgs(2) {
2009-03-13 15:23:08 +00:00
my ( $ self , $ c , $ projectName , $ jobsetName ) = @ _ ;
2013-06-17 12:34:21 -04:00
my $ project = $ c - > model ( 'DB::Projects' ) - > find ( $ projectName ) ;
if ( $ project ) {
$ c - > stash - > { project } = $ project ;
$ c - > stash - > { jobset_ } = $ project - > jobsets - > search ( { 'me.name' = > $ jobsetName } ) ;
my $ jobset = $ c - > stash - > { jobset_ } - > single ;
if ( $ jobset ) {
$ c - > stash - > { jobset } = $ jobset ;
} else {
if ( $ c - > action - > name eq "jobset" and $ c - > request - > method eq "PUT" ) {
$ c - > stash - > { jobsetName } = $ jobsetName ;
} else {
$ self - > status_not_found (
$ c ,
message = > "Jobset $jobsetName doesn't exist."
) ;
$ c - > detach ;
}
}
} else {
$ self - > status_not_found (
$ c ,
message = > "Project $projectName doesn't exist."
) ;
$ c - > detach ;
}
2009-03-13 15:23:08 +00:00
}
2012-02-21 17:59:36 +01:00
2013-06-17 12:34:21 -04:00
sub jobset :Chained('jobsetChain') :PathPart('') :Args(0) :ActionClass('REST::ForBrowsers') { }
sub jobset_GET {
2013-02-22 14:29:12 +01:00
my ( $ self , $ c ) = @ _ ;
2009-03-13 15:23:08 +00:00
2009-04-02 16:15:57 +00:00
$ c - > stash - > { template } = 'jobset.tt' ;
2011-05-16 08:03:06 +00:00
2013-02-22 14:29:12 +01:00
$ c - > stash - > { evals } = getEvals ( $ self , $ c , scalar $ c - > stash - > { jobset } - > jobsetevals , 0 , 10 ) ;
( $ c - > stash - > { latestEval } ) = $ c - > stash - > { jobset } - > jobsetevals - > search ( { } , { limit = > 1 , order_by = > [ "id desc" ] } ) ;
2013-06-17 12:34:21 -04:00
$ self - > status_ok (
$ c ,
entity = > $ c - > stash - > { jobset_ } - > find ( { } , {
columns = > [
'me.name' ,
'me.project' ,
'me.errormsg' ,
'jobsetinputs.name' ,
{
'jobsetinputs.jobsetinputalts.altnr' = > 'jobsetinputalts.altnr' ,
'jobsetinputs.jobsetinputalts.value' = > 'jobsetinputalts.value'
}
] ,
join = > { 'jobsetinputs' = > 'jobsetinputalts' } ,
collapse = > 1 ,
order_by = > "me.name"
} )
) ;
2013-02-22 14:29:12 +01:00
}
2013-06-17 12:34:21 -04:00
sub jobset_PUT {
my ( $ self , $ c ) = @ _ ;
requireProjectOwner ( $ c , $ c - > stash - > { project } ) ;
2013-02-22 14:29:12 +01:00
2013-06-17 12:34:21 -04:00
if ( defined $ c - > stash - > { jobset } ) {
error ( $ c , "Cannot rename jobset `$c->stash->{params}->{oldName}' over existing jobset `$c->stash->{jobset}->name" ) if defined $ c - > stash - > { params } - > { oldName } and $ c - > stash - > { params } - > { oldName } ne $ c - > stash - > { jobset } - > name ;
txn_do ( $ c - > model ( 'DB' ) - > schema , sub {
updateJobset ( $ c , $ c - > stash - > { jobset } ) ;
} ) ;
if ( $ c - > req - > looks_like_browser ) {
$ c - > res - > redirect ( $ c - > uri_for ( $ self - > action_for ( "jobset" ) ,
[ $ c - > stash - > { project } - > name , $ c - > stash - > { jobset } - > name ] ) . "#tabs-configuration" ) ;
} else {
$ self - > status_no_content ( $ c ) ;
}
} elsif ( defined $ c - > stash - > { params } - > { oldName } ) {
my $ jobset = $ c - > stash - > { project } - > jobsets - > find ( { 'me.name' = > $ c - > stash - > { params } - > { oldName } } ) ;
if ( defined $ jobset ) {
txn_do ( $ c - > model ( 'DB' ) - > schema , sub {
updateJobset ( $ c , $ jobset ) ;
} ) ;
my $ uri = $ c - > uri_for ( $ self - > action_for ( "jobset" ) , [ $ c - > stash - > { project } - > name , $ jobset - > name ] ) ;
if ( $ c - > req - > looks_like_browser ) {
$ c - > res - > redirect ( $ uri . "#tabs-configuration" ) ;
} else {
$ self - > status_created (
$ c ,
location = > "$uri" ,
entity = > { name = > $ jobset - > name , uri = > "$uri" , type = > "jobset" }
) ;
}
} else {
$ self - > status_not_found (
$ c ,
message = > "Jobset $c->stash->{params}->{oldName} doesn't exist."
) ;
}
} else {
my $ exprType =
$ c - > stash - > { params } - > { "nixexprpath" } =~ /.scm$/ ? "guile" : "nix" ;
error ( $ c , "Invalid jobset name: ‘ $c->stash->{jobsetName}’ " ) if $ c - > stash - > { jobsetName } !~ /^$jobsetNameRE$/ ;
my $ jobset ;
txn_do ( $ c - > model ( 'DB' ) - > schema , sub {
# Note: $jobsetName is validated in updateProject, which will
# abort the transaction if the name isn't valid.
$ jobset = $ c - > stash - > { project } - > jobsets - > create (
{ name = > $ c - > stash - > { jobsetName } , nixexprinput = > "" , nixexprpath = > "" , emailoverride = > "" } ) ;
updateJobset ( $ c , $ jobset ) ;
} ) ;
my $ uri = $ c - > uri_for ( $ self - > action_for ( "jobset" ) , [ $ c - > stash - > { project } - > name , $ jobset - > name ] ) ;
if ( $ c - > req - > looks_like_browser ) {
$ c - > res - > redirect ( $ uri . "#tabs-configuration" ) ;
} else {
$ self - > status_created (
$ c ,
location = > "$uri" ,
entity = > { name = > $ jobset - > name , uri = > "$uri" , type = > "jobset" }
) ;
}
}
}
sub jobs_tab : Chained('jobsetChain') PathPart('jobs-tab') Args(0) {
2013-02-22 14:29:12 +01:00
my ( $ self , $ c ) = @ _ ;
$ c - > stash - > { template } = 'jobset-jobs-tab.tt' ;
2010-02-09 13:47:20 +00:00
$ c - > stash - > { activeJobs } = [] ;
$ c - > stash - > { inactiveJobs } = [] ;
2013-02-22 14:29:12 +01:00
( my $ latestEval ) = $ c - > stash - > { jobset } - > jobsetevals - > search (
{ hasnewbuilds = > 1 } , { limit = > 1 , order_by = > [ "id desc" ] } ) ;
my % activeJobs ;
if ( defined $ latestEval ) {
foreach my $ build ( $ latestEval - > builds - > search ( { } , { order_by = > [ "job" ] , select = > [ "job" ] } ) ) {
my $ job = $ build - > get_column ( "job" ) ;
if ( ! defined $ activeJobs { $ job } ) {
$ activeJobs { $ job } = 1 ;
push @ { $ c - > stash - > { activeJobs } } , $ job ;
}
}
}
foreach my $ job ( $ c - > stash - > { jobset } - > jobs - > search ( { } , { order_by = > [ "name" ] } ) ) {
if ( ! defined $ activeJobs { $ job - > name } ) {
2010-02-09 13:47:20 +00:00
push @ { $ c - > stash - > { inactiveJobs } } , $ job - > name ;
}
}
2013-02-22 14:29:12 +01:00
}
2011-05-16 08:03:06 +00:00
2012-04-13 11:26:37 +02:00
2013-06-17 12:34:21 -04:00
sub status_tab : Chained('jobsetChain') PathPart('status-tab') Args(0) {
2013-02-22 14:29:12 +01:00
my ( $ self , $ c ) = @ _ ;
$ c - > stash - > { template } = 'jobset-status-tab.tt' ;
# FIXME: use latest eval instead of iscurrent.
2013-02-22 11:37:35 +01:00
2013-01-22 14:41:02 +01:00
$ c - > stash - > { systems } =
2011-11-29 18:08:23 +01:00
[ $ c - > stash - > { jobset } - > builds - > search ( { iscurrent = > 1 } , { select = > [ "system" ] , distinct = > 1 , order_by = > "system" } ) ] ;
2011-05-16 08:03:06 +00:00
2010-02-05 14:48:22 +00:00
# status per system
my @ systems = ( ) ;
foreach my $ system ( @ { $ c - > stash - > { systems } } ) {
2013-01-22 14:09:37 +01:00
push ( @ systems , $ system - > system ) ;
2010-02-05 14:48:22 +00:00
}
2011-05-16 08:03:06 +00:00
2013-02-22 14:29:12 +01:00
my @ select = ( ) ;
my @ as = ( ) ;
push ( @ select , "job" ) ; push ( @ as , "job" ) ;
foreach my $ system ( @ systems ) {
push ( @ select , "(select buildstatus from Builds b where b.id = (select max(id) from Builds t where t.project = me.project and t.jobset = me.jobset and t.job = me.job and t.system = '$system' and t.iscurrent = 1 ))" ) ;
push ( @ as , $ system ) ;
push ( @ select , "(select b.id from Builds b where b.id = (select max(id) from Builds t where t.project = me.project and t.jobset = me.jobset and t.job = me.job and t.system = '$system' and t.iscurrent = 1 ))" ) ;
push ( @ as , "$system-build" ) ;
2010-02-09 13:47:20 +00:00
}
2011-05-16 08:03:06 +00:00
2013-02-22 14:29:12 +01:00
$ c - > stash - > { activeJobsStatus } = [
$ c - > model ( 'DB' ) - > resultset ( 'ActiveJobsForJobset' ) - > search (
{ } ,
{ bind = > [ $ c - > stash - > { project } - > name , $ c - > stash - > { jobset } - > name ]
, select = > \ @ select
, as = > \ @ as
, order_by = > [ "job" ]
} ) ] ;
2010-02-09 13:43:53 +00:00
}
2009-03-13 15:23:08 +00:00
# Hydra::Base::Controller::ListBuilds needs this.
2013-06-17 12:34:21 -04:00
sub get_builds : Chained('jobsetChain') PathPart('') CaptureArgs(0) {
2009-03-13 15:23:08 +00:00
my ( $ self , $ c ) = @ _ ;
2009-03-13 17:32:08 +00:00
$ c - > stash - > { allBuilds } = $ c - > stash - > { jobset } - > builds ;
2009-04-03 15:37:21 +00:00
$ c - > stash - > { jobStatus } = $ c - > model ( 'DB' ) - > resultset ( 'JobStatusForJobset' )
- > search ( { } , { bind = > [ $ c - > stash - > { project } - > name , $ c - > stash - > { jobset } - > name ] } ) ;
2009-04-08 22:08:00 +00:00
$ c - > stash - > { allJobsets } = $ c - > stash - > { jobset_ } ;
$ c - > stash - > { allJobs } = $ c - > stash - > { jobset } - > jobs ;
2009-04-03 15:37:21 +00:00
$ c - > stash - > { latestSucceeded } = $ c - > model ( 'DB' ) - > resultset ( 'LatestSucceededForJobset' )
- > search ( { } , { bind = > [ $ c - > stash - > { project } - > name , $ c - > stash - > { jobset } - > name ] } ) ;
2009-03-13 15:23:08 +00:00
$ c - > stash - > { channelBaseName } =
2009-03-13 15:41:19 +00:00
$ c - > stash - > { project } - > name . "-" . $ c - > stash - > { jobset } - > name ;
2009-03-13 15:23:08 +00:00
}
2013-06-17 12:34:21 -04:00
sub edit : Chained('jobsetChain') PathPart Args(0) {
2009-04-02 16:15:57 +00:00
my ( $ self , $ c ) = @ _ ;
2011-05-16 08:03:06 +00:00
2009-04-02 16:15:57 +00:00
requireProjectOwner ( $ c , $ c - > stash - > { project } ) ;
2013-02-21 02:33:57 +01:00
$ c - > stash - > { template } = 'edit-jobset.tt' ;
2009-04-02 16:15:57 +00:00
$ c - > stash - > { edit } = 1 ;
}
2013-06-17 12:34:21 -04:00
sub submit : Chained('jobsetChain') PathPart Args(0) {
2009-04-02 16:15:57 +00:00
my ( $ self , $ c ) = @ _ ;
2011-05-16 08:03:06 +00:00
2009-04-02 16:15:57 +00:00
requirePost ( $ c ) ;
2011-05-16 08:03:06 +00:00
2013-02-26 17:36:49 +01:00
if ( ( $ c - > request - > params - > { submit } // "" ) eq "delete" ) {
2013-06-11 16:57:22 +02:00
txn_do ( $ c - > model ( 'DB' ) - > schema , sub {
$ c - > stash - > { jobset } - > jobsetevals - > delete_all ;
$ c - > stash - > { jobset } - > builds - > delete_all ;
$ c - > stash - > { jobset } - > delete ;
} ) ;
2013-06-17 12:34:21 -04:00
return $ c - > res - > redirect ( $ c - > uri_for ( $ c - > controller ( 'Project' ) - > action_for ( "project" ) , [ $ c - > stash - > { project } - > name ] ) ) ;
2013-02-26 17:36:49 +01:00
}
2013-06-17 12:34:21 -04:00
my $ newName = trim $ c - > stash - > { params } - > { name } ;
my $ oldName = trim $ c - > stash - > { jobset } - > name ;
unless ( $ oldName eq $ newName ) {
$ c - > stash - > { params } - > { oldName } = $ oldName ;
$ c - > stash - > { jobsetName } = $ newName ;
undef $ c - > stash - > { jobset } ;
}
jobset_PUT ( $ self , $ c ) ;
2009-04-02 16:15:57 +00:00
}
2009-10-26 15:39:14 +00:00
sub nixExprPathFromParams {
my ( $ c ) = @ _ ;
2011-05-16 08:03:06 +00:00
2009-04-02 16:15:57 +00:00
# The Nix expression path must be relative and can't contain ".." elements.
2013-06-17 12:34:21 -04:00
my $ nixExprPath = trim $ c - > stash - > { params } - > { "nixexprpath" } ;
2009-04-02 16:15:57 +00:00
error ( $ c , "Invalid Nix expression path: $nixExprPath" ) if $ nixExprPath !~ /^$relPathRE$/ ;
2013-06-17 12:34:21 -04:00
my $ nixExprInput = trim $ c - > stash - > { params } - > { "nixexprinput" } ;
2009-04-02 16:15:57 +00:00
error ( $ c , "Invalid Nix expression input name: $nixExprInput" ) unless $ nixExprInput =~ /^\w+$/ ;
2009-10-26 15:39:14 +00:00
return ( $ nixExprPath , $ nixExprInput ) ;
}
sub checkInputValue {
my ( $ c , $ type , $ value ) = @ _ ;
$ value = trim $ value ;
error ( $ c , "Invalid Boolean value: $value" ) if
$ type eq "boolean" && ! ( $ value eq "true" || $ value eq "false" ) ;
return $ value ;
}
sub updateJobset {
my ( $ c , $ jobset ) = @ _ ;
2013-06-17 12:34:21 -04:00
my $ jobsetName = $ c - > stash - > { jobsetName } or $ jobset - > name ;
2012-04-17 08:53:00 +00:00
error ( $ c , "Invalid jobset name: ‘ $jobsetName’ " ) if $ jobsetName !~ /^$jobsetNameRE$/ ;
2009-10-26 15:39:14 +00:00
2012-08-16 19:07:04 +02:00
# When the expression is in a .scm file, assume it's a Guile + Guix
# build expression.
my $ exprType =
2013-06-17 12:34:21 -04:00
$ c - > stash - > { params } - > { "nixexprpath" } =~ /.scm$/ ? "guile" : "nix" ;
2012-08-16 19:07:04 +02:00
2009-10-26 15:39:14 +00:00
my ( $ nixExprPath , $ nixExprInput ) = nixExprPathFromParams $ c ;
2009-04-02 16:15:57 +00:00
$ jobset - > update (
{ name = > $ jobsetName
2013-06-17 12:34:21 -04:00
, description = > trim ( $ c - > stash - > { params } - > { "description" } )
2009-04-02 16:15:57 +00:00
, nixexprpath = > $ nixExprPath
, nixexprinput = > $ nixExprInput
2013-06-17 12:34:21 -04:00
, enabled = > defined $ c - > stash - > { params } - > { enabled } ? 1 : 0
, enableemail = > defined $ c - > stash - > { params } - > { enableemail } ? 1 : 0
, emailoverride = > trim ( $ c - > stash - > { params } - > { emailoverride } ) || ""
, hidden = > defined $ c - > stash - > { params } - > { visible } ? 0 : 1
, keepnr = > int ( trim ( $ c - > stash - > { params } - > { keepnr } ) ) || 3
, checkinterval = > int ( trim ( $ c - > stash - > { params } - > { checkinterval } ) )
2013-02-26 16:10:36 +01:00
, triggertime = > $ jobset - > triggertime // time ( )
2009-04-02 16:15:57 +00:00
} ) ;
# Process the inputs of this jobset.
2013-06-17 12:34:21 -04:00
unless ( defined $ c - > stash - > { params } - > { inputs } ) {
$ c - > stash - > { params } - > { inputs } = { } ;
foreach my $ param ( keys % { $ c - > stash - > { params } } ) {
next unless $ param =~ /^input-(\w+)-name$/ ;
my $ baseName = $ 1 ;
next if $ baseName eq "template" ;
$ c - > stash - > { params } - > { inputs } - > { $ c - > stash - > { params } - > { $ param } } = { type = > $ c - > stash - > { params } - > { "input-$baseName-type" } , values = > $ c - > stash - > { params } - > { "input-$baseName-values" } } ;
unless ( $ baseName =~ /^\d+$/ ) { # non-numeric base name is an existing entry
$ c - > stash - > { params } - > { inputs } - > { $ c - > stash - > { params } - > { $ param } } - > { oldName } = $ baseName ;
}
}
}
2009-04-02 16:15:57 +00:00
2013-06-17 12:34:21 -04:00
foreach my $ inputName ( keys % { $ c - > stash - > { params } - > { inputs } } ) {
my $ inputData = $ c - > stash - > { params } - > { inputs } - > { $ inputName } ;
error ( $ c , "Invalid input name: $inputName" ) unless $ inputName =~ /^[[:alpha:]]\w*$/ ;
2009-04-02 16:15:57 +00:00
2013-06-17 12:34:21 -04:00
my $ inputType = $ inputData - > { type } ;
error ( $ c , "Invalid input type: $inputType" ) unless
$ inputType eq "svn" || $ inputType eq "svn-checkout" || $ inputType eq "hg" || $ inputType eq "tarball" ||
$ inputType eq "string" || $ inputType eq "path" || $ inputType eq "boolean" || $ inputType eq "bzr" || $ inputType eq "bzr-checkout" ||
$ inputType eq "git" || $ inputType eq "build" || $ inputType eq "sysbuild" ;
2011-05-16 08:03:06 +00:00
2009-04-02 16:15:57 +00:00
my $ input ;
2013-06-17 12:34:21 -04:00
unless ( defined $ inputData - > { oldName } ) {
$ input = $ jobset - > jobsetinputs - > update_or_create (
2009-04-02 16:15:57 +00:00
{ name = > $ inputName
, type = > $ inputType
} ) ;
} else { # it's an existing input
2013-06-17 12:34:21 -04:00
$ input = ( $ jobset - > jobsetinputs - > search ( { name = > $ inputData - > { oldName } } ) ) [ 0 ] ;
2009-04-02 16:15:57 +00:00
die unless defined $ input ;
$ input - > update ( { name = > $ inputName , type = > $ inputType } ) ;
}
# Update the values for this input. Just delete all the
# current ones, then create the new values.
$ input - > jobsetinputalts - > delete_all ;
2013-06-17 12:34:21 -04:00
my $ values = $ inputData - > { values } ;
2009-04-02 16:15:57 +00:00
$ values = [] unless defined $ values ;
$ values = [ $ values ] unless ref ( $ values ) eq 'ARRAY' ;
my $ altnr = 0 ;
foreach my $ value ( @ { $ values } ) {
2009-10-26 15:39:14 +00:00
$ value = checkInputValue ( $ c , $ inputType , $ value ) ;
2009-04-02 16:15:57 +00:00
$ input - > jobsetinputalts - > create ( { altnr = > $ altnr + + , value = > $ value } ) ;
}
}
# Get rid of deleted inputs.
my @ inputs = $ jobset - > jobsetinputs - > all ;
foreach my $ input ( @ inputs ) {
2013-06-17 12:34:21 -04:00
$ input - > delete unless defined $ c - > stash - > { params } - > { inputs } - > { $ input - > name } ;
2009-04-02 16:15:57 +00:00
}
}
2013-06-17 12:34:21 -04:00
sub clone : Chained('jobsetChain') PathPart('clone') Args(0) {
2010-04-23 11:20:40 +00:00
my ( $ self , $ c ) = @ _ ;
my $ jobset = $ c - > stash - > { jobset } ;
requireProjectOwner ( $ c , $ jobset - > project ) ;
$ c - > stash - > { template } = 'clone-jobset.tt' ;
}
2012-02-21 17:59:36 +01:00
2013-06-17 12:34:21 -04:00
sub clone_submit : Chained('jobsetChain') PathPart('clone/submit') Args(0) {
2010-04-23 11:20:40 +00:00
my ( $ self , $ c ) = @ _ ;
my $ jobset = $ c - > stash - > { jobset } ;
requireProjectOwner ( $ c , $ jobset - > project ) ;
requirePost ( $ c ) ;
2013-06-17 12:34:21 -04:00
my $ newJobsetName = trim $ c - > stash - > { params } - > { "newjobset" } ;
2012-04-17 08:53:00 +00:00
error ( $ c , "Invalid jobset name: $newJobsetName" ) unless $ newJobsetName =~ /^[[:alpha:]][\w\-]*$/ ;
2010-04-23 11:20:40 +00:00
2012-04-17 08:53:00 +00:00
my $ newJobset ;
2011-05-16 08:03:06 +00:00
txn_do ( $ c - > model ( 'DB' ) - > schema , sub {
2012-04-17 08:53:00 +00:00
$ newJobset = $ jobset - > project - > jobsets - > create (
{ name = > $ newJobsetName
2010-04-23 11:20:40 +00:00
, description = > $ jobset - > description
, nixexprpath = > $ jobset - > nixexprpath
, nixexprinput = > $ jobset - > nixexprinput
, enabled = > 0
2011-05-16 08:03:06 +00:00
, enableemail = > $ jobset - > enableemail
2011-03-07 15:55:37 +00:00
, emailoverride = > $ jobset - > emailoverride || ""
2011-05-16 08:03:06 +00:00
} ) ;
2010-04-23 11:20:40 +00:00
foreach my $ input ( $ jobset - > jobsetinputs ) {
2012-04-17 08:53:00 +00:00
my $ newinput = $ newJobset - > jobsetinputs - > create ( { name = > $ input - > name , type = > $ input - > type } ) ;
2010-04-23 11:20:40 +00:00
foreach my $ inputalt ( $ input - > jobsetinputalts ) {
$ newinput - > jobsetinputalts - > create ( { altnr = > $ inputalt - > altnr , value = > $ inputalt - > value } ) ;
}
}
} ) ;
2011-05-16 08:03:06 +00:00
2012-04-17 08:53:00 +00:00
$ c - > res - > redirect ( $ c - > uri_for ( $ c - > controller ( 'Jobset' ) - > action_for ( "edit" ) , [ $ jobset - > project - > name , $ newJobsetName ] ) ) ;
2010-04-23 11:20:40 +00:00
}
2013-06-17 12:34:21 -04:00
sub evals :Chained('jobsetChain') :PathPart('evals') :Args(0) :ActionClass('REST') { }
sub evals_GET {
2012-04-02 16:11:22 +02:00
my ( $ self , $ c ) = @ _ ;
2013-02-21 17:27:17 +01:00
$ c - > stash - > { template } = 'evals.tt' ;
2012-04-02 16:11:22 +02:00
my $ page = int ( $ c - > req - > param ( 'page' ) || "1" ) || 1 ;
my $ resultsPerPage = 20 ;
2013-02-21 17:27:17 +01:00
my $ evals = $ c - > stash - > { jobset } - > jobsetevals ;
2012-04-02 16:11:22 +02:00
$ c - > stash - > { page } = $ page ;
$ c - > stash - > { resultsPerPage } = $ resultsPerPage ;
2013-02-21 17:27:17 +01:00
$ c - > stash - > { total } = $ evals - > search ( { hasnewbuilds = > 1 } ) - > count ;
2013-06-17 12:34:21 -04:00
my $ offset = ( $ page - 1 ) * $ resultsPerPage ;
$ c - > stash - > { evals } = getEvals ( $ self , $ c , $ evals , $ offset , $ resultsPerPage ) ;
my % entity = (
evals = > [ $ evals - > search ( { 'me.hasnewbuilds' = > 1 } , {
columns = > [
'me.hasnewbuilds' ,
'me.id' ,
'jobsetevalinputs.name' ,
'jobsetevalinputs.altnr' ,
'jobsetevalinputs.revision' ,
'jobsetevalinputs.type' ,
'jobsetevalinputs.uri' ,
'jobsetevalinputs.dependency' ,
'jobsetevalmembers.build' ,
] ,
join = > [ 'jobsetevalinputs' , 'jobsetevalmembers' ] ,
collapse = > 1 ,
rows = > $ resultsPerPage ,
offset = > $ offset ,
order_by = > "me.id DESC" ,
} ) ] ,
first = > "?page=1" ,
last = > "?page=" . POSIX:: ceil ( $ c - > stash - > { total } / $ resultsPerPage )
) ;
if ( $ page > 1 ) {
$ entity { previous } = "?page=" . ( $ page - 1 ) ;
}
if ( $ page < POSIX:: ceil ( $ c - > stash - > { total } / $ resultsPerPage ) ) {
$ entity { next } = "?page=" . ( $ page + 1 ) ;
}
$ self - > status_ok (
$ c ,
entity = > \ % entity
) ;
2012-04-02 16:11:22 +02:00
}
2010-04-23 11:20:40 +00:00
2012-04-03 01:30:54 +02:00
# Redirect to the latest finished evaluation of this jobset.
2013-06-17 12:34:21 -04:00
sub latest_eval : Chained('jobsetChain') PathPart('latest-eval') {
2012-04-03 01:30:54 +02:00
my ( $ self , $ c , @ args ) = @ _ ;
2012-04-03 11:28:59 +02:00
my $ eval = getLatestFinishedEval ( $ c , $ c - > stash - > { jobset } )
or notFound ( $ c , "No evaluation found." ) ;
2012-04-04 12:56:49 +02:00
$ c - > res - > redirect ( $ c - > uri_for ( $ c - > controller ( 'JobsetEval' ) - > action_for ( "view" ) , [ $ eval - > id ] , @ args , $ c - > req - > params ) ) ;
2012-04-03 01:30:54 +02:00
}
2009-03-13 15:23:08 +00:00
1 ;