Module: tools
Branch: master
Commit: 75f60f8068e640281ff4e624ebafb11bc604767a
URL: http://source.winehq.org/git/tools.git/?a=commit;h=75f60f8068e640281ff4e624…
Author: Francois Gouget <fgouget(a)codeweavers.com>
Date: Sat Feb 18 11:09:18 2017 +0100
testbot/WineRunTask: Better check the task report.
This makes the WineRunTask analysis match the expected results on the
report test. In particular it now leverages the pid traces to detect
when a test has no test summary line for its main process.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
testbot/bin/WineRunTask.pl | 155 ++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 139 insertions(+), 16 deletions(-)
diff --git a/testbot/bin/WineRunTask.pl b/testbot/bin/WineRunTask.pl
index e109874..c21aec0 100755
--- a/testbot/bin/WineRunTask.pl
+++ b/testbot/bin/WineRunTask.pl
@@ -459,34 +459,157 @@ if ($TA->GetFile($RptFileName, $FullLogFileName))
chmod 0664, $FullLogFileName;
if (open(my $LogFile, "<", $FullLogFileName))
{
- my $LogFailures;
+ # Note that for the TestBot we don't really care about the todos and skips
+ my ($CurrentDll, $CurrentUnit, $LineFailures, $SummaryFailures) = ("", "", 0, 0);
+ my ($CurrentIsPolluted, %CurrentPids, $LogFailures);
foreach my $Line (<$LogFile>)
{
- # There may be more than one result line due to child processes
- if ($Line =~ /: \d+ tests? executed \(\d+ marked as todo, (\d+) failures?\), \d+ skipped\./)
+ # There may be more than one summary line due to child processes
+ if ($Line =~ m%([_.a-z0-9]+):([_a-z0-9]+) start (?:-|[/_.a-z0-9]+) (?:-|[.0-9a-f]+)\r?$%)
{
- $LogFailures += $1;
+ my ($Dll, $Unit) = ($1, $2);
+ if ($CurrentDll ne "")
+ {
+ LogTaskError("The done line is missing for $CurrentDll:$CurrentUnit\n");
+ $LogFailures++;
+ }
+ ($CurrentDll, $CurrentUnit) = ($Dll, $Unit);
}
- elsif ($Line =~ / done \(258\)/ or
- $Line =~ /: unhandled exception [0-9a-fA-F]{8} at /)
+ elsif ($Line =~ /^([_a-z0-9]+)\.c:\d+: Test failed: / or
+ ($CurrentUnit ne "" and
+ $Line =~ /($CurrentUnit)\.c:\d+: Test failed: /))
{
- $LogFailures++;
+ # If the failure is not for the current test unit we'll let its
+ # developer hash it out with the polluter ;-)
+ $CurrentIsPolluted = 1 if ($1 ne $CurrentUnit);
+ $LineFailures++;
+ }
+ elsif ($Line =~ /^(?:([0-9a-f]+):)?([_.a-z0-9]+): unhandled exception [0-9a-fA-F]{8} at / or
+ ($CurrentUnit ne "" and
+ $Line =~ /(?:([0-9a-f]+):)?($CurrentUnit): unhandled exception [0-9a-fA-F]{8} at /))
+ {
+ my ($Pid, $Unit) = ($1, $2);
+
+ if ($Unit eq $CurrentUnit)
+ {
+ # This also replaces a test summary line.
+ $CurrentPids{$Pid || 0} = 1;
+ $SummaryFailures++;
+ }
+ else
+ {
+ $CurrentIsPolluted = 1;
+ }
+ $LineFailures++;
+ }
+ elsif ($Line =~ /^(?:([0-9a-f]+):)?([_a-z0-9]+): \d+ tests? executed \((\d+) marked as todo, (\d+) failures?\), \d+ skipped\./ or
+ ($CurrentUnit ne "" and
+ $Line =~ /(?:([0-9a-f]+):)?($CurrentUnit): \d+ tests? executed \((\d+) marked as todo, (\d+) failures?\), \d+ skipped\./))
+ {
+ my ($Pid, $Unit, $Todo, $Failures) = ($1, $2, $3, $4);
+
+ if ($Unit eq $CurrentUnit)
+ {
+ $CurrentPids{$Pid || 0} = 1;
+ $SummaryFailures += $Failures;
+ }
+ else
+ {
+ $CurrentIsPolluted = 1;
+ if ($Todo or $Failures)
+ {
+ LogTaskError("Found a misplaced '$Unit' test summary line.\n");
+ $LogFailures++;
+ }
+ }
+ }
+ elsif ($Line =~ /^([_.a-z0-9]+):([_a-z0-9]+)(?::([0-9a-f]+))? done \((-?\d+)\)(?:\r?$| in)/)
+ {
+ my ($Dll, $Unit, $Pid, $Rc) = ($1, $2, $3, $4);
+
+ if ($Dll ne $CurrentDll or $Unit ne $CurrentUnit)
+ {
+ LogTaskError("The start line is missing for $Dll:$Unit\n");
+ $LogFailures++;
+ $CurrentIsPolluted = 1;
+ }
+
+ # Verify the summary lines
+ if (!$CurrentIsPolluted)
+ {
+ if ($LineFailures != 0 and $SummaryFailures == 0)
+ {
+ LogTaskError("$Dll:$Unit has unreported failures\n");
+ $LogFailures++;
+ }
+ elsif ($LineFailures == 0 and $SummaryFailures != 0)
+ {
+ LogTaskError("Some test failed messages are missing for $Dll:$Unit\n");
+ $LogFailures++;
+ }
+ }
+ # Note that $SummaryFailures may count some failures twice so only use
+ # it as a fallback for $LineFailures.
+ $LineFailures ||= $SummaryFailures;
+
+ if (!$CurrentIsPolluted)
+ {
+ # Verify the exit code
+ if ($LineFailures != 0 and $Rc == 0)
+ {
+ LogTaskError("$Dll:$Unit returned success despite having failures\n");
+ $LogFailures++;
+ }
+ elsif ($Rc == 258)
+ {
+ # This is a timeout
+ $LogFailures++;
+ }
+ elsif ($LineFailures == 0 and $Rc != 0)
+ {
+ LogTaskError("$Dll:$Unit returned an error ($Rc) despite having no failures\n");
+ $LogFailures++;
+ }
+ }
+
+ if ($Rc != 258 and
+ ((!$Pid and !%CurrentPids) or
+ ($Pid and !$CurrentPids{$Pid} and !$CurrentPids{0})))
+ {
+ LogTaskError("$Dll:$Unit has no test summary line (early exit of the main process?)\n");
+ $LogFailures++;
+ }
+
+ $LogFailures += $LineFailures;
+
+ $CurrentDll = $CurrentUnit = "";
+ %CurrentPids = ();
+ $CurrentIsPolluted = $LineFailures = $SummaryFailures = 0;
}
}
close($LogFile);
- if (defined $LogFailures)
+
+ if ($TimedOut)
+ {
+ # The report got truncated due to the timeout so ignore the other checks
+ }
+ elsif (!defined $LogFailures)
+ {
+ LogTaskError("Found no trace of a test summary line or of a crash\n");
+ $LogFailures = 1;
+ }
+ elsif ($CurrentDll ne "")
{
- $TestFailures += $LogFailures;
- # The log file looks good so ignore the TestAgent error
- # but still log it in case the log was in fact truncated.
- LogTaskError($TAError) if (defined $TAError);
- $TAError = undef;
+ LogTaskError("The report seems to have been truncated\n");
+ $LogFailures++;
}
- elsif (!defined $LogFailures and !defined $TestFailures)
+ elsif ($LineFailures or $SummaryFailures)
{
- LogTaskError("Found no trace of the test summary line or of a crash\n");
- $TestFailures = 1;
+ LogTaskError("Found a trailing test summary or test failed line.\n");
+ $LogFailures++;
}
+ # $LogFailures can legitimately be undefined in case of a timeout
+ $TestFailures += $LogFailures || 0;
}
else
{
Module: tools
Branch: master
Commit: 1239052d91cdfcb770964b007ea5ae8d89a61dea
URL: http://source.winehq.org/git/tools.git/?a=commit;h=1239052d91cdfcb770964b00…
Author: Francois Gouget <fgouget(a)codeweavers.com>
Date: Sat Feb 18 11:03:59 2017 +0100
testbot/reporttest: Some fixes and additions for the report template.
Some tests had copy/paste errors which were caught by an actual parser.
Added a few more tests for misplaced lines, exceptions in subprocesses,
and races in the test output.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
testbot/src/reporttest/report.template | 121 ++++++++++++++++++++++++++-------
1 file changed, 98 insertions(+), 23 deletions(-)
diff --git a/testbot/src/reporttest/report.template b/testbot/src/reporttest/report.template
index 003d41e..cb83ad7 100644
--- a/testbot/src/reporttest/report.template
+++ b/testbot/src/reporttest/report.template
@@ -296,6 +296,7 @@ service.c:20: Test failed: A failure in the subprocess
advpack:advpack start dlls/advpack/tests/advpack.c -
----- A standard successful unit test
----- Expected assessement: Success, unless the previous test interferes
+0da0:advpack: 99 tests executed (0 marked as todo, 0 failures), 0 skipped.
advpack:advpack:0da0 done (0) in 0s
advpack:files start dlls/advapi32/tests/crypt.c -
@@ -309,7 +310,7 @@ advpack:files:0880 done (3) in 0s
advpack:install start dlls/advpack/tests/install.c -
----- A unit test with a crash
----- Expected assessement: Crash
-install: unhandled exception c0000005 at 0040167C
+07b0:install: unhandled exception c0000005 at 0040167C
advpack:install:07b0 done (3221225477) in 0s
amstream:amstream start dlls/amstream/tests/amstream.c -
@@ -339,13 +340,14 @@ atl:module:0920 done (0) in 0s
atl:registrar start dlls/atl/tests/registrar.c -
----- A unit test with a foreign test summary line
----- Expected assessement: "Misplaced test summary line" error
-9876:service: 10 tests executed (0 marked as todo, 0 failures), 0 skipped.
+9876:service: 10 tests executed (0 marked as todo, 1 failures), 0 skipped.
0922:registrar: 17 tests executed (0 marked as todo, 0 failures), 0 skipped.
atl:registrar:0922 done (0) in 0s
------ Skipping all tests for a missing dll (see header)
------ Expected assessement: Skipped (FIXME: or Not Run?)
-avifil32:api skipped dlls/avifil32/tests/api.c -
+----- Skipping all tests for a missing dll (see the "Dll info:" header)
+----- Expected assessement: Not available
+avifil32 is missing and thus no test will be run for it and no entry will be
+found in the test report.
browseui:autocomplete start dlls/browseui/tests/autocomplete.c -
----- A unit test with a skipped test
@@ -408,17 +410,16 @@ This line says nothing is wrong because it's from the subprocess
comctl32:comboex:0c9c done (1) in 0s
comctl32:datetime start dlls/comctl32/tests/datetime.c -
------ A unit test with a missing test failure line
+----- A unit test reporting a failure but with no test failed line
----- Expected assessement: "Missing test failed line" error
-datetime.c:1: Test failed: Something wrong
-0998:datetime: 651 tests executed (0 marked as todo, 0 failures), 0 skipped.
-comctl32:datetime:0998 done (0) in 0s
+0998:datetime: 651 tests executed (0 marked as todo, 1 failures), 0 skipped.
+comctl32:datetime:0998 done (1) in 0s
comctl32:dpa start dlls/comctl32/tests/dpa.c -
----- A unit test with a non-zero exit code
----- Expected assessement: "Non-zero exit code" error
This would cause things like 'make test' to consider the unit test failed.
-0b14:dpa: 16 tests executed (0 marked as todo, 0 failures), 0 skipped.
+0998:dpa: 16 tests executed (0 marked as todo, 0 failures), 0 skipped.
comctl32:dpa:0998 done (1) in 0s
comctl32:header start dlls/comctl32/tests/header.c -
@@ -426,7 +427,7 @@ comctl32:header start dlls/comctl32/tests/header.c -
----- Expected assessement: "Zero exit code" error
A non-zero exit code is necessary for 'make test'.
header.c:1: Test failed: Something wrong
-0b14:header: 16 tests executed (0 marked as todo, 1 failure), 0 skipped.
+0998:header: 16 tests executed (0 marked as todo, 1 failure), 0 skipped.
comctl32:header:0998 done (0) in 0s
comctl32:imagelist start - -
@@ -449,16 +450,90 @@ stub comctl32:listview
0998:misc: 16 tests executed (0 marked as todo, 0 failure), 0 skipped.
comctl32:misc:0998 done (0) in 0s
-stub comctl32:monthcal
-stub comctl32:mru
-stub comctl32:pager
-stub comctl32:progress
-stub comctl32:propsheet
-stub comctl32:rebar
-stub comctl32:status
-stub comctl32:subclass
-stub comctl32:syslink
-stub comctl32:tab
+comctl32:monthcal start dlls/comctl32/tests/monthcal.c -
+----- A unit test with a misplaced todo subprocess test summary line
+----- Expected assessement: "Misplaced summary line" error
+See the previous misplaced test summary line scenarios.
+0148:monthcal: 2251 tests executed (0 marked as todo, 0 failures), 0 skipped.
+comctl32:monthcal:0148 done (0) in 9s
+security.c:41: Test marked todo: Hello Wine!
+0955:security: 18 tests executed (1 marked as todo, 0 failures), 0 skipped.
+
+comctl32:mru start dlls/comctl32/tests/mru.c -
+----- A standard successful unit test
+----- Expected assessement: Success, unless the previous test interferes
+0148:mru: 2251 tests executed (0 marked as todo, 0 failures), 0 skipped.
+comctl32:mru:0148 done (0) in 9s
+
+comctl32:pager start dlls/comctl32/tests/pager.c -
+----- A unit test with a misplaced subprocess skip test summary line
+----- Expected assessement: Success
+See the previous misplaced test summary line scenarios.
+0148:pager: 2251 tests executed (0 marked as todo, 0 failures), 0 skipped.
+comctl32:pager:0148 done (0) in 9s
+security.c:42: Tests skipped: Another time
+0956:security: 18 tests executed (0 marked as todo, 0 failures), 1 skipped.
+
+comctl32:progress start dlls/comctl32/tests/progress.c -
+----- A standard successful unit test
+----- Expected assessement: Success
+0148:progress: 2251 tests executed (0 marked as todo, 0 failures), 0 skipped.
+comctl32:progress:0148 done (0) in 9s
+
+comctl32:propsheet start dlls/comctl32/tests/propsheet.c -
+----- A unit test with no main process test summary line and no pid anywhere
+----- Expected assessement: "Missing test summary" error
+comctl32:propsheet done (0) in 9s
+
+comctl32:rebar start dlls/comctl32/tests/rebar.c -
+----- A unit test with an unreported crash in a subprocess
+----- Expected assessement: "Zero exit code" error
+Even in subprocesses crashes are equivalent to 'Test failed' errors and as
+such the main process cannot report success, i.e. it must have a non-zero exit
+code. Note also that since we don't require the main process to account for the
+subprocess failures in its test summary line, it's ok for it not to account for
+subprocess crashes either. This is why the error is "Zero exit code" and not
+"Unreported failure".
+1234:rebar: unhandled exception c0000005 at 0040167C
+07b0:rebar: 2251 tests executed (0 marked as todo, 0 failures), 0 skipped.
+comctl32:rebar:07b0 done (0) in 0s
+
+comctl32:status start dlls/comctl32/tests/status.c -
+----- A unit test with a subprocess crash but no pid
+----- Expected assessement: "Zero exit code" error
+See the comctl32:rebar comment.
+status: unhandled exception c0000005 at 0040167C
+status: 2251 tests executed (0 marked as todo, 0 failures), 0 skipped.
+comctl32:status:07b0 done (0) in 0s
+
+comctl32:subclass start dlls/comctl32/tests/subclass.c -
+----- A unit test with a subprocess crash, no pid and a non-zero exit code
+----- Expected assessement: 1 failure
+See the comctl32:rebar comment. Then note that here the main process does not
+claim success. Also note that the exit code does not correspond to that of a
+crashed process which makes sense since it did not crash.
+subclass: unhandled exception c0000005 at 0040167C
+subclass: 2251 tests executed (0 marked as todo, 0 failures), 0 skipped.
+comctl32:subclass:07b0 done (1) in 0s
+
+comctl32:syslink start dlls/comctl32/tests/syslink.c -
+----- A unit test with a garbled test failed line
+----- Expected assessement: 1 failure
+Multi-threaded and multi-process tests should really try to avoid races in
+the report. But analysis tools should also try to be resilient.
+Do not cut syslink.c:40: Test failed: Something wrong
+me off
+07b0:syslink: 2251 tests executed (0 marked as todo, 1 failures), 0 skipped.
+comctl32:syslink:07b0 done (1) in 0s
+
+comctl32:tab start dlls/comctl32/tests/tab.c -
+----- A unit test with a garbled test summary line
+----- Expected assessement: Success
+See previous comment.
+Do not cut 07b0:tab: 2251 tests executed (0 marked as todo, 0 failures), 0 skipped.
+me off
+comctl32:tab:07b0 done (0) in 0s
+
stub comctl32:toolbar
stub comctl32:tooltips
stub comctl32:trackbar
@@ -946,8 +1021,8 @@ stub xmllite:reader
stub xmllite:writer
xmllite:writer start fake/source/writer.c -
------ A unit test with a misplaced and failed subprocess test summary line
------ Expected assessement: "Misplaced test summary line" error
+----- A unit test with a misplaced test failed line
+----- Expected assessement: "Misplaced test failed line" error
See the similar scenario before but note the lack of the extra test summary line
here. Also beware of the end-of-file.
037c:writer: 1930 tests executed (0 marked as todo, 0 failures), 0 skipped.
Module: tools
Branch: master
Commit: f15df072c11716f97b140da393dc79d3f198591c
URL: http://source.winehq.org/git/tools.git/?a=commit;h=f15df072c11716f97b140da3…
Author: Francois Gouget <fgouget(a)codeweavers.com>
Date: Sat Feb 18 11:03:30 2017 +0100
testbot/reporttest: Standardize on 'test summary' for consistency.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
testbot/src/reporttest/report.template | 32 ++++++++++++++++----------------
1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/testbot/src/reporttest/report.template b/testbot/src/reporttest/report.template
index 2e891f2..003d41e 100644
--- a/testbot/src/reporttest/report.template
+++ b/testbot/src/reporttest/report.template
@@ -227,7 +227,7 @@ crypt_lmhash.c:20: Test failed: Second failure here
advapi32:crypt_lmhash:07c0 done (1) in 0s
advapi32:crypt_md4 start dlls/advapi32/tests/crypt_md4.c -
------ A unit test with two test result lines
+----- A unit test with two test summary lines
----- Expected assessement: Success
0123:crypt_md4: 11 tests executed (0 marked as todo, 0 failures), 0 skipped.
0ca0:crypt_md4: 11 tests executed (0 marked as todo, 0 failures), 0 skipped.
@@ -240,7 +240,7 @@ crypt_md5.c:20: Test failed: A failure here, presumably in the subprocess
0123:crypt_md5: 11 tests executed (0 marked as todo, 1 failure), 0 skipped.
The parent now counts the subprocess failure as its own. Note that it means
the 'Test failed' count may legitimately differ from the sum from the test
-result lines.
+summary lines.
Note that this also applies to the todo and skip counts.
087c:crypt_md5: 5 tests executed (0 marked as todo, 1 failure), 0 skipped.
advapi32:crypt_md5:087c done (3) in 0s
@@ -263,18 +263,18 @@ eventlog.c:20: Test failed: Something wrong
advapi32:eventlog:088c done (3) in 4s
advapi32:lsa start dlls/advapi32/tests/crypt.c -
------ A unit test with no test result line
------ Expected assessement: "Missing test result" error
+----- A unit test with no test summary line
+----- Expected assessement: "Missing test summary" error
advapi32:lsa:083c done (0) in 0s
advapi32:registry start dlls/advapi32/tests/registry.c -
------ A unit test with no main process test result line
------ Expected assessement: "Missing test result" error
+----- A unit test with no main process test summary line
+----- Expected assessement: "Missing test summary" error
1234:registry: 765 tests executed (0 marked as todo, 0 failures), 0 skipped.
advapi32:registry:0804 done (0) in 0s
advapi32:security start dlls/advapi32/tests/security.c -
------ A unit test with a misplaced but successful subprocess test result line
+----- A unit test with a misplaced but successful subprocess test summary line
----- Expected assessement: Success
The subprocess may be a server process that exits automatically once the test
is complete. That's ok as long as it's not meant to report failures.
@@ -283,8 +283,8 @@ advapi32:security:0148 done (0) in 9s
0954:security: 18 tests executed (0 marked as todo, 0 failures), 0 skipped.
advapi32:service start dlls/advapi32/tests/service.c -
------ A unit test with a misplaced and failed subprocess test result line
------ Expected assessement: "Misplaced test result line" error
+----- A unit test with a misplaced and failed subprocess test summary line
+----- Expected assessement: "Misplaced test summary line" error
Same scenario as above but the subprocess can actually report failures so the
main process must wait for it. Ideally the error should be reported against
this unit test but reporting against the next one is also acceptable.
@@ -325,20 +325,20 @@ apphelp:apphelp start dlls/apphelp/tests/apphelp.c -
apphelp:apphelp:0860 done (0)
atl:atl_ax start dlls/atl/tests/atl_ax.c -
------ Pid on the result line, but no pid on the done one
+----- Pid on the test summary line, but no pid on the done one
----- Expected assessement: Success
0938:atl_ax: 12 tests executed (0 marked as todo, 0 failures), 0 skipped.
atl:atl_ax done (0) in 0s
atl:module start dlls/atl/tests/module.c -
------ Pid on the done line, but no pid on the result line
+----- Pid on the done line, but no pid on the test summary line
----- Expected assessement: Success
module: 544 tests executed (0 marked as todo, 0 failures), 0 skipped.
atl:module:0920 done (0) in 0s
atl:registrar start dlls/atl/tests/registrar.c -
------ A unit test with a foreign test result line
------ Expected assessement: "Misplaced test result line" error
+----- A unit test with a foreign test summary line
+----- Expected assessement: "Misplaced test summary line" error
9876:service: 10 tests executed (0 marked as todo, 0 failures), 0 skipped.
0922:registrar: 17 tests executed (0 marked as todo, 0 failures), 0 skipped.
atl:registrar:0922 done (0) in 0s
@@ -946,9 +946,9 @@ stub xmllite:reader
stub xmllite:writer
xmllite:writer start fake/source/writer.c -
------ A unit test with a misplaced and failed subprocess test result line
------ Expected assessement: "Misplaced test result line" error
-See the similar scenario before but note the lack of the extra test result line
+----- A unit test with a misplaced and failed subprocess test summary line
+----- Expected assessement: "Misplaced test summary line" error
+See the similar scenario before but note the lack of the extra test summary line
here. Also beware of the end-of-file.
037c:writer: 1930 tests executed (0 marked as todo, 0 failures), 0 skipped.
xmllite:writer:037c done (0) in 11s
Module: website
Branch: master
Commit: 7bf5ec42847de99e60a5f588c42e8043d50ca56b
URL: http://source.winehq.org/git/website.git/?a=commit;h=7bf5ec42847de99e60a5f5…
Author: Alexandre Julliard <julliard(a)winehq.org>
Date: Fri Feb 17 21:37:22 2017 +0100
Wine release 2.2
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
news/en/2017021701.xml | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/news/en/2017021701.xml b/news/en/2017021701.xml
new file mode 100644
index 0000000..491ee8d
--- /dev/null
+++ b/news/en/2017021701.xml
@@ -0,0 +1,16 @@
+<news>
+<date>February 17, 2017</date>
+<title>Wine 2.2 Released</title>
+<body>
+<p> The Wine development release 2.2 is now available.</p>
+<p> <a href="{$root}/announce/2.2">What's new</a> in this release:
+<ul>
+ <li>Windows version set to Windows 7 for new prefixes.</li>
+ <li>More steps towards the Direct3D command stream.</li>
+ <li>Still more Shader Model 5 instructions.</li>
+ <li>Initial support for double-buffered theme painting.</li>
+ <li>Various bug fixes.</li>
+</ul>
+<p>The source is <a href="//dl.winehq.org/wine/source/2.x/wine-2.2.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>