diff --git a/src/lib/Hydra/Controller/View.pm b/src/lib/Hydra/Controller/View.pm index fd46aa1b..9c47b677 100644 --- a/src/lib/Hydra/Controller/View.pm +++ b/src/lib/Hydra/Controller/View.pm @@ -159,7 +159,38 @@ sub result : Chained('view') PathPart('') { , '+as' => ["releasename", "buildstatus"] }) or error($c, "Build $id doesn't exist."); - $c->stash->{result} = getViewResult($primaryBuild, $c->stash->{jobs}); + my $result = getViewResult($primaryBuild, $c->stash->{jobs}); + $c->stash->{result} = $result; + + if (scalar @args == 1 && $args[0] eq "release") { + requireProjectOwner($c, $c->stash->{project}); + + error($c, "The primary build of this view result did not provide a release name.") + unless $result->{releasename}; + + error($c, "A release named `" . $result->{releasename} . "' already exists.") + if $c->stash->{project}->releases->find({name => $result->{releasename}}); + + my $release; + + txn_do($c->model('DB')->schema, sub { + + $release = $c->stash->{project}->releases->create( + { name => $result->{releasename} + , timestamp => time + }); + + foreach my $job (@{$result->{jobs}}) { + $release->releasemembers->create( + { build => $job->{build}->id + , description => $job->{job}->description + }); + } + }); + + $c->res->redirect($c->uri_for($c->controller('Release')->action_for('view'), + [$c->stash->{project}->name, $release->name])); + } # Provide a redirect to the specified job of this view result. # !!! This isn't uniquely defined if there are multiple jobs with @@ -167,9 +198,9 @@ sub result : Chained('view') PathPart('') { # this mechanism is primarily to allow linking to resources of # which there is only one build, such as the manual of the latest # view result. - if (scalar @args != 0) { + elsif (scalar @args != 0) { my $jobName = shift @args; - (my $build, my @others) = grep { $_->{job}->job eq $jobName } @{$c->stash->{result}->{jobs}}; + (my $build, my @others) = grep { $_->{job}->job eq $jobName } @{$result->{jobs}}; notFound($c, "View doesn't have a job named `$jobName'") unless defined $build; error($c, "Job `$jobName' isn't unique.") if @others; diff --git a/src/root/product-list.tt b/src/root/product-list.tt index 625ffa05..9b13d8b8 100644 --- a/src/root/product-list.tt +++ b/src/root/product-list.tt @@ -111,6 +111,7 @@ URL: [% uri %] + [% IF latestRoot %] Links to latest: @@ -126,6 +127,7 @@ [% END %] + [% END %] File size:[% product.filesize %] bytes ([% mibs(product.filesize / (1024 * 1024)) %] MiB) SHA-1 hash:[% product.sha1hash %] SHA-256 hash:[% product.sha256hash %] diff --git a/src/root/release.tt b/src/root/release.tt index 2c5a387d..a262da44 100644 --- a/src/root/release.tt +++ b/src/root/release.tt @@ -23,7 +23,7 @@ release.timestamp %].

- [% INCLUDE renderProductList build=m.build latestRoot=['/view!!!' project.name view.name 'latest' j.job.job] %] + [% INCLUDE renderProductList build=m.build %] [% END %] diff --git a/src/root/view-result.tt b/src/root/view-result.tt index d1a7dc3e..ece05008 100644 --- a/src/root/view-result.tt +++ b/src/root/view-result.tt @@ -42,4 +42,10 @@ [% END %] +[% IF c.user_exists %] +

+[Release] +

+[% END %] + [% END %]