From 3e5e49debdd453b8447db8e57fee1a3f6b465157 Mon Sep 17 00:00:00 2001
From: Eelco Dolstra
Date: Tue, 27 Oct 2009 15:31:26 +0000
Subject: [PATCH] * Allow a view result to be saved as a release.
---
src/lib/Hydra/Controller/View.pm | 37 +++++++++++++++++++++++++++++---
src/root/product-list.tt | 2 ++
src/root/release.tt | 2 +-
src/root/view-result.tt | 6 ++++++
4 files changed, 43 insertions(+), 4 deletions(-)
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 %]