Alexandre Julliard : patches: Add a script to generate a list of regressions per author.
Alexandre Julliard
julliard at winehq.org
Mon Oct 10 10:45:03 CDT 2011
Module: tools
Branch: master
Commit: 1ba92bc76756508da0ed0ecdd7ff8f2c737e775a
URL: http://source.winehq.org/git/tools.git/?a=commit;h=1ba92bc76756508da0ed0ecdd7ff8f2c737e775a
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Oct 10 17:31:26 2011 +0200
patches: Add a script to generate a list of regressions per author.
Based on the work of Henri Verbeet.
---
patches/patches.css | 11 +++
patches/update-regressions | 172 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 183 insertions(+), 0 deletions(-)
diff --git a/patches/patches.css b/patches/patches.css
index ee1f8d9..9b2b8ca 100644
--- a/patches/patches.css
+++ b/patches/patches.css
@@ -125,6 +125,12 @@ table th {
margin: 0;
}
+div.buglist {
+ margin: 5px 20px;
+ background-color: white;
+ width: 100%;
+ border: 1px solid #601919;
+}
table.main, table.legend { width: 100%; }
table.legend ul { margin: 2px 0; }
@@ -134,6 +140,11 @@ tr.odd { background-color: #f8e8e8; }
.id, .status, .testbot { text-align: center; }
.id, .status, .author { white-space: nowrap; padding: 0 3px; }
+.sha1 { white-space: nowrap; font-family: monospace; padding: 2px 12px; }
+
+.id :link, .sha1 :link, .subject :link { color: #A50D0D; text-decoration: none; }
+.id :visited, .sha1 :visited, .subject :visited { color: #ff0000; text-decoration: none; }
+.id :hover, .sha1 :hover, .subject :hover { color: #FF6666; text-decoration: underline; }
.nil, .nil :link, .nil :visited { color: blue; font-weight: bold; }
.pending, .pending :link, .pending :visited { color: blue; }
diff --git a/patches/update-regressions b/patches/update-regressions
new file mode 100755
index 0000000..3a71509
--- /dev/null
+++ b/patches/update-regressions
@@ -0,0 +1,172 @@
+#!/usr/bin/perl -w
+#
+# Copyright 2011 Henri Verbeet
+# Copyright 2011 Alexandre Julliard
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+use Text::CSV::Encoded;
+use CGI qw(:standard);
+use open ':utf8';
+binmode STDOUT, ':utf8';
+
+$ENV{"GIT_DIR"} = "/home/winehq/opt/source/git/wine.git";
+
+my $bugzilla_base = "http://bugs.winehq.org/show_bug.cgi?id=";
+my $gitweb_base = "http://source.winehq.org/git/wine.git/commit/";
+my $dest = "/home/winehq/opt/source";
+
+my %regressions;
+my %commits;
+my @invalid;
+my @unknown;
+
+my %authors;
+my $count = 0;
+
+sub read_bugs()
+{
+ my $csv = Text::CSV::Encoded->new({ encoding_in => "utf-8",
+ encoding_out => "utf-8" });
+
+ open LIST, "-|", "wget", "-qO-", "http://bugs.winehq.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&columnlist=cf_regression_sha1sum%2Cshort_desc&keywords=regression&keywords_type=anywords&product=Wine&query_format=advanced&ctype=csv" or die "cannot query bug list";
+
+ <LIST>; # skip header line
+ while (<LIST>)
+ {
+ if ($csv->parse($_))
+ {
+ my ($bug_id, $commit_id, $desc) = $csv->fields();
+ $regressions{$bug_id} = { "commit_id" => $commit_id, "description" => $desc };
+
+ if (!$commit_id)
+ {
+ push @unknown, $bug_id;
+ next;
+ }
+
+ if (!defined $commits{$commit_id})
+ {
+ open LOG, "-|", "git", "log", "-1", "--format=\%an\%n\%s", $commit_id or die "cannot start git log";
+ my $author = <LOG>;
+ my $subject = <LOG>;
+ chomp $author;
+ chomp $subject;
+ close LOG;
+ next unless $author && $subject;
+ $commits{$commit_id} = { "author" => $author, "subject" => $subject };
+ }
+ push @{$authors{$commits{$commit_id}->{"author"}}}, $bug_id;
+ $count++;
+ }
+ else
+ {
+ my $err = $csv->error_input;
+ die "Failed to parse line: $err\n";
+ }
+ }
+ close LIST;
+}
+
+sub print_bugs($@)
+{
+ my $row = shift;
+ printf OUTPUT "<table class=\"main\">\n";
+ foreach my $id (sort {$b <=> $a} @_)
+ {
+ my $regression = $regressions{$id};
+ my $commit_id = $regression->{"commit_id"};
+
+ printf OUTPUT "<tr class=\"regression %s\">", ++$row & 1 ? "odd" : "even";
+ printf OUTPUT "<td class=\"id\"><a href=\"%s%u\">%u</a></td>", $bugzilla_base, $id, $id;
+ printf OUTPUT "<td class=\"sha1\"><a href=\"%s%s\" title=\"%s\">%s</a></td>",
+ $gitweb_base, escapeHTML($commit_id),
+ escapeHTML($commits{$commit_id}->{"subject"}), escapeHTML(substr($commit_id,0,12));
+ printf OUTPUT "<td class=\"subject\" width=\"100%%\"><a href=\"%s%u\">%s</a></td></tr>\n",
+ $bugzilla_base, $id, escapeHTML($regression->{"description"});
+ }
+ printf OUTPUT "</table>\n";
+}
+
+read_bugs();
+
+open OUTPUT, "> $dest/regressions.new" or die "cannot create $dest/regressions.new";
+
+my $js = <<END;
+function toggle_display(id)
+{
+ var e = document.getElementById(id);
+ var display = e.style.display;
+ e.style.display = display == "none" ? "" : "none";
+}
+END
+
+print OUTPUT start_html(-title=>"Regressions",
+ -encoding=>"utf-8",
+ -style=>{src=>"patches/patches.css"},
+ -script=>$js);
+
+print OUTPUT "<div id=\"logo_glass\"><a href=\"/regressions\"><img src=\"http://winehq.org/images/winehq_logo_glass_sm.png\"></a></div>\n";
+print OUTPUT "<div id=\"logo_text\"><a href=\"/regressions\"><img src=\"http://winehq.org/images/winehq_logo_text.png\" alt=\"WineHQ\" title=\"WineHQ\"></a></div>\n";
+print OUTPUT "<div id=\"tabs\"><ul>",
+ "<li><a href=\"http://www.winehq.org/\">WineHQ</a></li>",
+ "<li><a href=\"http://wiki.winehq.org/\">Wiki</a></li>",
+ "<li><a href=\"http://appdb.winehq.org/\">AppDB</a></li>",
+ "<li><a href=\"http://bugs.winehq.org/\">Bugzilla</a></li>",
+ "<li><a href=\"http://forums.winehq.org/\">Forums</a></li></ul></div>\n";
+print OUTPUT "<div id=\"logo_blurb\">Wine source repository – Regressions</div>\n";
+
+print OUTPUT "<div id=\"main_content\"><div id=\"content\"><div class=\"main\">\n";
+printf OUTPUT "<h2>%u bisected regressions</h2>\n", $count;
+
+print OUTPUT "<table class=\"main\"><tr><th class=\"count\">Count</th>",
+ "<th style=\"width: 100%;\" class=\"author\">Author</th></tr>\n";
+
+my $row = 0;
+foreach my $author (sort {@{$authors{$b}} <=> @{$authors{$a}} || $a cmp $b} keys %authors)
+{
+ printf OUTPUT "<tr class=\"regression %s\"><td class=\"id\" valign=\"top\">"
+ ."<span onclick=\"toggle_display('bugs_%u');\">%u</span></td>",
+ $row & 1 ? "odd" : "even", $row, scalar(@{$authors{$author}});
+ printf OUTPUT "<td class=\"author\"><span onclick=\"toggle_display('bugs_%u');\">%s</span>"
+ ."<div class=\"buglist\" id=\"bugs_%u\" style=\"display: none;\">\n",
+ $row, escapeHTML($author), $row;
+ print_bugs $row, @{$authors{$author}};
+ print OUTPUT "</div></td></tr>";
+ ++$row;
+}
+print OUTPUT "</table></div>\n";
+
+print OUTPUT "<div class=\"main\">\n";
+printf OUTPUT "<h2>%u regressions without commit id</h2>\n", scalar @unknown;
+print OUTPUT "<table class=\"main\"><tr><th class=\"id\">Id</th>",
+ "<th style=\"width: 100%;\" class=\"subject\">Description</th></tr>\n";
+
+$row = 0;
+foreach my $id (sort {$b <=> $a} @unknown)
+{
+ my $regression = $regressions{$id};
+ printf OUTPUT "<tr class=\"buglist %s\">", ++$row & 1 ? "odd" : "even";
+ printf OUTPUT "<td class=\"id\"><a href=\"%s%u\">%u</a></td>", $bugzilla_base, $id, $id;
+ printf OUTPUT "<td class=\"subject\"><a href=\"%s%u\">%s</a></td></tr>\n",
+ $bugzilla_base, $id, escapeHTML($regression->{"description"});
+}
+
+print OUTPUT "</table></div>\n";
+print OUTPUT end_html;
+close OUTPUT;
+
+rename "$dest/regressions.new", "$dest/regressions" or die "failed to update regressions";
More information about the wine-cvs
mailing list