Add a redirect to the latest view result for which the underlying evaluation has finished completely

This will be useful for the Nixpkgs channel mirror script:

  http://hydra.nixos.org/view/nixpkgs/unstable/latest-finished/channel

is the channel containing the latest, consistent, tested set of builds.
This commit is contained in:
Eelco Dolstra 2012-04-03 17:45:03 +02:00
parent bd93ca9316
commit f52ca0c588
3 changed files with 23 additions and 4 deletions

View file

@ -140,7 +140,20 @@ sub latest : Chained('view') PathPart('latest') {
# Redirect to the latest result in the view in which every build # Redirect to the latest result in the view in which every build
# is successful. # is successful.
my $latest = getLatestSuccessfulViewResult( my $latest = getLatestSuccessfulViewResult(
$c->stash->{project}, $c->stash->{primaryJob}, $c->stash->{jobs}); $c->stash->{project}, $c->stash->{primaryJob}, $c->stash->{jobs}, 0);
error($c, "This view set has no successful results yet.") if !defined $latest;
$c->res->redirect($c->uri_for($self->action_for("view_view"), $c->req->captures, $latest->id, @args));
}
sub latest_finished : Chained('view') PathPart('latest-finished') {
my ($self, $c, @args) = @_;
# Redirect to the latest result in the view in which every build
# is successful *and* where the jobset evaluation has finished
# completely.
my $latest = getLatestSuccessfulViewResult(
$c->stash->{project}, $c->stash->{primaryJob}, $c->stash->{jobs}, 1);
error($c, "This view set has no successful results yet.") if !defined $latest; error($c, "This view set has no successful results yet.") if !defined $latest;
$c->res->redirect($c->uri_for($self->action_for("view_view"), $c->req->captures, $latest->id, @args)); $c->res->redirect($c->uri_for($self->action_for("view_view"), $c->req->captures, $latest->id, @args));
} }

View file

@ -222,10 +222,16 @@ sub getViewResult {
sub getLatestSuccessfulViewResult { sub getLatestSuccessfulViewResult {
my ($project, $primaryJob, $jobs) = @_; my ($project, $primaryJob, $jobs, $finished) = @_;
my $latest; my $latest;
foreach my $build (getPrimaryBuildsForView($project, $primaryJob)) { foreach my $build (getPrimaryBuildsForView($project, $primaryJob)) {
return $build if getViewResult($build, $jobs)->{status} == 0; my $result = getViewResult($build, $jobs);
next if $result->{status} != 0;
if ($finished) {
next unless defined $result->{eval};
next if $result->{eval}->builds->search({ finished => 0 })->count > 0;
}
return $build;
} }
return undef; return undef;
} }

View file

@ -109,7 +109,7 @@ foreach my $project ($db->resultset('Projects')->search({}, { order_by => ["name
my $jobs = [$view->viewjobs->all]; my $jobs = [$view->viewjobs->all];
# Keep all builds belonging to the most recent successful view result. # Keep all builds belonging to the most recent successful view result.
my $latest = getLatestSuccessfulViewResult($project, $primaryJob, $jobs); my $latest = getLatestSuccessfulViewResult($project, $primaryJob, $jobs, 0);
if (defined $latest) { if (defined $latest) {
print STDERR " keeping latest successful view result ", $latest->id, " (", $latest->get_column('releasename'), ")\n"; print STDERR " keeping latest successful view result ", $latest->id, " (", $latest->get_column('releasename'), ")\n";
my $result = getViewResult($latest, $jobs); my $result = getViewResult($latest, $jobs);