If a commit has been identified as causing a bug related to a test, show and highlight that commit even if it is older than the oldest build.
Signed-off-by: Francois Gouget fgouget@codeweavers.com --- winetest/build-patterns | 98 +++++++++++++++++++++++++++++++---------- winetest/report.css | 4 ++ 2 files changed, 79 insertions(+), 23 deletions(-)
diff --git a/winetest/build-patterns b/winetest/build-patterns index 3c9b8aa84..aacbb5217 100755 --- a/winetest/build-patterns +++ b/winetest/build-patterns @@ -766,14 +766,35 @@ if (open(my $fh, "-|", $cmd)) # # - desc # The bug's one-line description. +# +# - regression +# The bug's "Regression SHA1" field. If set this identifies the Git commit +# causing the bug. my %bugs;
my $old_build_date = $sortedbuilds[0]->{date}; my $mid_build_date = $sortedbuilds[int(@sortedbuilds/2)]->{date};
-sub create_bug($$$) +sub create_bug($$$$) { - my ($bugid, $mtime, $desc) = @_; + my ($bugid, $mtime, $regression, $desc) = @_; + + my $commit; + if ($regression) + { + $commit = $commits{$regression}; + if (!$commit) + { + my ($date, $summary) = get_build_info($regression); + $commits{$regression} = $commit = { + index => -@sortedbuilds, # not sorted + id => $regression, + date => $date, + build => $sortedbuilds[0], + summary => $summary, + }; + } + }
my $t = Time::Piece->strptime($mtime, "%Y-%m-%d %H:%M:%S"); return { @@ -782,10 +803,11 @@ sub create_bug($$$) class => $t < $old_build_date ? "bugold" : $t < $mid_build_date ? "buginactive" : "bugactive", desc => $desc, + regression => $commit, }; }
-$cmd = "wget -qO- '$bugweb/buglist.cgi?product=Wine&product=Wine-Testbot&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO&keywords=source%2Ctestcase&keywords_type=allwords&rep_platform=x86&rep_platform=x86-64&columnlist=changeddate%2Cshort_desc&query_format=advanced&ctype=csv'"; +$cmd = "wget -qO- '$bugweb/buglist.cgi?product=Wine&product=Wine-Testbot&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO&keywords=source%2Ctestcase&keywords_type=allwords&rep_platform=x86&rep_platform=x86-64&columnlist=changeddate%2Ccf_regression_sha1sum%2Cshort_desc&query_format=advanced&ctype=csv'"; if (open(my $fh, "-|", $cmd)) { <$fh>; # skip the header line @@ -799,15 +821,16 @@ if (open(my $fh, "-|", $cmd)) next; }
- my ($bugid, $mtime, $desc) = $csv->fields(); + my ($bugid, $mtime, $commitid, $desc) = $csv->fields(); my $teststr = $desc; while ($teststr =~ s~\b([_.a-z0-9-]+)(?:/tests/|/|:)([_a-z0-9]+)\b~ ~) { my ($module, $unit) = ($1, $2); my $test = $tests{"$module:$unit"}; next if (!$test); - $bugs{$bugid} ||= create_bug($bugid, $mtime, $desc); + $bugs{$bugid} ||= create_bug($bugid, $mtime, $commitid, $desc); push @{$test->{bugs}}, $bugs{$bugid}; + $test->{regressions}->{$commitid} = $commits{$commitid}; } } close($fh); @@ -820,6 +843,10 @@ if (open(my $fh, "-|", $cmd)) foreach my $bug (sort { $a->{mtime} <=> $b->{mtime} } @{$test->{bugs}}) { $test->{desc} .= "<a href='$bugweb/show_bug.cgi?id=$bug->{id}'>$bug->{id}</a> <span class='$bug->{class}'>$bug->{desc}</span>"; + if ($bug->{regression}) + { + $test->{desc} .= " (<a href='$gitweb/commitdiff/$bug->{regression}->{id}'>bisected</a>)"; + } $test->{desc} .= "<br>"; } $test->{desc} .= "</p>"; @@ -1069,6 +1096,7 @@ sub index2symbol($) }
my %scope_descs = ( + R => "Caused a test regression", U => "Modifies this test", t => "Modifies a test resource (maybe for another test)", m => "Modifies the module", @@ -1091,11 +1119,16 @@ sub write_commits($$) }
my $symbol = index2symbol($i++); - my ($ucount, $tcount, $tmcount) = (0, 0, 0); + my ($rcount, $sumcount, $tcount, $detcount) = (0, 0, 0, 0); foreach my $commit (sort { $a->{index} <=> $b->{index} } values %$buildcommits) { my $scope = "m"; - if ($path2commits{$test->{source}}->{$commit->{id}}) + if ($test->{regressions}->{$commit->{id}}) + { + $scope = "R"; + $rcount++; + } + elsif ($path2commits{$test->{source}}->{$commit->{id}}) { $scope = "U"; } @@ -1115,29 +1148,38 @@ sub write_commits($$) $gitweb, $commit->{id}, short_date($build->{date}), $commit->{summary}); - if ($scope eq "U") + if ($scope eq "R" or $scope eq "U") { - push @udescs, ($ucount ? "\n " : "\n$symbol."), $desc; - $ucount++; + push @udescs, ($sumcount ? "\n " : "\n$symbol."), $desc; + $sumcount++; } else { - push @tmdescs, ($tmcount ? " " : "$symbol."), $desc, "\n"; - $tmcount++; + push @tmdescs, ($detcount ? " " : "$symbol."), $desc, "\n"; + $detcount++; } } - push @udescs, " <i>[+$tmcount in details]</i>" if ($ucount and $tmcount); - - my @impacts; - push @impacts, "this test" if ($ucount); - push @impacts, "test resources" if ($tcount); - push @impacts, "the module" if ($tmcount > $tcount); - my $scope = $ucount ? "U" : $tcount ? "t" : "m"; - my $count = $ucount + $tmcount; - printf $html "<a class='commit%s' title='%s : %s commit%s to %s'>%s</a>", + push @udescs, " <i>[+$detcount in details]</i>" if ($sumcount and $detcount); + + my @desc; + push @desc, "this test" if ($sumcount > $rcount); + push @desc, "test resources" if ($tcount); + push @desc, "the module" if ($detcount > $tcount); + if (@desc) + { + my $count = $sumcount + $detcount - $rcount; + @desc = ( sprintf("%s commit%s to %s", $count, + $count > 1 ? "s" : "", join(", ", @desc)) ); + } + if ($rcount) + { + unshift @desc, sprintf("%s regression%s", $rcount, + $rcount > 1 ? "s" : ""); + } + my $scope = $rcount ? "R" : $sumcount ? "U" : $tcount ? "t" : "m"; + printf $html "<a class='commit%s' title='%s : %s'>%s</a>", $scope, short_date($build->{date}), - $count, $count > 1 ? "s" : "", - join(", ", @impacts), $symbol; + join(", ", @desc), $symbol; } print $html "</div> <i>← potentially related commits</i>\n";
@@ -1255,6 +1297,16 @@ EOF $test->{colors} = {}; $test->{commits} = {};
+ # The regression commits may only impact the results in Wine. + # Add them even if only reporting on the Windows results. + foreach my $bug (@{$test->{bugs}}) + { + my $commit = $bug->{regression}; + next if (!$commit); + my $buildname = $commit->{build}->{name}; + $test->{commits}->{$buildname}->{$commit->{id}} = $commit; + } + my $has_wine_failures; my $first = @sortedbuilds; my $last = -1; diff --git a/winetest/report.css b/winetest/report.css index 05ee035a4..80be53dbe 100644 --- a/winetest/report.css +++ b/winetest/report.css @@ -118,6 +118,10 @@ div.pattern :hover { color: black; text-decoration: underline; } background-color: #80aaff; }
+.commitR { + color: #cc0000; + font-weight: bold; +} .commitU { font-weight: bold; }