From 11d8421def1f5dc36d608a8023195cbb0979350f Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 8 Apr 2009 09:03:45 +0000 Subject: [PATCH] * Support redirecting to some job of a release. For instance, this redirects to the "tarball" build of the latest release of patchelf/unstable: http://server/release/patchelf/unstable/latest/tarball In conjunction with the other redirects this allows linking to the actual download of the build: http://server/release/patchelf/unstable/latest/tarball/download-by-type/file/source-dist --- src/lib/Hydra/Controller/Root.pm | 22 +++++++++++++++++++--- src/root/build.tt | 2 +- src/root/product-list.tt | 4 ++-- src/root/release.tt | 4 ++-- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/lib/Hydra/Controller/Root.pm b/src/lib/Hydra/Controller/Root.pm index f730a243..ffdd56b8 100644 --- a/src/lib/Hydra/Controller/Root.pm +++ b/src/lib/Hydra/Controller/Root.pm @@ -197,7 +197,7 @@ sub create_releaseset :Local { sub release :Local { - my ($self, $c, $projectName, $releaseSetName, $releaseId) = @_; + my ($self, $c, $projectName, $releaseSetName, $releaseId, @args) = @_; $c->stash->{template} = 'release.tt'; my ($project, $releaseSet, $primaryJob, $jobs) = getReleaseSet($c, $projectName, $releaseSetName); @@ -206,9 +206,9 @@ sub release :Local { # Redirect to the latest successful release. my $latest = getLatestSuccessfulRelease($project, $primaryJob, $jobs); error($c, "This release set has no successful releases yet.") if !defined $latest; - return $c->res->redirect($c->uri_for("/release", $projectName, $releaseSetName, $latest->id)); + return $c->res->redirect($c->uri_for("/release", $projectName, $releaseSetName, $latest->id, @args)); } - + # Note: we don't actually check whether $releaseId is a primary # build, but who cares? my $primaryBuild = $project->builds->find($releaseId, @@ -218,6 +218,22 @@ sub release :Local { or error($c, "Release $releaseId doesn't exist."); $c->stash->{release} = getRelease($primaryBuild, $jobs); + + # Provide a redirect to the specified job of this release. !!! + # This isn't uniquely defined if there are multiple jobs with the + # same name (e.g. builds for different platforms). However, this + # mechanism is primarily to allow linking to resources of which + # there is only one build, such as the manual of the latest + # release. + if (scalar @args != 0) { + my $jobName = shift @args; + (my $build, my @others) = grep { $_->{job}->job eq $jobName } @{$c->stash->{release}->{jobs}}; + notFound($c, "Release doesn't have a job named `$jobName'") + unless defined $build; + error($c, "Job `$jobName' isn't unique.") if @others; + return $c->res->redirect($c->uri_for($c->controller('Build')->action_for('view_build'), + [$build->{build}->id], @args)); + } } diff --git a/src/root/build.tt b/src/root/build.tt index 8c85f596..698ec2af 100644 --- a/src/root/build.tt +++ b/src/root/build.tt @@ -308,7 +308,7 @@

Note: this build is no longer available.

[% END %] -[% INCLUDE renderProductList %] +[% INCLUDE renderProductList latestRoot=['/job' build.project.name build.jobset.name build.job.name 'latest'] %] [% END %] diff --git a/src/root/product-list.tt b/src/root/product-list.tt index 660122ad..7311cbfa 100644 --- a/src/root/product-list.tt +++ b/src/root/product-list.tt @@ -108,10 +108,10 @@ Links to latest: - [% uri2 = "${c.uri_for('/job' build.project.name build.jobset.name build.job.name 'latest' 'download-by-type' product.type product.subtype)}" %] + [% uri2 = "${c.uri_for(latestRoot.join('/') 'download-by-type' product.type product.subtype)}" %] [% uri2 %]
- [% uri2 = "${c.uri_for('/job' build.project.name build.jobset.name build.job.name 'latest' 'download' product.productnr)}" %] + [% uri2 = "${c.uri_for(latestRoot.join('/') 'download' product.productnr)}" %] [% uri2 %] diff --git a/src/root/release.tt b/src/root/release.tt index b794c287..c9b3f532 100644 --- a/src/root/release.tt +++ b/src/root/release.tt @@ -17,7 +17,7 @@ [% FOREACH j IN release.jobs %]

- [% IF j.build %][% END %] + [% IF j.build %][% END %] [% INCLUDE renderReleaseJobName job=j.job %] [% IF j.build %][% END %]

@@ -26,7 +26,7 @@ [% IF j.build.resultInfo.buildstatus == 0 %] - [% INCLUDE renderProductList build=j.build %] + [% INCLUDE renderProductList build=j.build latestRoot=['/release' project.name releaseSet.name 'latest' j.job.job] %] [% ELSE %]