[tools 4/6] testbot/web: Link job details to the related known failures.

Francois Gouget fgouget at codeweavers.com
Wed Jun 15 11:21:43 CDT 2022


When a log contains a known failure, link it to the corresponding
failure details page(s).

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48912
Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
---
 testbot/web/JobDetails.pl | 54 +++++++++++++++++++++++++++++++++++----
 1 file changed, 49 insertions(+), 5 deletions(-)

diff --git a/testbot/web/JobDetails.pl b/testbot/web/JobDetails.pl
index 7860a4c9d..efdd4d9b0 100644
--- a/testbot/web/JobDetails.pl
+++ b/testbot/web/JobDetails.pl
@@ -237,6 +237,7 @@ our @ISA = qw(ObjectModel::CGI::CollectionPage);
 use URI::Escape;
 
 use WineTestBot::Config;
+use WineTestBot::Failures;
 use WineTestBot::Jobs;
 use WineTestBot::Log; # For Elapsed()
 use WineTestBot::LogUtils;
@@ -260,6 +261,7 @@ sub _initialize($$$)
   {
     $self->SetRefreshInterval(30);
   }
+  $self->{Failures} = CreateFailures();
 }
 
 sub GetJob($)
@@ -378,6 +380,30 @@ sub GenerateMoreInfoLink($$$$;$$)
   print "<div class='TaskMoreInfoLink'>$Html</div>\n";
 }
 
+sub GetFailureLink($$;$)
+{
+  my ($self, $Id, $Str) = @_;
+
+  my $Failure = $self->{Failures}->GetItem($Id);
+  $Str ||= $Failure ? $Failure->BugId : "F$Id";
+  my $Desc = $Failure->BugDescription if ($Failure);
+  $Desc = ": ". $self->escapeHTML($Desc) if ($Desc);
+  return "<a href='FailureDetails.pl?Key=$Id' title='Failure $Id$Desc'>$Str</a>";
+}
+
+sub GetFailureLinks($$)
+{
+  my ($self, $FailureIds) = @_;
+
+  return join(" ", map { $self->GetFailureLink($_) }
+                   sort {
+                     my $FA = $self->{Failures}->GetItem($a);
+                     my $FB = $self->{Failures}->GetItem($b);
+                     return ($FA ? $FA->BugId : 0) <=> ($FB ? $FB->BugId : 0)
+                            || $a <=> $b;
+                   } @$FailureIds);
+}
+
 sub GenerateFullLog($$$$)
 {
   my ($self, $Dir, $LogName, $HideLog) = @_;
@@ -400,14 +426,18 @@ sub GenerateFullLog($$$$)
     print "<pre class='log-note'>Some WineTest results could not be used to detect new errors: $LogInfo->{BadRef}</pre>\n";
   }
 
-  my %ErrCategory;
+  my (%ErrCategory, %ErrFailures);
   foreach my $GroupName (@{$LogInfo->{ErrGroupNames}})
   {
     my $Group = $LogInfo->{ErrGroups}->{$GroupName};
     for my $ErrIndex (0..$#{$Group->{Errors}})
     {
       my $LineNo = $Group->{LineNos}->[$ErrIndex];
-      $ErrCategory{$LineNo} = $Group->{IsNew}->[$ErrIndex] ? "fullnew" : "error";
+      if ($LineNo)
+      {
+        $ErrCategory{$LineNo} = $Group->{IsNew}->[$ErrIndex] ? "fullnew" : "error";
+        $ErrFailures{$LineNo} = $Group->{Failures}->{$ErrIndex};
+      }
     }
   }
 
@@ -435,6 +465,11 @@ sub GenerateFullLog($$$$)
       {
         $Html =~ s~^(.*\S)\s*\r?$~<span class='log-$Category'>$1</span>~;
       }
+      if ($ErrFailures{$LineNo})
+      {
+        print "[", $self->GetFailureLinks($ErrFailures{$LineNo}), "] ";
+        $Html = $self->GetFailureLink($ErrFailures{$LineNo}->[0], $Html);
+      }
       print "$Html\n";
     }
     close($LogFile);
@@ -464,6 +499,11 @@ sub GenerateFullLog($$$$)
       my $Line = $Group->{Errors}->[$ErrIndex];
       my $Category = $Group->{IsNew}->[$ErrIndex] ? "new" : "error";
       my $Html = $self->escapeHTML($Line);
+      if ($Group->{Failures}->{$ErrIndex})
+      {
+        print "[", $self->GetFailureLinks($Group->{Failures}->{$ErrIndex}), "] ";
+        $Html = $self->GetFailureLink($Group->{Failures}->{$ErrIndex}->[0], $Html);
+      }
       print "<span class='log-$Category'>$Html</span>\n";
     }
   }
@@ -629,14 +669,18 @@ EOF
           my $Group = $LogInfo->{ErrGroups}->{$GroupName};
           foreach my $Line (@{$Group->{Errors}})
           {
+            my $Html = $self->escapeHTML($Line);
             if ($Group->{IsNew}->[$ErrIndex])
             {
-              print "<span class='log-new'>", $self->escapeHTML($Line), "</span>\n";
+              $Html = "<span class='log-new'>$Html</span>";
             }
-            else
+            my $FailureIds = $Group->{Failures}->{$ErrIndex};
+            if ($FailureIds)
             {
-              print $self->escapeHTML($Line), "\n";
+              print "[", $self->GetFailureLinks($FailureIds), "] ";
+              $Html = $self->GetFailureLink($FailureIds->[0], $Html);
             }
+            print "$Html\n";
             $ErrIndex++;
           }
           print "</code></pre>\n";
-- 
2.30.2




More information about the wine-devel mailing list