[tools 6/6] testbot/UpdateFailures: Add a script to refresh the failures' bug information.
Francois Gouget
fgouget at codeweavers.com
Wed Jun 15 11:21:55 CDT 2022
This queries Bugzilla to update the failure bug status and description
fields.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48912
Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
---
This requires updating the TestBot crontab.
---
testbot/bin/UpdateFailures.pl | 192 ++++++++++++++++++++++++++++++++++
testbot/doc/INSTALL.txt | 5 +
2 files changed, 197 insertions(+)
create mode 100755 testbot/bin/UpdateFailures.pl
diff --git a/testbot/bin/UpdateFailures.pl b/testbot/bin/UpdateFailures.pl
new file mode 100755
index 000000000..7c89b7b99
--- /dev/null
+++ b/testbot/bin/UpdateFailures.pl
@@ -0,0 +1,192 @@
+#!/usr/bin/perl -Tw
+# -*- Mode: Perl; perl-indent-level: 2; indent-tabs-mode: nil -*-
+#
+# This script updates the failures bug information.
+#
+# Copyright 2022 Francois Gouget
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+
+use strict;
+
+sub BEGIN
+{
+ if ($0 !~ m=^/=)
+ {
+ # Turn $0 into an absolute path so it can safely be used in @INC
+ require Cwd;
+ $0 = Cwd::cwd() . "/$0";
+ }
+ if ($0 =~ m=^(/.*)/[^/]+/[^/]+$=)
+ {
+ $::RootDir = $1;
+ unshift @INC, "$::RootDir/lib";
+ }
+}
+my $Name0 = $0;
+$Name0 =~ s+^.*/++;
+
+my $WineBugUrl = "https://bugs.winehq.org/";
+
+use Text::CSV::Encoded;
+
+use ObjectModel::Collection;
+use WineTestBot::Failures;
+use WineTestBot::Log;
+
+
+#
+# Logging and error handling helpers
+#
+
+my $Debug;
+sub Debug(@)
+{
+ print STDERR @_ if ($Debug);
+}
+
+my $LogOnly;
+sub Error(@)
+{
+ print STDERR "$Name0:error: ", @_ if (!$LogOnly);
+ LogMsg @_;
+}
+
+
+#
+# Bugzilla interface
+#
+
+sub CollectBugInfo($)
+{
+ my ($BugIds) = @_;
+
+ my $Bugs = {};
+ my $Cmd = "wget -qO- '$WineBugUrl/buglist.cgi?bug_id=". join(",", @$BugIds)
+ ."&columnlist=bug_status,resolution,short_desc&ctype=csv'";
+ if (open(my $Fh, "-|", $Cmd))
+ {
+ <$Fh>; # skip the header line
+
+ my $Csv = Text::CSV::Encoded->new({ binary => 1 });
+ while (my $Line = <$Fh>)
+ {
+ if ($Csv->parse($Line))
+ {
+ my ($BugId, $Status, $Resolution, $Description) = $Csv->fields();
+ $Bugs->{$BugId} = {
+ Status => $Status,
+ Resolution => $Resolution,
+ Description => $Description,
+ };
+ Debug("Bug $BugId - $Status - $Resolution - $Description\n");
+ }
+ else
+ {
+ Error("could not parse line: ", $Csv->error_input, "\n");
+ }
+ }
+ close($Fh);
+ }
+ return $Bugs;
+}
+
+
+#
+# Main
+#
+
+my (@FailureIds, $Usage);
+while (@ARGV)
+{
+ my $Arg = shift @ARGV;
+ if ($Arg eq "--log-only")
+ {
+ $LogOnly = 1;
+ }
+ elsif ($Arg eq "--debug")
+ {
+ $Debug = 1;
+ }
+ elsif ($Arg =~ /^(?:-\?|-h|--help)$/)
+ {
+ $Usage = 0;
+ last;
+ }
+ elsif ($Arg =~ /^([0-9]+)$/)
+ {
+ push @FailureIds, $1;
+ }
+ else
+ {
+ Error "unexpected argument '$Arg'\n";
+ $Usage = 2;
+ last;
+ }
+}
+# Check parameters
+if (defined $Usage)
+{
+ print "Usage: $Name0 [--log-only] [--debug] [--help] [FID...]\n";
+ exit $Usage;
+}
+
+my $Failures = CreateFailures();
+ at FailureIds = @{$Failures->GetKeys()} if (!@FailureIds);
+ at FailureIds = sort { $a <=> $b } @FailureIds;
+
+# Deduplicate the bug ids
+my $BugIds;
+foreach my $FailureId (@FailureIds)
+{
+ my $Failure = $Failures->GetItem($FailureId);
+ $BugIds->{$Failure->BugId} = 1;
+}
+
+# Update the failures bug information
+my $Bugs = CollectBugInfo([keys %$BugIds]);
+foreach my $FailureId (@FailureIds)
+{
+ my $Failure = $Failures->GetItem($FailureId);
+ my $Bug = $Bugs->{$Failure->BugId};
+ if ($Bug)
+ {
+ if ($Failure->BugStatus ne "deleted")
+ {
+ my $Resolution = $Bug->{Resolution} || " ---";
+ $Resolution = $Resolution eq " ---" ? "" : " $Resolution";
+ $Failure->BugStatus("$Bug->{Status}$Resolution");
+ }
+ $Failure->BugDescription($Bug->{Description});
+ }
+ else
+ {
+ $Failure->BugStatus("Does not exist");
+ $Failure->BugDescription("The WineHQ bug ". $Failure->BugId ." does not exist!");
+ }
+ if ($Debug and $Failure->GetIsModified())
+ {
+ Debug("Failure $FailureId - ", $Failure->BugStatus, " - ", $Failure->BugDescription, "\n");
+ }
+}
+
+my ($ErrKey, $ErrProperty, $ErrMessage) = $Failures->Save();
+if ($ErrMessage)
+{
+ Error("Could not save $ErrKey because of the $ErrProperty field: $ErrMessage\n");
+ exit 1;
+}
+
+exit 0;
diff --git a/testbot/doc/INSTALL.txt b/testbot/doc/INSTALL.txt
index 46edeea52..fac4580b2 100644
--- a/testbot/doc/INSTALL.txt
+++ b/testbot/doc/INSTALL.txt
@@ -81,6 +81,11 @@ Setup for Winetest updates:
instance:
*/10 * * * * $HOME/tools/testbot/bin/CheckForWinetestUpdate.pl --log-only
+Setup for failure bug information updates:
+- Use a cron job to run UpdateFailures.pl periodically. For
+ instance:
+ 0 */4 * * * $HOME/tools/testbot/bin/UpdateFailures.pl --log-only
+
Setup for wine-devel:
- A proper WineTestBot system should integrate with Wine's patches site.
An alternative is to interface directly with wine-devel as described in
--
2.30.2
More information about the wine-devel
mailing list