From 3e5e49debdd453b8447db8e57fee1a3f6b465157 Mon Sep 17 00:00:00 2001
From: Eelco Dolstra <e.dolstra@tudelft.nl>
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 @@
               <th>URL:</th>
               <td><a href="[% uri %]"><tt>[% uri %]</tt></a></td>
             </tr>
+            [% IF latestRoot %]
             <tr>              
               <th>Links to latest:</th>
               <td>
@@ -126,6 +127,7 @@
                 [% END %]
               </td>
             </tr>
+            [% END %]
             <tr><th>File size:</th><td>[% product.filesize %] bytes ([% mibs(product.filesize / (1024 * 1024)) %] MiB)</td></tr>
             <tr><th>SHA-1 hash:</th><td><tt>[% product.sha1hash %]</tt></td></tr>
             <tr><th>SHA-256 hash:</th><td><tt>[% product.sha256hash %]</tt></td></tr>
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 %].</em></p>
     </a>
   </h2>
 
-  [% 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 %]
+<p>
+[<a href="[% c.uri_for('/view' project.name view.name result.id 'release') %]">Release</a>]
+</p>
+[% END %]
+
 [% END %]