9
my $reportAllErrors=0; # possibly changed below
10
my $previousValues=50;
12
my @errorDescription=(
14
"Error_reading_input_file",
15
"Error_reading_Ghostscript_produced_PDF/PS_file",
16
"Timeout_reading_input_file",
17
"Timeout_reading_Ghostscript_produced_PDF/PS_File",
19
"Ghostscript_generated_PDF/PS_file_missing",
20
"Seg_Fault_during_pdfwrite",
22
"Seg_Fault_reading_Ghostscript_produced_PDF/PS_File",
27
my $elapsedTime=shift;
28
my $machineCount=shift || die "usage: compare.pl current.tab previous.tab elapsedTime machineCount [skipMissing [products]]";
29
my $skipMissing=shift;
32
$products="gs pcl xps svg" if (!$products);
35
if (open(F,"<skip.lst")) {
45
$reportAllErrors=1 if ($current=~m/icc_work/);
72
my @differencePrevious;
73
my @differencePreviousPdfwrite;
74
my @differencePreviousPs2write;
77
my @baselineUpdateNeeded;
81
print STDERR "reading $current\n" if ($verbose);
82
open(F,"<$current") || die "file $current not found";
87
next if (exists $skip{$a[0]} && $a[1]==0); # skip only if no error
88
# $a[6]=$a[1] if ($a[1] ne "0");
89
$current{$a[0]}=$a[6];
90
$currentError{$a[0]}=0;
92
$currentError{$a[0]}='unknown';
93
$currentError{$a[0]}=$errorDescription[$a[1]] if (exists $errorDescription[$a[1]]);
96
$currentProduct{$a[0]}=$a[8];
97
$currentMachine{$a[0]}=$a[9];
98
$currentTime1{$a[0]}=$a[2];
99
$currentTime2{$a[0]}=$a[3];
102
print STDERR "reading $previous\n" if ($verbose);
103
open(F,"<$previous") || die "file $previous not found";
108
next if (exists $skip{$a[0]} && $a[1]==0); # skip only if no error
109
# $a[6]=$a[1] if ($a[1] ne "0");
110
$previous{$a[0]}=$a[6];
111
$previousError{$a[0]}=0;
113
$previousError{$a[0]}='unknown';
114
$previousError{$a[0]}=$errorDescription[$a[1]] if (exists $errorDescription[$a[1]]);
117
$previousProduct{$a[0]}=$a[8];
118
$previousMachine{$a[0]}=$a[9];
119
$previousTime1{$a[0]}=$a[2];
120
$previousTime2{$a[0]}=$a[3];
124
if ($elapsedTime==0) {
126
if (open(F,"<md5sum.cache")) {
127
print STDERR "reading md5sum.cache\n" if ($verbose);
130
if (m/(.+) \| (.+)/) {
131
$archiveCache{$1}=$2;
132
} elsif (m/^(\d+)$/) {
139
# build list of archived files
140
print STDERR "reading archive directory\n" if ($verbose);
142
if (opendir(DIR, 'archive')) { # || die "can't opendir archive: $!";
143
foreach (readdir(DIR)) {
144
$archives{$_}=1 if (!(-d $_) && (m/.tab$/));
149
my $count=$previousValues;
151
foreach my $i (sort {$b cmp $a} keys %archives) {
152
# print STDERR "$i\n";
154
print STDERR "reading archive/$i\n" if ($verbose);
155
open(F,"<archive/$i") || die "file archive/$i not found";
162
# $archive{$r}{$a[0]}=$a[6];
163
# $archiveProduct{$r}{$a[0]}=$a[8];
164
# $archiveMachine{$r}{$a[0]}=$a[9];
165
# $archiveMachine{$r}{$a[0]}="unknown" if (!$archiveMachine{$r}{$a[0]});
166
# $archiveCount{$r}=$previousValues-$count+1;
167
$a[6]=$a[1] if ($a[1] ne "0");
168
my $key=$a[0].' '.$a[6];
169
if ($count==$previousValues) {
172
if (!exists $current{$key} && !exists $archiveCache{$key}) {
173
$archiveCache{$key}=$r."\t".$a[8]."\t".$a[9]."\t".($previousValues-$count+1);
184
#print Dumper(\%archiveCache);
187
#print "previous\n".Dumper(\%previous);
188
#print "current \n".Dumper(\%current);
192
if (!($previous=~m/users/)) {
193
foreach my $t (sort keys %current) {
194
if ($currentError{$t} =~ m/Seg_Fault/) {
195
print "\n*****************************************************************************\nSeg faults with current rev:\n\n" if (!$first);
197
print "$t $currentMachine{$t} $currentError{$t}\n";
200
print "\n*****************************************************************************\n\n\n" if ($first);
204
foreach my $t (sort keys %previous) {
205
if (exists $current{$t}) {
207
if ($currentError{$t}) {
208
push @allErrors,"$t $previousProduct{$t} $previousMachine{$t} $currentMachine{$t} $currentError{$t}";
210
if ($currentError{$t} && !$previousError{$t}) {
211
if (exists $archiveCache{$t.' '.$current{$t}}) {
212
my @a=split "\t", $archiveCache{$t.' '.$current{$t}};
214
$message=$currentError{$t} if ($currentError{$t});
215
push @archiveMatch,"$t $a[1] $a[2] $currentMachine{$t} $a[0] $a[3] $message";
218
push @brokePrevious,"$t $previousProduct{$t} $previousMachine{$t} $currentMachine{$t} $currentError{$t}";
221
if (!$currentError{$t} && $previousError{$t}) {
222
if (exists $archiveCache{$t.' '.$current{$t}}) {
223
my @a=split "\t", $archiveCache{$t.' '.$current{$t}};
225
$message=$currentError{$t} if ($currentError{$t});
226
push @archiveMatch,"$t $a[1] $a[2] $currentMachine{$t} $a[0] $a[3] $message";
229
push @repairedPrevious,"$t $previousProduct{$t} $previousMachine{$t} $currentMachine{$t} $previousError{$t}";
234
if ($current{$t} eq $previous{$t}) {
235
# print "$t match $previous and $current\n";
237
# foreach my $p (sort {$b cmp $a} keys %archive) {
238
# if (!$match && exists $archive{$p}{$t} && $archive{$p}{$t} eq $current{$t}) {
240
# push @archiveMatch,"$t $archiveProduct{$p}{$t} $archiveMachine{$p}{$t} $currentMachine{$t} $p $archiveCount{$p}";
243
if (exists $archiveCache{$t.' '.$current{$t}}) {
244
my @a=split "\t", $archiveCache{$t.' '.$current{$t}};
246
$message=$currentError{$t} if ($currentError{$t});
247
# die "happened" if ($currentError{$t});
248
push @archiveMatch,"$t $a[1] $a[2] $currentMachine{$t} $a[0] $a[3] $message";
252
if ($currentProduct{$t} =~ m/pdfwrite/) {
253
push @differencePreviousPdfwrite,"$t $previousProduct{$t} $previousMachine{$t} $currentMachine{$t}";
254
} elsif ($currentProduct{$t} =~ m/ps2write/) {
255
push @differencePreviousPs2write,"$t $previousProduct{$t} $previousMachine{$t} $currentMachine{$t}";
257
push @differencePrevious,"$t $previousProduct{$t} $previousMachine{$t} $currentMachine{$t}";
261
if ($currentMachine{$t} eq $previousMachine{$t}) {
264
if ($previousTime1{$t}>0) {
265
$timeDelta1=($currentTime1{$t}-$previousTime1{$t})/$previousTime1{$t};
267
if ($previousTime2{$t}>0) {
268
$timeDelta2=($currentTime2{$t}-$previousTime2{$t})/$previousTime2{$t};
270
#printf "%10f %10f %10f %s\n",$timeDelta1,$currentTime1{$t},$previousTime1{$t},$t;
275
if (!exists $skip{$t}) {
276
push @filesRemoved,"$t $previousProduct{$t}";
281
#print Dumper(\@archiveMatch);
283
my $pdfwriteTestCount=0;
284
my $ps2writeTestCount=0;
285
my $notPdfwriteTestCount=0;
287
foreach my $t (sort keys %current) {
288
if (!exists $previous{$t} && !exists $skip{$t}) {
289
push @filesAdded,"$t $currentProduct{$t}";
290
if ($currentError{$t}) {
291
push @allErrors,"$t $currentMachine{$t} $currentError{$t}";
292
push @brokePrevious,"$t $currentMachine{$t} $currentError{$t}";
295
my $p=$currentProduct{$t};
298
if ($products =~ m/$p/) {
299
if ($currentProduct{$t} =~ m/pdfwrite/) {
300
$pdfwriteTestCount++;
301
} elsif ($currentProduct{$t} =~ m/ps2write/) {
302
$ps2writeTestCount++;
304
$notPdfwriteTestCount++;
309
if ($elapsedTime==0 || $elapsedTime==1) {
311
print "ran ".($pdfwriteTestCount+$ps2writeTestCount+$notPdfwriteTestCount)." tests in $elapsedTime seconds on $machineCount nodes\n\n";
314
if (@differencePrevious) {
315
print "Differences in ".scalar(@differencePrevious)." of $notPdfwriteTestCount non-pdfwrite/ps2write test(s):\n";
316
while(my $t=shift @differencePrevious) {
318
push @baselineUpdateNeeded,$t;
322
print "No differences in $notPdfwriteTestCount non-pdfwrite/ps2write tests\n\n";
325
if (@differencePreviousPdfwrite) {
326
print "Differences in ".scalar(@differencePreviousPdfwrite)." of $pdfwriteTestCount pdfwrite test(s):\n";
327
while(my $t=shift @differencePreviousPdfwrite) {
329
push @baselineUpdateNeeded,$t;
333
print "No differences in $pdfwriteTestCount pdfwrite tests\n\n";
336
if (@differencePreviousPs2write) {
337
print "Differences in ".scalar(@differencePreviousPs2write)." of $ps2writeTestCount ps2write test(s):\n";
338
while(my $t=shift @differencePreviousPs2write) {
340
push @baselineUpdateNeeded,$t;
344
print "No differences in $ps2writeTestCount ps2write tests\n\n";
349
if (@brokePrevious) {
350
print "The following ".scalar(@brokePrevious)." regression file(s) have started producing errors:\n";
351
while(my $t=shift @brokePrevious) {
357
if (@repairedPrevious) {
358
print "The following ".scalar(@repairedPrevious)." regression file(s) have stopped producing errors:\n";
359
while(my $t=shift @repairedPrevious) {
361
push @baselineUpdateNeeded,$t;
366
if (!$skipMissing || $skipMissing eq "false" || $skipMissing eq "0") {
369
print "The following ".scalar(@filesRemoved)." regression file(s) have been removed:\n";
370
while(my $t=shift @filesRemoved) {
377
print "The following ".scalar(@filesAdded)." regression file(s) have been added:\n";
378
while(my $t=shift @filesAdded) {
380
push @baselineUpdateNeeded,$t;
385
if ($reportAllErrors) {
387
print "The following ".scalar(@allErrors)." regression file(s) are producing errors:\n";
388
while(my $t=shift @allErrors) {
396
foreach my $t (sort keys %current) {
397
if ($t =~ m/(.+\.)1$/) {
399
if (exists $current{$t2}) {
400
if ($current{$t} ne $current{$t2} && (!exists $previous{$t} || !exists $previous{$t2} || $previous{$t} eq $previous{$t2})) {
402
print "\nThe following files are showing a new mismatch between banded and page mode:\n";
410
print "\n" if (!$first);
414
print "-------------------------------------------------------------------------------------------------------\n\n";
415
print "The following ".scalar(@archiveMatch)." regression file(s) had differences but matched at least once in the previous $previousValues runs:\n";
416
while(my $t=shift @archiveMatch) {
422
# open(F,">>baselineupdateneeded.lst");
423
# while(my $t=shift @baselineUpdateNeeded) {
424
# my @a=split ' ',$t;
425
# $a[0] =~ s/\//__/g;