Module: website
Branch: master
Commit: 425fb6ea767cc71fac5f6fe37e413f28d6f1c165
URL: https://source.winehq.org/git/website.git/?a=commit;h=425fb6ea767cc71fac5f6…
Author: Alexandre Julliard <julliard(a)winehq.org>
Date: Fri Dec 29 20:46:29 2017 +0100
Wine release 3.0-rc4
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
news/en/2017122901.xml | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/news/en/2017122901.xml b/news/en/2017122901.xml
new file mode 100644
index 0000000..680d285
--- /dev/null
+++ b/news/en/2017122901.xml
@@ -0,0 +1,12 @@
+<news>
+<date>December 29, 2017</date>
+<title>Wine 3.0-rc4 Released</title>
+<body>
+<p> The Wine development release 3.0-rc4 is now available.</p>
+<p> <a href="{$root}/announce/3.0-rc4">What's new</a> in this release:
+<ul>
+ <li>Bug fixes only, we are in code freeze.</li>
+</ul>
+<p>The source is <a href="//dl.winehq.org/wine/source/3.0/wine-3.0-rc4.tar.xz">available now</a>.
+Binary packages are in the process of being built, and will appear soon at their respective <a href="{$root}/download">download locations</a>.
+</p></body></news>
Module: tools
Branch: master
Commit: c6faad519212569ba543b6eaeaa7dc493f6f4a88
URL: https://source.winehq.org/git/tools.git/?a=commit;h=c6faad519212569ba543b6e…
Author: Francois Gouget <fgouget(a)codeweavers.com>
Date: Fri Dec 29 00:23:48 2017 +0100
testbot/web: Add a statistics page.
This can help figuring out how busy the TestBot is, whether the VMs must
be rebalanced to lighten the load on a VM host, whether reverts are
getting slow, etc.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
testbot/lib/WineTestBot/Activity.pm | 165 ++++++++++++++-
testbot/lib/WineTestBot/CGI/PageBase.pm | 1 +
testbot/web/Stats.pl | 361 ++++++++++++++++++++++++++++++++
testbot/web/WineTestBot.css | 2 +
4 files changed, 528 insertions(+), 1 deletion(-)
Diff: https://source.winehq.org/git/tools.git/?a=commitdiff;h=c6faad519212569ba54…
Module: tools
Branch: master
Commit: d52d59c56bb595cc3fa5287d4828c1b07255672d
URL: https://source.winehq.org/git/tools.git/?a=commit;h=d52d59c56bb595cc3fa5287…
Author: Francois Gouget <fgouget(a)codeweavers.com>
Date: Wed Dec 27 12:14:49 2017 +0100
testbot: Add a history record when a child process died.
The Job scheduler may notice that a VM's child process died. In such a
case add a history record so the VM's previous status record can be
anotated appropriately.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
testbot/lib/WineTestBot/Jobs.pm | 1 +
testbot/lib/WineTestBot/Tasks.pm | 1 +
2 files changed, 2 insertions(+)
diff --git a/testbot/lib/WineTestBot/Jobs.pm b/testbot/lib/WineTestBot/Jobs.pm
index a2427cc..4ed6e03 100644
--- a/testbot/lib/WineTestBot/Jobs.pm
+++ b/testbot/lib/WineTestBot/Jobs.pm
@@ -519,6 +519,7 @@ sub ScheduleOnHost($$$$)
{
if (!$VM->HasRunningChild())
{
+ $VM->RecordResult($Records, "boterror process died");
my $ErrMessage = $VM->RunMonitor();
return $ErrMessage if (defined $ErrMessage);
}
diff --git a/testbot/lib/WineTestBot/Tasks.pm b/testbot/lib/WineTestBot/Tasks.pm
index 11f087f..1f91d26 100644
--- a/testbot/lib/WineTestBot/Tasks.pm
+++ b/testbot/lib/WineTestBot/Tasks.pm
@@ -179,6 +179,7 @@ sub UpdateStatus($$)
$VM->Status('dirty');
$VM->ChildPid(undef);
$VM->Save();
+ $VM->RecordResult(undef, "boterror process died");
}
# else it looks like this is not our VM anymore
Module: tools
Branch: master
Commit: 691925f164e837b968cd4426c5c92e8bd7805ac8
URL: https://source.winehq.org/git/tools.git/?a=commit;h=691925f164e837b968cd442…
Author: Francois Gouget <fgouget(a)codeweavers.com>
Date: Tue Dec 26 01:48:26 2017 +0100
testbot/web: Show failed Tasks on the Activity page.
This helps identify transient errors, TestBot errors, or why a task is
being re-run.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
testbot/lib/WineTestBot/Activity.pm | 57 ++++++++++++++++++++++++++++++++++++-
testbot/web/Activity.pl | 41 ++++++++++++++++++++++----
testbot/web/WineTestBot.css | 4 +++
3 files changed, 95 insertions(+), 7 deletions(-)
diff --git a/testbot/lib/WineTestBot/Activity.pm b/testbot/lib/WineTestBot/Activity.pm
index 31930ed..d66109c 100644
--- a/testbot/lib/WineTestBot/Activity.pm
+++ b/testbot/lib/WineTestBot/Activity.pm
@@ -66,6 +66,18 @@ describing the TestBot activity. The structure is as follows:
...
},
},
+ resultvms => {
+ <VMName1> => {
+ vm => <VMObject>,
+ result => <VMResult>,
+ tries => <Tries>,
+ maxtries => <MaxTries>,
+ details => <ResultDetails>,
+ },
+ <VMName2> => {
+ ...
+ },
+ },
},
<GroupNo2> => {
...
@@ -134,11 +146,24 @@ sub GetActivity($)
$VMStatus->{status} = $Status;
$VMStatus->{rows} = 1;
+ $VMStatus->{result} = "";
if ($Status eq "running")
{
$VMStatus->{job} = $Jobs->GetItem($Extra[0]);
$VMStatus->{step} = $VMStatus->{job}->Steps->GetItem($Extra[1]) if ($VMStatus->{job});
$VMStatus->{task} = $VMStatus->{step}->Tasks->GetItem($Extra[2]) if ($VMStatus->{step});
+ if ($VMStatus->{task})
+ {
+ if ($VMStatus->{task}->Status =~ /^(?:badpatch|badbuild|boterror)$/)
+ {
+ $VMStatus->{result} = $VMStatus->{task}->Status;
+ }
+ elsif ($VMStatus->{task}->Status eq "completed" and
+ $VMStatus->{task}->TestFailures)
+ {
+ $VMStatus->{result} = "failed";
+ }
+ }
}
elsif (@Extra)
{
@@ -148,6 +173,24 @@ sub GetActivity($)
$VMStatus->{details} = join(" ", @Extra);
}
}
+ elsif ($Record->Type eq "vmresult")
+ {
+ my ($RecordName, $RecordHost) = split / /, $Record->Name;
+ next if (!$VMs->ItemExists($RecordName));
+
+ my $ResultVMs = ( $Group->{resultvms} ||= {} );
+ my $VMResult = ( $ResultVMs->{$RecordName} ||= {} );
+
+ $VMResult->{host} = $RecordHost;
+ my ($Result, @Extras) = split / /, $Record->Value;
+ $VMResult->{result} = $Result;
+ if (@Extras >= 2 and $Extras[0] =~ /^\d+$/ and $Extras[1] =~ /^\d+$/)
+ {
+ $VMResult->{tries} = shift @Extras;
+ $VMResult->{maxtries} = shift @Extras;
+ }
+ $VMResult->{details} = join(" ", @Extras);
+ }
}
### Fill the holes in the table, compute end times, etc.
@@ -157,7 +200,8 @@ sub GetActivity($)
{
my $Group = $Activity->{$RecordGroup->Id};
my $StatusVMs = $Group->{statusvms};
- next if (!$StatusVMs);
+ my $ResultVMs = $Group->{resultvms};
+ next if (!$StatusVMs and !$ResultVMs);
if ($LastGroup)
{
$LastGroup->{end} = $Group->{start};
@@ -175,6 +219,17 @@ sub GetActivity($)
{
my $LastVMStatus = $LastStatusVMs{$VM->Name} ? $LastStatusVMs{$VM->Name}->{$VM->Name} : undef;
+ my $VMResult = $ResultVMs->{$VM->Name};
+ if ($VMResult and $LastVMStatus and $LastVMStatus->{status} ne "engine")
+ {
+ # Transfer the result to the relevant status object
+ $LastVMStatus->{result} = $VMResult->{result};
+ $LastVMStatus->{details} = $VMResult->{details};
+ $LastVMStatus->{tries} = $VMResult->{tries};
+ $LastVMStatus->{maxtries} = $VMResult->{maxtries};
+ }
+ next if (!$StatusVMs);
+
my $VMStatus = $StatusVMs->{$VM->Name};
if ($VMStatus)
{
diff --git a/testbot/web/Activity.pl b/testbot/web/Activity.pl
index 64a752b..5a730df 100644
--- a/testbot/web/Activity.pl
+++ b/testbot/web/Activity.pl
@@ -160,11 +160,26 @@ EOF
my $VMStatus = $Group->{statusvms}->{$VM->Name};
next if ($VMStatus->{merged});
- # Add borders to separate VM hosts and indicate anomalies.
+ # Add borders to separate VM hosts and indicate various anomalies.
print "<td class='Record Record-$VMStatus->{status}";
- my $Host = $VM->GetHost();
- print " Record-left" if ($Col > 0 and $SortedVMs[$Col-1]->GetHost() ne $Host);
- print " Record-right" if ($Col+1 < @SortedVMs and $SortedVMs[$Col+1]->GetHost() ne $Host);
+ if ($VMStatus->{result} eq "timeout")
+ {
+ print " Record-timeout";
+ }
+ elsif ($VMStatus->{result} eq "boterror")
+ {
+ print " Record-boterror";
+ }
+ elsif ($VMStatus->{result} eq "error")
+ {
+ print " Record-error";
+ }
+ else
+ {
+ my $Host = $VM->GetHost();
+ print " Record-left" if ($Col > 0 and $SortedVMs[$Col-1]->GetHost() ne $Host);
+ print " Record-right" if ($Col+1 < @SortedVMs and $SortedVMs[$Col+1]->GetHost() ne $Host);
+ }
print " Record-miss" if ($VMStatus->{mispredict});
print "'";
print " rowspan='$VMStatus->{rows}'" if ($VMStatus->{rows} > 1);
@@ -215,6 +230,17 @@ EOF
$Label = "<span class='RecordHost'>(on $Host)</span><br>$Label";
}
print "$Label ", _GetHtmlDuration($VMStatus->{end} - $VMStatus->{start});
+
+ my $Result = "";
+ if ($VMStatus->{status} ne "dirty")
+ {
+ $Result = $VMStatus->{result} if ($VMStatus->{result});
+ $Result .= " $VMStatus->{tries}/$VMStatus->{maxtries}" if ($VMStatus->{tries});
+ $Result .= ": $VMStatus->{details}" if ($VMStatus->{details});
+ $Result =~ s/^: //;
+ }
+ print "<br><span class='RecordResult'>$Result</span>" if ($Result);
+
print "</td>\n";
}
print "</tr>\n";
@@ -238,8 +264,11 @@ sub GenerateFooter($)
print "<span class='Record-running'>running</span> a task (in which case it links to it),<br>\n";
print "<span class='Record-dirty'>dirty</span> while the server is powering off the VM after a task or while it assesses its state on startup.</p>\n";
- print "<p>If no time is indicated then the VM remained in that state for less than 2 seconds. The tasks column indicates the number of runnable / queued tasks before that scheduling round. A long horizontal bar indicates the TestBot server was restarted.</p>\n";
- print "<p>This <span class='Record Record-idle Record-miss'>border</span> indicates that the server threw away the VM's current state without using it.</p>\n";
+ print "<p>If no time is indicated then the VM remained in that state for less than 2 seconds. The tasks column indicates the number of runnable / queued tasks before that scheduling round. A long horizontal bar indicates the TestBot server was restarted. </p>\n";
+ print "<p>This <span class='Record Record-running Record-timeout'>border</span> indicates that the task timed out,<br>\n";
+ print "this <span class='Record Record-running Record-error'>border</span> denotes a transient (network?) error so the task will be re-run,<br>\n";
+ print "and this <span class='Record Record-running Record-boterror'>border</span> indicates a TestBot error.<br>\n";
+ print "Finally this <span class='Record Record-idle Record-miss'>border</span> indicates that the server threw away the VM's current state without using it.</p>\n";
print "<p>The VM could also be <span class='Record-offline'>offline</span> due to a temporary issue,<br>\n";
print "or until the administrator can look at it for <span class='Record-maintenance'>maintenance</span>,<br>\n";
diff --git a/testbot/web/WineTestBot.css b/testbot/web/WineTestBot.css
index 55de9a3..4afbe31 100644
--- a/testbot/web/WineTestBot.css
+++ b/testbot/web/WineTestBot.css
@@ -348,6 +348,7 @@ td.Record { text-align: center; }
.RecordHost { font-size: smaller; }
.RecordJob { font-size: smaller; }
.RecordDuration { }
+.RecordResult { font-size: smaller; font-style: italic; }
.Record-start { }
.Record-off { color: #c0c0c0; }
@@ -371,4 +372,7 @@ td.Record { text-align: center; }
/* Special borders */
.Record.Record-left { border-left: thin solid #601919; }
.Record.Record-right { border-right: thin solid #601919; }
+.Record.Record-boterror { border-left: thick solid red; border-right: thick solid red; }
+.Record.Record-error { border-left: thick solid #990000; border-right: thick solid #990000; }
+.Record.Record-timeout { border-left: thick solid blue; border-right: thick solid blue; }
.Record.Record-miss { border-top: thick dashed #ff6600; }
Module: tools
Branch: master
Commit: 7bde1f1f231e5e7d6ada0d38ea7344a54a5428cb
URL: https://source.winehq.org/git/tools.git/?a=commit;h=7bde1f1f231e5e7d6ada0d3…
Author: Francois Gouget <fgouget(a)codeweavers.com>
Date: Tue Dec 26 01:48:06 2017 +0100
testbot: Add history records for mutable task results.
When a task fails due to a transient error it is re-run and the fact
that a transient error happened cannot be recovered from the final Task
object.
Similarly the final Task object does not clearly identify timeouts.
Furthermore all one can recover from the VM status history is that a
Task was run more than once but not the reason why.
So save abnormal task termination information in the history record.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
testbot/bin/WineRunBuild.pl | 20 ++++++++++++++++----
testbot/bin/WineRunReconfig.pl | 20 ++++++++++++++++----
testbot/bin/WineRunTask.pl | 19 ++++++++++++++++---
testbot/lib/WineTestBot/VMs.pm | 29 +++++++++++++++++++++++++++++
4 files changed, 77 insertions(+), 11 deletions(-)
diff --git a/testbot/bin/WineRunBuild.pl b/testbot/bin/WineRunBuild.pl
index b91d594..e4295c8 100755
--- a/testbot/bin/WineRunBuild.pl
+++ b/testbot/bin/WineRunBuild.pl
@@ -45,6 +45,7 @@ use WineTestBot::Config;
use WineTestBot::Jobs;
use WineTestBot::VMs;
use WineTestBot::Log;
+use WineTestBot::RecordGroups;
use WineTestBot::Engine::Notify;
@@ -192,10 +193,13 @@ sub LogTaskError($)
umask($OldUMask);
}
-sub WrapUpAndExit($;$)
+sub WrapUpAndExit($;$$)
{
- my ($Status, $Retry) = @_;
+ my ($Status, $Retry, $Timeout) = @_;
my $NewVMStatus = $Status eq 'queued' ? 'offline' : 'dirty';
+ my $VMResult = $Status eq "boterror" ? "boterror" :
+ $Status eq "queued" ? "error" :
+ $Timeout ? "timeout" : "";
my $TestFailures;
my $Tries = $Task->TestFailures || 0;
@@ -219,6 +223,13 @@ sub WrapUpAndExit($;$)
LogTaskError("The previous $Tries run(s) terminated abnormally\n");
}
+ # Record result details that may be lost or overwritten by a later run
+ if ($VMResult)
+ {
+ $VMResult .= " $Tries $MaxTaskTries" if ($Retry);
+ $VM->RecordResult(undef, $VMResult);
+ }
+
# Update the Task and Job
$Task->Status($Status);
$Task->TestFailures($TestFailures);
@@ -373,7 +384,7 @@ if (!$Pid)
# log before giving up
#
-my ($NewStatus, $ErrMessage, $TAError);
+my ($NewStatus, $ErrMessage, $TAError, $TaskTimedOut);
Debug(Elapsed($Start), " Waiting for the script (", $Task->Timeout, "s timeout)\n");
if (!defined $TA->Wait($Pid, $Task->Timeout, 60))
{
@@ -382,6 +393,7 @@ if (!defined $TA->Wait($Pid, $Task->Timeout, 60))
{
$ErrMessage = "The build timed out\n";
$NewStatus = "badbuild";
+ $TaskTimedOut = 1;
}
else
{
@@ -480,4 +492,4 @@ $TA->Disconnect();
# Wrap up
#
-WrapUpAndExit($NewStatus);
+WrapUpAndExit($NewStatus, undef, $TaskTimedOut);
diff --git a/testbot/bin/WineRunReconfig.pl b/testbot/bin/WineRunReconfig.pl
index ff99fb7..4eefa17 100755
--- a/testbot/bin/WineRunReconfig.pl
+++ b/testbot/bin/WineRunReconfig.pl
@@ -45,6 +45,7 @@ use WineTestBot::Config;
use WineTestBot::Jobs;
use WineTestBot::VMs;
use WineTestBot::Log;
+use WineTestBot::RecordGroups;
use WineTestBot::Engine::Notify;
@@ -192,11 +193,14 @@ sub LogTaskError($)
umask($OldUMask);
}
-sub WrapUpAndExit($;$)
+sub WrapUpAndExit($;$$)
{
- my ($Status, $Retry) = @_;
+ my ($Status, $Retry, $Timeout) = @_;
my $NewVMStatus = $Status eq 'queued' ? 'offline' :
$Status eq 'completed' ? 'idle' : 'dirty';
+ my $VMResult = $Status eq "boterror" ? "boterror" :
+ $Status eq "queued" ? "error" :
+ $Timeout ? "timeout" : "";
my $TestFailures;
my $Tries = $Task->TestFailures || 0;
@@ -220,6 +224,13 @@ sub WrapUpAndExit($;$)
LogTaskError("The previous $Tries run(s) terminated abnormally\n");
}
+ # Record result details that may be lost or overwritten by a later run
+ if ($VMResult)
+ {
+ $VMResult .= " $Tries $MaxTaskTries" if ($Retry);
+ $VM->RecordResult(undef, $VMResult);
+ }
+
# Update the Task and Job
$Task->Status($Status);
$Task->TestFailures($TestFailures);
@@ -338,7 +349,7 @@ if (!$Pid)
# log before giving up
#
-my ($NewStatus, $ErrMessage, $TAError);
+my ($NewStatus, $ErrMessage, $TAError, $TaskTimedOut);
Debug(Elapsed($Start), " Waiting for the script (", $Task->Timeout, "s timeout)\n");
if (!defined $TA->Wait($Pid, $Task->Timeout, 60))
{
@@ -347,6 +358,7 @@ if (!defined $TA->Wait($Pid, $Task->Timeout, 60))
{
$ErrMessage = "The build timed out\n";
$NewStatus = "badbuild";
+ $TaskTimedOut = 1;
}
else
{
@@ -470,4 +482,4 @@ if ($NewStatus eq 'completed')
# Wrap up
#
-WrapUpAndExit($NewStatus);
+WrapUpAndExit($NewStatus, undef, $TaskTimedOut);
diff --git a/testbot/bin/WineRunTask.pl b/testbot/bin/WineRunTask.pl
index 3807a18..65faf72 100755
--- a/testbot/bin/WineRunTask.pl
+++ b/testbot/bin/WineRunTask.pl
@@ -44,6 +44,7 @@ use WineTestBot::Config;
use WineTestBot::Jobs;
use WineTestBot::VMs;
use WineTestBot::Log;
+use WineTestBot::RecordGroups;
use WineTestBot::Engine::Notify;
@@ -219,10 +220,13 @@ sub LogTaskError($)
umask($OldUMask);
}
-sub WrapUpAndExit($;$$)
+sub WrapUpAndExit($;$$$)
{
- my ($Status, $TestFailures, $Retry) = @_;
+ my ($Status, $TestFailures, $Retry, $Timeout) = @_;
my $NewVMStatus = $Status eq 'queued' ? 'offline' : 'dirty';
+ my $VMResult = $Status eq "boterror" ? "boterror" :
+ $Status eq "queued" ? "error" :
+ $Timeout ? "timeout" : "";
Debug(Elapsed($Start), " Taking a screenshot\n");
TakeScreenshot($VM, $FullScreenshotFileName);
@@ -248,6 +252,13 @@ sub WrapUpAndExit($;$$)
LogTaskError("The previous $Tries run(s) terminated abnormally\n");
}
+ # Record result details that may be lost or overwritten by a later run
+ if ($VMResult)
+ {
+ $VMResult .= " $Tries $MaxTaskTries" if ($Retry);
+ $VM->RecordResult(undef, $VMResult);
+ }
+
# Update the Task and Job
$Task->Status($Status);
$Task->TestFailures($TestFailures);
@@ -489,6 +500,7 @@ if (!defined $TA->Wait($Pid, $Timeout, $Keepalive))
}
}
+my $TimedOut;
Debug(Elapsed($Start), " Retrieving the report file to '$FullLogFileName'\n");
if ($TA->GetFile($RptFileName, $FullLogFileName))
{
@@ -712,6 +724,7 @@ if ($TA->GetFile($RptFileName, $FullLogFileName))
# so record the failure but don't add an error message.
$LogFailures++;
$CurrentIsBroken = 1;
+ $TimedOut = ($Step->Type ne "suite");
}
elsif ((!$Pid and !%CurrentPids) or
($Pid and !$CurrentPids{$Pid} and !$CurrentPids{0}))
@@ -767,4 +780,4 @@ FatalTAError(undef, $TAError, $PossibleCrash) if (defined $TAError);
# Wrap up
#
-WrapUpAndExit($NewStatus, $TaskFailures);
+WrapUpAndExit($NewStatus, $TaskFailures, undef, $TaskTimedOut || $TimedOut);
diff --git a/testbot/lib/WineTestBot/VMs.pm b/testbot/lib/WineTestBot/VMs.pm
index 961be52..2ba6b4b 100644
--- a/testbot/lib/WineTestBot/VMs.pm
+++ b/testbot/lib/WineTestBot/VMs.pm
@@ -566,6 +566,35 @@ sub RecordStatus($$;$)
}
}
+=pod
+=over 12
+
+=item C<RecordStatus()>
+
+Adds a Record of the specified VM process result.
+
+Also resets the last known VM status so a new one will be recorded even if
+it matches the current one, for instance if a new revert is started after the
+first one failed.
+
+=back
+=cut
+
+sub RecordResult($$$)
+{
+ my ($self, $Records, $Result) = @_;
+
+ if ($Records)
+ {
+ $Records->AddRecord("vmresult", $self->GetRecordName(), $Result);
+ }
+ else
+ {
+ SaveRecord("vmresult", $self->GetRecordName(), $Result);
+ }
+ delete $_VMStatuses{$self->Name};
+}
+
package WineTestBot::VMs;
Module: website
Branch: master
Commit: 671b354b78aebf53caf694c9c8f298da14a5b29a
URL: https://source.winehq.org/git/website.git/?a=commit;h=671b354b78aebf53caf69…
Author: Alexandre Julliard <julliard(a)winehq.org>
Date: Fri Dec 22 18:15:21 2017 +0100
Wine release 3.0-rc3
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
news/en/2017122201.xml | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/news/en/2017122201.xml b/news/en/2017122201.xml
new file mode 100644
index 0000000..bf3889d
--- /dev/null
+++ b/news/en/2017122201.xml
@@ -0,0 +1,12 @@
+<news>
+<date>December 22, 2017</date>
+<title>Wine 3.0-rc3 Released</title>
+<body>
+<p> The Wine development release 3.0-rc3 is now available.</p>
+<p> <a href="{$root}/announce/3.0-rc3">What's new</a> in this release:
+<ul>
+ <li>Bug fixes only, we are in code freeze.</li>
+</ul>
+<p>The source is <a href="//dl.winehq.org/wine/source/3.0/wine-3.0-rc3.tar.xz">available now</a>.
+Binary packages are in the process of being built, and will appear soon at their respective <a href="{$root}/download">download locations</a>.
+</p></body></news>
Module: wine
Branch: master
Commit: 5815aa05884a7e3a0cb3ca9fd7d9eea83f54fc52
URL: https://source.winehq.org/git/wine.git/?a=commit;h=5815aa05884a7e3a0cb3ca9f…
Author: Kim Malmo <berencamlost(a)msn.com>
Date: Fri Dec 22 04:27:04 2017 +0000
po: Update Norwegian translation.
Signed-off-by: Kim Malmo <berencamlost(a)msn.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
po/nb_NO.po | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/po/nb_NO.po b/po/nb_NO.po
index d00e67a..20b2b66 100644
--- a/po/nb_NO.po
+++ b/po/nb_NO.po
@@ -10591,6 +10591,16 @@ msgid ""
"link_name is the name of the new symbolic link.\n"
"target is the path that link_name points to.\n"
msgstr ""
+"Opprett en symbolsk lenke.\n"
+"\n"
+"Syntaks: MKLINK [alternativer] lenke_navn mål\n"
+"\n"
+"Alternativer:\n"
+"/d Opprett en symbolsk lenke til en katalog.\n"
+"/h Opprett en hard lenke.\n"
+"/j Opprett et katalog-knutepunkt.\n"
+"lenke_navn er navnet på den nye symbolske lenken.\n"
+"mål er stien som lenke_navn peker til.\n"
#: cmd.rc:312
msgid ""
Module: tools
Branch: master
Commit: 895029ce5088cafed5320cd5c5170b5b3897422d
URL: https://source.winehq.org/git/tools.git/?a=commit;h=895029ce5088cafed5320cd…
Author: Francois Gouget <fgouget(a)codeweavers.com>
Date: Fri Dec 22 01:46:09 2017 +0100
testbot/web: Show the TestBot's mispredictions on the Activity page.
The TestBot prepares VMs in advance so they are ready for the next Task.
Some times it mispredicts which VM will be needed next. Higlight such
cases on the Activity page so they can be identified and analyzed.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
testbot/lib/WineTestBot/Activity.pm | 10 ++++++++++
testbot/web/Activity.pl | 6 ++++--
testbot/web/WineTestBot.css | 1 +
3 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/testbot/lib/WineTestBot/Activity.pm b/testbot/lib/WineTestBot/Activity.pm
index 38cd556..31930ed 100644
--- a/testbot/lib/WineTestBot/Activity.pm
+++ b/testbot/lib/WineTestBot/Activity.pm
@@ -195,6 +195,16 @@ sub GetActivity($)
$VMStatus->{vmstatus} = $VMStatus;
weaken($VMStatus->{vmstatus}); # avoid memory cycles
}
+ if ($LastVMStatus and $LastVMStatus->{status} ne $VMStatus->{status} and
+ # Ignore acts of administrator
+ $VMStatus->{status} !~ /^(?:maintenance|engine)$/ and
+ # And flag forbidden transitions
+ (($LastVMStatus->{status} eq "reverting" and $VMStatus->{status} ne "sleeping") or
+ ($LastVMStatus->{status} eq "sleeping" and $VMStatus->{status} !~ /^(?:idle|running)$/) or
+ ($LastVMStatus->{status} eq "idle" and $VMStatus->{status} ne "running")))
+ {
+ $LastVMStatus->{mispredict} = 1;
+ }
$LastStatusVMs{$VM->Name} = $StatusVMs;
}
}
diff --git a/testbot/web/Activity.pl b/testbot/web/Activity.pl
index e57ab7d..a33f3ef 100644
--- a/testbot/web/Activity.pl
+++ b/testbot/web/Activity.pl
@@ -160,11 +160,12 @@ EOF
my $VMStatus = $Group->{statusvms}->{$VM->Name};
next if ($VMStatus->{merged});
- # Add borders to separate VM hosts
+ # Add borders to separate VM hosts and indicate anomalies.
print "<td class='Record Record-$VMStatus->{status}";
my $Host = $VM->GetHost();
print " Record-left" if ($Col > 0 and $SortedVMs[$Col-1]->GetHost() ne $Host);
print " Record-right" if ($Col+1 < @SortedVMs and $SortedVMs[$Col+1]->GetHost() ne $Host);
+ print " Record-miss" if ($VMStatus->{mispredict});
print "'";
print " rowspan='$VMStatus->{rows}'" if ($VMStatus->{rows} > 1);
print ">";
@@ -235,7 +236,8 @@ sub GenerateFooter($)
print "<span class='Record-running'>running</span> a task (in which case it links to it),<br>\n";
print "<span class='Record-dirty'>dirty</span> while the server is powering off the VM after a task or while it assesses its state on startup.</p>\n";
- print "<p>If no time is indicated then the VM remained in that state for less than 2 seconds. The tasks column indicates the number of runnable / queued tasks before that scheduling round. A long horizontal bar indicates the TestBot server was restarted. </p>\n";
+ print "<p>If no time is indicated then the VM remained in that state for less than 2 seconds. The tasks column indicates the number of runnable / queued tasks before that scheduling round. A long horizontal bar indicates the TestBot server was restarted.</p>\n";
+ print "<p>This <span class='Record Record-idle Record-miss'>border</span> indicates that the server threw away the VM's current state without using it.</p>\n";
print "<p>The VM could also be <span class='Record-offline'>offline</span> due to a temporary issue,<br>\n";
print "or until the administrator can look at it for <span class='Record-maintenance'>maintenance</span>,<br>\n";
diff --git a/testbot/web/WineTestBot.css b/testbot/web/WineTestBot.css
index f0f3c01..55de9a3 100644
--- a/testbot/web/WineTestBot.css
+++ b/testbot/web/WineTestBot.css
@@ -371,3 +371,4 @@ td.Record { text-align: center; }
/* Special borders */
.Record.Record-left { border-left: thin solid #601919; }
.Record.Record-right { border-right: thin solid #601919; }
+.Record.Record-miss { border-top: thick dashed #ff6600; }
Module: tools
Branch: master
Commit: 4bea10ac77a1a7d23118301c7c4c5e128abad252
URL: https://source.winehq.org/git/tools.git/?a=commit;h=4bea10ac77a1a7d23118301…
Author: Francois Gouget <fgouget(a)codeweavers.com>
Date: Fri Dec 22 01:45:02 2017 +0100
testbot/web: Show TestBot start/stop events on the Activity page.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
testbot/lib/WineTestBot/Activity.pm | 17 ++++++++++++++++-
testbot/web/Activity.pl | 8 +++++++-
testbot/web/WineTestBot.css | 1 +
3 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/testbot/lib/WineTestBot/Activity.pm b/testbot/lib/WineTestBot/Activity.pm
index dcc5895..38cd556 100644
--- a/testbot/lib/WineTestBot/Activity.pm
+++ b/testbot/lib/WineTestBot/Activity.pm
@@ -51,6 +51,7 @@ describing the TestBot activity. The structure is as follows:
end => <EndTimestamp>,
runnable => <RunnableTasksCount>,
queued => <QueuedTasksCount>,
+ engine => <StartOrStop>,
statusvms => {
<VMName1> => {
vm => <VMObject>,
@@ -102,6 +103,20 @@ sub GetActivity($)
{
($Group->{runnable}, $Group->{queued}) = split / /, $Record->Value;
}
+ elsif ($Record->Type eq "engine" and $Record->Name =~ /^(?:start|stop)$/)
+ {
+ $Group->{engine} = $Record->Name;
+ foreach my $VM (@{$VMs->GetItems()})
+ {
+ my $StatusVMs = ( $Group->{statusvms} ||= {} );
+ my $VMStatus = ( $StatusVMs->{$VM->Name} ||= {} );
+ $VMStatus->{vmstatus} = $VMStatus;
+ weaken($VMStatus->{vmstatus}); # avoid memory cycles
+ $VMStatus->{start} = $Group->{start};
+ $VMStatus->{status} = "engine";
+ $VMStatus->{rows} = 1;
+ }
+ }
elsif ($Record->Type eq "vmstatus")
{
# Ignore retired / deleted VMs
@@ -165,7 +180,7 @@ sub GetActivity($)
{
$LastVMStatus->{end} = $VMStatus->{start} if ($LastVMStatus);
}
- elsif ($LastVMStatus)
+ elsif ($LastVMStatus and $LastVMStatus->{status} ne "engine")
{
$VMStatus = $StatusVMs->{$VM->Name} = $LastVMStatus;
$LastStatusVMs{$VM->Name}->{$VM->Name} = {merged => 1, vmstatus => $VMStatus};
diff --git a/testbot/web/Activity.pl b/testbot/web/Activity.pl
index ca5b94c..e57ab7d 100644
--- a/testbot/web/Activity.pl
+++ b/testbot/web/Activity.pl
@@ -139,6 +139,12 @@ EOF
next if (!$Group->{statusvms});
print "<tr><td>", _GetHtmlTime($Group->{start}), "</td>";
+ if ($Group->{engine})
+ {
+ print "<td class='Record RecordEngine'>$Group->{engine}</td>\n";
+ print "<td colspan='", scalar(@SortedVMs), "'><hr></td>\n";
+ next;
+ }
if ($Group->{runnable} or $Group->{queued})
{
print "<td class='Record'>", ($Group->{runnable} || 0), " / ", ($Group->{queued} || 0), "</td>";
@@ -229,7 +235,7 @@ sub GenerateFooter($)
print "<span class='Record-running'>running</span> a task (in which case it links to it),<br>\n";
print "<span class='Record-dirty'>dirty</span> while the server is powering off the VM after a task or while it assesses its state on startup.</p>\n";
- print "<p>If no time is indicated then the VM remained in that state for less than 2 seconds. The tasks column indicates the number of runnable / queued tasks before that scheduling round.</p>\n";
+ print "<p>If no time is indicated then the VM remained in that state for less than 2 seconds. The tasks column indicates the number of runnable / queued tasks before that scheduling round. A long horizontal bar indicates the TestBot server was restarted. </p>\n";
print "<p>The VM could also be <span class='Record-offline'>offline</span> due to a temporary issue,<br>\n";
print "or until the administrator can look at it for <span class='Record-maintenance'>maintenance</span>,<br>\n";
diff --git a/testbot/web/WineTestBot.css b/testbot/web/WineTestBot.css
index e58a4d8..f0f3c01 100644
--- a/testbot/web/WineTestBot.css
+++ b/testbot/web/WineTestBot.css
@@ -344,6 +344,7 @@ a.title { color:inherit; text-decoration: none; }
th.Record { text-align: center; }
td.Record { text-align: center; }
+.RecordEngine { font-style: italic; color: #601919; }
.RecordHost { font-size: smaller; }
.RecordJob { font-size: smaller; }
.RecordDuration { }
Module: tools
Branch: master
Commit: 98779a2195f8f0a458205e747ec20fb70f55f7fe
URL: https://source.winehq.org/git/tools.git/?a=commit;h=98779a2195f8f0a458205e7…
Author: Francois Gouget <fgouget(a)codeweavers.com>
Date: Fri Dec 22 01:43:50 2017 +0100
testbot: Add a history Record when the Engine starts or stops.
A missing stop record will show that the TestBot Engine crashed (or was
stopped abruptly).
The gap between the stop and start records will also allow identifying
the downtime.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
testbot/bin/Engine.pl | 2 ++
1 file changed, 2 insertions(+)
diff --git a/testbot/bin/Engine.pl b/testbot/bin/Engine.pl
index 36a18ad..827879c 100755
--- a/testbot/bin/Engine.pl
+++ b/testbot/bin/Engine.pl
@@ -749,6 +749,7 @@ sub main()
LogMsg "Capping MaxRevertsWhileRunningVMs to MaxRevertingVMs ($MaxRevertsWhileRunningVMs)\n";
}
$MaxVMsWhenIdle = $MaxActiveVMs if (!defined $MaxVMsWhenIdle);
+ SaveRecord('engine', 'start');
Cleanup(1);
# Check for patches that arrived while the server was off.
@@ -871,6 +872,7 @@ sub main()
}
}
}
+ SaveRecord('engine', 'stop');
LogMsg "Normal WineTestBot Engine shutdown\n";
return 0;
Module: tools
Branch: master
Commit: 39e9f6a3154300b663d1e0b08c64faaa9ec0011b
URL: https://source.winehq.org/git/tools.git/?a=commit;h=39e9f6a3154300b663d1e0b…
Author: Francois Gouget <fgouget(a)codeweavers.com>
Date: Fri Dec 22 01:41:53 2017 +0100
testbot/web: Make the title class a bit more generic.
Instead of hardcoding the text color it now inherits it from the normal
non-link text. This makes it usable on white backgrounds too.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
testbot/web/WineTestBot.css | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/testbot/web/WineTestBot.css b/testbot/web/WineTestBot.css
index 8c03a91..e58a4d8 100644
--- a/testbot/web/WineTestBot.css
+++ b/testbot/web/WineTestBot.css
@@ -340,7 +340,7 @@ pre
.boterror { color: #e55600; }
.canceled { color: black; }
-a.title { color:white; text-decoration: none; }
+a.title { color:inherit; text-decoration: none; }
th.Record { text-align: center; }
td.Record { text-align: center; }
Module: wine
Branch: master
Commit: 1437317819ca6be7a5914209722c003ef056f7f7
URL: https://source.winehq.org/git/wine.git/?a=commit;h=1437317819ca6be7a5914209…
Author: Stefan Dösinger <stefan(a)codeweavers.com>
Date: Mon Dec 18 21:39:28 2017 +0100
d3d9/tests: Work around focus-follows-mouse test failures.
Removing WS_VISIBLE without updating the window state with
SWP_FRAMECHANGED is enough to trigger d3d9's hidden window codepath
(native and in Wine), but doesn't actually hide the window. This
prevents unpredictable focus changes on focus follows mouse WMs.
Signed-off-by: Stefan Dösinger <stefan(a)codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
dlls/d3d9/tests/d3d9ex.c | 6 +++++-
dlls/d3d9/tests/device.c | 6 +++++-
2 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/dlls/d3d9/tests/d3d9ex.c b/dlls/d3d9/tests/d3d9ex.c
index 0e43a19..1a3af32 100644
--- a/dlls/d3d9/tests/d3d9ex.c
+++ b/dlls/d3d9/tests/d3d9ex.c
@@ -2954,7 +2954,11 @@ static void test_wndproc(void)
hr = reset_device(device, &device_desc);
ok(SUCCEEDED(hr), "Failed to reset device, hr %#x.\n", hr);
- ShowWindow(device_window, SW_HIDE);
+ /* Remove the WS_VISIBLE flag to test hidden windows. This is enough to trigger d3d's hidden
+ * window codepath, but does not actually hide the window without a SetWindowPos(SWP_FRAMECHANGED)
+ * call. This way we avoid focus changes and random failures on focus follows mouse WMs. */
+ device_style = GetWindowLongA(device_window, GWL_STYLE);
+ SetWindowLongA(device_window, GWL_STYLE, device_style & ~WS_VISIBLE);
flush_events();
expect_messages = focus_loss_messages_hidden;
diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c
index 1a226ec..a9fd4e4 100644
--- a/dlls/d3d9/tests/device.c
+++ b/dlls/d3d9/tests/device.c
@@ -3906,7 +3906,11 @@ static void test_wndproc(void)
hr = reset_device(device, &device_desc);
ok(SUCCEEDED(hr), "Failed to reset device, hr %#x.\n", hr);
- ShowWindow(device_window, SW_HIDE);
+ /* Remove the WS_VISIBLE flag to test hidden windows. This is enough to trigger d3d's hidden
+ * window codepath, but does not actually hide the window without a SetWindowPos(SWP_FRAMECHANGED)
+ * call. This way we avoid focus changes and random failures on focus follows mouse WMs. */
+ device_style = GetWindowLongA(device_window, GWL_STYLE);
+ SetWindowLongA(device_window, GWL_STYLE, device_style & ~WS_VISIBLE);
flush_events();
expect_messages = focus_loss_messages_hidden;
Module: tools
Branch: master
Commit: 8d380ebe14c8dbedffba0dfcaaaec7c159306f01
URL: http://source.winehq.org/git/tools.git/?a=commit;h=8d380ebe14c8dbedffba0dfc…
Author: Francois Gouget <fgouget(a)codeweavers.com>
Date: Mon Dec 18 23:53:58 2017 +0100
testbot/web: Use the TestBot records to show its activity.
The main index page is nice to browse the jobs but does not allow
getting a synthetic picture of what the TestBot is doing at a given
time. Even the VM table at the bottom falls short as it only shows the
current state and does not even show what task a given VM is running.
Each row of the new Activity page shows what each VM was doing at that
time, with color coding, links to the relevant task for running VMs,
and a count of the runnable and queued tasks.
Going down the table shows past history, allowing one to see how the
TestBot got in the current state.
The VMs are also grouped by host which makes it easier to verify that
the scheduler is obeying its operational parameters like the limits on
simultaneous running tasks, reverting VMs, etc.
While the activity page shows no sensitive information for now access to
it is restricted to users with a TestBot account.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
testbot/lib/WineTestBot/Activity.pm | 199 ++++++++++++++++++++
testbot/lib/WineTestBot/CGI/PageBase.pm | 1 +
testbot/lib/WineTestBot/Config.pm | 8 +-
testbot/lib/WineTestBot/ConfigLocalTemplate.pl | 4 +
testbot/lib/WineTestBot/RecordGroups.pm | 12 +-
testbot/lib/WineTestBot/Records.pm | 24 ++-
testbot/web/Activity.pl | 249 +++++++++++++++++++++++++
testbot/web/WineTestBot.css | 39 ++++
8 files changed, 528 insertions(+), 8 deletions(-)
Diff: http://source.winehq.org/git/tools.git/?a=commitdiff;h=8d380ebe14c8dbedffba…