diff --git a/src/lib/Hydra/Controller/Build.pm b/src/lib/Hydra/Controller/Build.pm index 0e0471ee..e94f1559 100644 --- a/src/lib/Hydra/Controller/Build.pm +++ b/src/lib/Hydra/Controller/Build.pm @@ -15,6 +15,8 @@ sub build : Chained('/') PathPart CaptureArgs(1) { $c->stash->{id} = $id; $c->stash->{build} = getBuild($c, $id); + $c->stash->{prevBuild} = getPreviousBuild($c, $c->stash->{build}); + $c->stash->{prevSuccessfulBuild} = getPreviousSuccessfulBuild($c, $c->stash->{build}); notFound($c, "Build with ID $id doesn't exist.") if !defined $c->stash->{build}; @@ -22,7 +24,6 @@ sub build : Chained('/') PathPart CaptureArgs(1) { $c->stash->{project} = $c->stash->{build}->project; } - sub view_build : Chained('build') PathPart('') Args(0) { my ($self, $c) = @_; diff --git a/src/lib/Hydra/Helper/CatalystUtils.pm b/src/lib/Hydra/Helper/CatalystUtils.pm index 7de3a8ee..f838812c 100644 --- a/src/lib/Hydra/Helper/CatalystUtils.pm +++ b/src/lib/Hydra/Helper/CatalystUtils.pm @@ -7,7 +7,7 @@ use Hydra::Helper::Nix; our @ISA = qw(Exporter); our @EXPORT = qw( - getBuild getBuildStats joinWithResultInfo getChannelData + getBuild getPreviousBuild getPreviousSuccessfulBuild getBuildStats joinWithResultInfo getChannelData error notFound requireLogin requireProjectOwner requireAdmin requirePost trim @@ -21,6 +21,34 @@ sub getBuild { return $build; } +sub getPreviousBuild { + my ($c, $build) = @_; + (my $prevBuild) = $c->model('DB::Builds')->search( + { finished => 1 + , system => $build->system + , project => $build->project->name + , jobset => $build->jobset->name + , job => $build->job->name + , 'me.id' => { '<' => $build->id } + }, {rows => 1, order_by => "id DESC"}); + + return $prevBuild; +} + +sub getPreviousSuccessfulBuild { + my ($c, $build) = @_; + (my $prevBuild) = joinWithResultInfo($c, $c->model('DB::Builds'))->search( + { finished => 1 + , system => $build->system + , project => $build->project->name + , jobset => $build->jobset->name + , job => $build->job->name + , buildstatus => 0 + , 'me.id' => { '<' => $build->id } + }, {rows => 1, order_by => "id DESC"}); + + return $prevBuild; +} sub getBuildStats { my ($c, $builds) = @_; diff --git a/src/root/build.tt b/src/root/build.tt index 1473ddef..a497362e 100644 --- a/src/root/build.tt +++ b/src/root/build.tt @@ -175,7 +175,7 @@ [% END %] - [% IF !build.finished %] + [% IF !build.finished %] [% INCLUDE renderBuildSteps type="Running" %] [% END %] @@ -383,6 +383,17 @@ [% END -%] </tbody> </table> + + [% IF prevBuild %] + <h2>Changes since previous build : [% INCLUDE renderFullBuildLink build=prevBuild %]</h2> + [% INCLUDE renderInputDiff build2=build , build1=prevBuild %] + [% END %] + + [% IF prevBuild && prevSuccessfulBuild.id != prevBuild.id %] + <h2>Changes since previous successful build : [% INCLUDE renderFullBuildLink build=prevSuccessfulBuild %]</h2> + [% INCLUDE renderInputDiff build2=build , build1=prevSuccessfulBuild %] + [% END %] + </div> diff --git a/src/root/common.tt b/src/root/common.tt index a1dc377e..a91ecb96 100644 --- a/src/root/common.tt +++ b/src/root/common.tt @@ -265,3 +265,48 @@ [% END %] [% END -%] +[% BLOCK renderInputValue %] + [% IF input.type == "build" || input.type == "sysbuild" %] + [% INCLUDE renderFullBuildLink build=input.dependency %]</a> + [% ELSIF input.type == "string" || input.type == "boolean" %] + <tt>"[% input.value %]"</tt> + [% ELSE %] + <tt>[% input.uri %][% IF input.revision %] (r. [% input.revision %])[% END %]</tt> + [% END %] +[% END %] + +[% BLOCK renderInputDiff; %] + +<table class="tablesorter"> + <thead> + <tr><th>Name</th><th>Change</th></tr> + </thead> + <tbody> + [% FOREACH bi1 IN build1.inputs %] + [% deletedInput = 1 %] + [% FOREACH bi2 IN build2.inputs %] + [% IF bi1.name == bi2.name %] + <tr> + [% IF bi1.type == bi2.type %] + [% IF bi1.value != bi2.value || bi1.uri != bi2.uri || bi1.revision != bi2.revision || bi1.path != bi2.path || bi1.dependency != bi2.dependency %] + <td>[% bi1.name %]</td> + <td> + [% INCLUDE renderInputValue input=bi1 %] to [% INCLUDE renderInputValue input=bi2 %] + </td> + [% END %] + [% ELSE %] + <td>[% bi1.name %]</td> + <td>Changed input type from '[% type = bi1.type; inputTypes.$type %]' to '[% type = bi2.type; inputTypes.$type %]'</td> + [% END %] + </tr> + [% deletedInput = 0 %] + [% END %] + [% END %] + [% IF deletedInput == 1 %] + <tr><td>[% bi1.name %]</td><td>Input not present in this build.</td></tr> + [% END %] + [% END %] + </tbody> +</table> +[% END %] +