2022-01-10 11:40:23 -08:00
|
|
|
package Hydra::Helper::BuildDiff;
|
|
|
|
|
|
|
|
use utf8;
|
|
|
|
use strict;
|
|
|
|
use warnings;
|
|
|
|
|
|
|
|
our @ISA = qw(Exporter);
|
|
|
|
our @EXPORT = qw(
|
|
|
|
buildDiff
|
|
|
|
);
|
|
|
|
|
2022-01-10 10:35:07 -08:00
|
|
|
sub cmpBuilds {
|
|
|
|
my ($left, $right) = @_;
|
|
|
|
return $left->get_column('job') cmp $right->get_column('job')
|
|
|
|
|| $left->get_column('system') cmp $right->get_column('system')
|
|
|
|
}
|
|
|
|
|
2022-01-10 11:40:23 -08:00
|
|
|
sub buildDiff {
|
2022-01-10 10:57:28 -08:00
|
|
|
# $builds is the list of current builds
|
|
|
|
# $builds2 is the list of previous (to-be-compared-to) builds
|
2022-01-10 11:40:23 -08:00
|
|
|
my ($builds, $builds2) = @_;
|
|
|
|
|
2022-01-10 10:50:34 -08:00
|
|
|
$builds = [sort { cmpBuilds($a, $b) } @{$builds}];
|
|
|
|
$builds2 = [sort { cmpBuilds($a, $b) } @{$builds2}];
|
|
|
|
|
2022-01-10 10:02:39 -08:00
|
|
|
my $ret = {
|
2022-01-10 11:40:23 -08:00
|
|
|
stillSucceed => [],
|
|
|
|
stillFail => [],
|
|
|
|
nowSucceed => [],
|
|
|
|
nowFail => [],
|
|
|
|
new => [],
|
|
|
|
removed => [],
|
|
|
|
unfinished => [],
|
|
|
|
aborted => [],
|
|
|
|
failed => [],
|
2022-01-10 10:02:39 -08:00
|
|
|
};
|
2022-01-10 11:40:23 -08:00
|
|
|
|
|
|
|
my $n = 0;
|
|
|
|
foreach my $build (@{$builds}) {
|
|
|
|
my $aborted = $build->finished != 0 && ($build->buildstatus == 3 || $build->buildstatus == 4);
|
|
|
|
my $d;
|
|
|
|
my $found = 0;
|
2022-01-10 10:36:25 -08:00
|
|
|
while ($n < scalar(@{$builds2})) {
|
2022-01-10 11:40:23 -08:00
|
|
|
my $build2 = @{$builds2}[$n];
|
|
|
|
my $d = cmpBuilds($build, $build2);
|
|
|
|
last if $d == -1;
|
|
|
|
if ($d == 0) {
|
|
|
|
$n++;
|
|
|
|
$found = 1;
|
|
|
|
if ($aborted) {
|
|
|
|
# do nothing
|
|
|
|
} elsif ($build->finished == 0 || $build2->finished == 0) {
|
|
|
|
push @{$ret->{unfinished}}, $build;
|
|
|
|
} elsif ($build->buildstatus == 0 && $build2->buildstatus == 0) {
|
|
|
|
push @{$ret->{stillSucceed}}, $build;
|
|
|
|
} elsif ($build->buildstatus != 0 && $build2->buildstatus != 0) {
|
|
|
|
push @{$ret->{stillFail}}, $build;
|
|
|
|
} elsif ($build->buildstatus == 0 && $build2->buildstatus != 0) {
|
|
|
|
push @{$ret->{nowSucceed}}, $build;
|
|
|
|
} elsif ($build->buildstatus != 0 && $build2->buildstatus == 0) {
|
|
|
|
push @{$ret->{nowFail}}, $build;
|
|
|
|
} else { die; }
|
|
|
|
last;
|
|
|
|
}
|
2022-01-10 10:35:39 -08:00
|
|
|
my $job_system = { job => $build2->get_column('job'), system => $build2->get_column('system') };
|
|
|
|
push @{$ret->{removed}}, $job_system;
|
2022-01-10 11:40:23 -08:00
|
|
|
$n++;
|
|
|
|
}
|
|
|
|
if ($aborted) {
|
|
|
|
push @{$ret->{aborted}}, $build;
|
|
|
|
} else {
|
|
|
|
push @{$ret->{new}}, $build if !$found;
|
|
|
|
}
|
2022-01-10 11:13:47 -08:00
|
|
|
if (defined $build->buildstatus && $build->buildstatus != 0) {
|
2022-01-10 11:40:23 -08:00
|
|
|
push @{$ret->{failed}}, $build;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
1;
|