The same info is readily available under the most recent jobset eval page.
G2WXEQHE6WCBN25VLO6XF3FJAOCJLMRKYOIQLETGIWTR6ON2AIVAC
NRSKJPP4FYTEKWNLVRK2QZDL6P24VJAC6R6NUBVX77JSUEBVRISAC
VG4QG336SCZNWAXJERI3N5FO6PUAYFJV24CLI27ADUFPO74RVJKQC
AK2UZDS2IRVBZP3GRNZS2SIKMKEFUBPIVSA45EZBH4UYFKWI2HCAC
TCHEWSZLG3PX7JFBLYO5ASBYAGZU4TWUYZQGNXPHQ3J7DILQPYGAC
FPK5LF53CFUEKFYJ3IYXT4UTVC6IITWJOCFATMC4PLHEUP5SIEAAC
3PNG7NIBQQURUUPRVQXYL342OT7JUUYOMY2JJNP6YDX7SYJDZMYAC
3EGKZC3CURTH4S36LMFCU57S42VARSHDAGA4J56RKNPD5VR4FKSQC
ZD5AEKWMW6IFFW46BJEFRPXRWMXTKCM4CSES6YTUOY7DEUX3E7JQC
HPEG2RHVNHOPB5T4ZRXANIRBMVOVY3B5GFETJRYOTDJFVAYH2TQAC
RAKTHYAIX757GPYWCHOE5H5RD3QYKQW3QKLWUIUKPHQ5QGWQXWQQC
J7EE2XZAB5EZICAZGZ6DKM4JDMH73A5AJIW6INYMWJHENIGVANQAC
AH2YD57S37LRYYP54PI4PVOM63SSOPROQZD2IT7AH5ZSM62XAQCAC
LKPVSUCI2AE5OMB7R3KIHWZNBAWNAPMN7VRPQ6ZYDGMF2W54SZIAC
75XUS62YF7OK4S45RCZ5OOASXEBIEDNDBYEEMOCBDHVXV4GA3NLQC
SJN2QPWHFYKX7CJMW4XZHI2P2THH7MECZZIHQMCH6EKBZ45G3DOAC
X5UVREJYKD4FGXILS6ONEGL2LQ43FY3GATXGPXIROFHS3Y6SB4AAC
RI4S7SYT3QKWCR2OBQ3RGVHWHRBGB6PKIEVGZYITV3FF6PF3CT6QC
CQQSJLONTAKIWT4AEEDZFLFAFCSIPEGWLBJDJIS7VJK6FJ3LZ2RAC
EVYSAFB2LYZWBCFCEZSV6JVGRMYN3ALIZCBZG3IZVUDUXCLFYELAC
DEMSSSB22UI2ZN26C56UYO4NZWMDCRYKLAQARGOTSORSDXX3ZNNQC
3HZY24CX4U2TO74HOY4YX3LBJIYF4DLXHCIY7J2RASAC4COMSMZAC
J5UVLXOK6EDIL5I7VKWH4V2QDS4DPD7FHRK6XBWSXFRQS4JKXFZQC
D5QIOJGPKQJIYBUCSC3MFJ3TXLPNZ2XMI37GXMFRVRFWWR2VMTFAC
JARRBLZDQ2JZWY7IUVPTOT7WJMBPMLFLF2MGLVGOYROAAISYGLSAC
6GEU36HWK66LK3IY37HZOTJI5HOXJRUHIEYGYSVSIF57YBUEATRAC
OEPUOUNBNTHTFZVDXREGBQCKFRCWMVP2MDVK4OA47VK2DBKEWVYAC
4UUKWXDFP2CBW6MJCBIOROQZXZDJPWJWDCKYTXBFKNCGVMJ32BJQC
G5YSUSNZCQCKYKR267EZ63E3KIW42R2YZPY2CMIJPYAHPNW3KY3QC
QL55ECJ6KMMBUOWQ6LKSOVN7L43CH4S6SPE2AQ3VX3KSGC32RP4AC
4JS4DWHDRVNPIV3QCHLVJP6ZEAO5FHOK7NQ5FGO2JVZE6BZDZAIAC
sub getJobStatus {
my ($self, $c) = @_;
my $maintainer = $c->request->params->{"maintainer"};
my $latest = $c->stash->{jobStatus}->search(
defined $maintainer ? { maintainers => { like => "%$maintainer%" } } : {},
{ '+select' => ["me.statusChangeId", "me.statusChangeTime"]
, '+as' => ["statusChangeId", "statusChangeTime"]
, order_by => "coalesce(statusChangeTime, 0) desc"
});
return $latest;
}
# A convenient way to see all the errors - i.e. things demanding
# attention - at a glance.
sub errors : Chained('get_builds') PathPart Args(0) {
my ($self, $c) = @_;
$c->stash->{template} = 'errors.tt';
$c->stash->{brokenJobsets} =
[$c->stash->{allJobsets}->search({errormsg => {'!=' => ''}})]
if defined $c->stash->{allJobsets};
$c->stash->{brokenJobs} =
[$c->stash->{allJobs}->search({errormsg => {'!=' => ''}})]
if defined $c->stash->{allJobs};
$c->stash->{brokenBuilds} =
[getJobStatus($self, $c)->search({buildStatus => {'!=' => 0}})];
}
{ aggregate => { -in => $job->builds->search({}, { columns => ["id"], order_by => "id desc", rows => 15 })->as_query } },
{ join => 'aggregateconstituents_constituents',
columns => ['id', 'job', 'finished', 'buildstatus'],
+select => ['aggregateconstituents_constituents.aggregate'],
+as => ['aggregate']
});
{ aggregate => { -in => $job->builds->search({}, { columns => ["id"], order_by => "id desc", rows => 15 })->as_query } },
{ join => 'aggregateconstituents_constituents',
columns => ['id', 'job', 'finished', 'buildstatus'],
+select => ['aggregateconstituents_constituents.aggregate'],
+as => ['aggregate']
});
my $jobName = $b->get_column('job');
$aggregates->{$b->get_column('aggregate')}->{constituents}->{$jobName} =
{ id => $b->id, finished => $b->finished, buildstatus => $b->buildstatus };
$constituentJobs{$jobName} = 1;
my $jobName = $b->get_column('job');
$aggregates->{$b->get_column('aggregate')}->{constituents}->{$jobName} =
{ id => $b->id, finished => $b->finished, buildstatus => $b->buildstatus };
$constituentJobs{$jobName} = 1;
# FIXME: could be done in one query.
$aggregates->{$agg}->{build} =
$c->model('DB::Builds')->find({id => $agg}, {columns => [@buildListColumns]}) or die;
# FIXME: could be done in one query.
$aggregates->{$agg}->{build} =
$c->model('DB::Builds')->find({id => $agg}, {columns => [@buildListColumns]}) or die;
[% WRAPPER layout.tt title="Errors" %]
[% PROCESS common.tt %]
<p>This page provides a quick way to see how FUBARed your packages
are. It shows job expressions that don’t evaluate properly and jobs
that don’t build.</p>
[% haveErrors = 0 %]
[% IF brokenJobsets && brokenJobsets.size > 0; haveErrors = 1 %]
<h2>Evaluation errors in jobsets</h2>
<table class="table table-condensed table-striped">
<thead>
<tr>
<th>Name</th>
<th>Error</th>
</tr>
</thead>
<tdata>
[% FOREACH j IN brokenJobsets %]
<tr>
<td>[% INCLUDE renderFullJobsetName project=j.project.name jobset=j.name %]</td>
<td>
<pre class="error">[% HTML.escape(j.errormsg) %]</pre>
</td>
</tr>
[% END %]
</tdata>
</table>
[% END %]
[% IF brokenJobs && brokenJobs.size > 0; haveErrors = 1 %]
<h2>Evaluation errors in jobs</h2>
<table class="table table-condensed table-striped">
<thead>
<tr>
<th>Name</th>
<th>Error</th>
</tr>
</thead>
<tdata>
[% FOREACH j IN brokenJobs %]
<tr>
<td>[% INCLUDE renderFullJobName project=j.project.name jobset=j.jobset.name job=j.name %]</td>
<td>
<pre class="error">[% HTML.escape(j.errormsg) %]</pre>
</td>
</tr>
[% END %]
</tdata>
</table>
[% END %]
[% IF brokenBuilds && brokenBuilds.size > 0; haveErrors = 1 %]
<h2>Broken builds</h2>
[% INCLUDE renderBuildList builds=brokenBuilds showStatusChange=1 hideProjectName=project hideJobsetName=jobset hideJobName=job %]
[% END %]
[% IF !haveErrors %]
<p><strong>There are currently no problems.</strong></p>
[% END %]
[% END %]