sw/CppunitTest_sw_subsequent_ooxmlexport.mk | 11 +++++ sw/CppunitTest_sw_subsequent_ooxmltok.mk | 11 +++++ sw/CppunitTest_sw_subsequent_rtfexport.mk | 11 +++++ sw/CppunitTest_sw_subsequent_rtftok.mk | 11 +++++ sw/CppunitTest_sw_subsequent_ww8export.mk | 10 ++++ sw/qa/extras/ooxmltok/data/n758883.docx |binary sw/qa/extras/ooxmltok/ooxmltok.cxx | 15 +++++++ sw/qa/extras/swmodeltestbase.hxx | 59 ++++++++++++++++++++++++++++ sw/qa/extras/ww8tok/ww8tok.cxx | 34 ---------------- sw/source/core/access/accportions.cxx | 2 sw/source/core/access/accportions.hxx | 2 sw/source/core/inc/SwPortionHandler.hxx | 3 - sw/source/core/text/porfld.cxx | 5 +- sw/source/core/text/xmldump.cxx | 8 +++ 14 files changed, 144 insertions(+), 38 deletions(-)
New commits: commit 8616f227c722affcedff7632ba97644d04427c94 Author: Miklos Vajna <vmik...@suse.cz> Date: Thu Jun 21 17:03:23 2012 +0200 kill copy&paste by introducing SwModelTestBase::parseDump() Change-Id: I7cc3e05e48fc9850fbe04c6511f5e9f18a680ec7 diff --git a/sw/qa/extras/ooxmltok/ooxmltok.cxx b/sw/qa/extras/ooxmltok/ooxmltok.cxx index a34dd39..59e3aab 100644 --- a/sw/qa/extras/ooxmltok/ooxmltok.cxx +++ b/sw/qa/extras/ooxmltok/ooxmltok.cxx @@ -45,14 +45,6 @@ #include <vcl/svapp.hxx> -#include <unotxdoc.hxx> -#include <docsh.hxx> -#include <doc.hxx> -#include <rootfrm.hxx> - -#include <libxml/xmlwriter.h> -#include <libxml/xpath.h> - using rtl::OString; using rtl::OUString; using rtl::OUStringBuffer; @@ -568,34 +560,10 @@ void Test::testN758883() * to the numbering. This is easier to test using a layout dump. */ - // create xml writer - xmlBufferPtr pXmlBuffer = xmlBufferCreate(); - xmlTextWriterPtr pXmlWriter = xmlNewTextWriterMemory(pXmlBuffer, 0); - xmlTextWriterStartDocument(pXmlWriter, NULL, NULL, NULL); - - // create dump load("n758883.docx"); - SwXTextDocument* pTxtDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get()); - SwDoc* pDoc = pTxtDoc->GetDocShell()->GetDoc(); - SwRootFrm* pLayout = pDoc->GetCurrentLayout(); - pLayout->dumpAsXml(pXmlWriter); - - // delete xml writer - xmlTextWriterEndDocument(pXmlWriter); - xmlFreeTextWriter(pXmlWriter); - - // parse the dump - xmlDocPtr pXmlDoc = xmlParseMemory((const char*)xmlBufferContent(pXmlBuffer), xmlBufferLength(pXmlBuffer));; - xmlXPathContextPtr pXmlXpathCtx = xmlXPathNewContext(pXmlDoc); - xmlXPathObjectPtr pXmlXpathObj = xmlXPathEvalExpression(BAD_CAST("/root/page/body/txt/Special"), pXmlXpathCtx); - xmlNodeSetPtr pXmlNodes = pXmlXpathObj->nodesetval; - xmlNodePtr pXmlNode = pXmlNodes->nodeTab[0]; - OUString aHeight = OUString::createFromAscii((const char*)xmlGetProp(pXmlNode, BAD_CAST("nHeight"))); - CPPUNIT_ASSERT_EQUAL(sal_Int32(220), aHeight.toInt32()); // It was 280 - // delete dump - xmlFreeDoc(pXmlDoc); - xmlBufferFree(pXmlBuffer); + OUString aHeight = parseDump("/root/page/body/txt/Special", "nHeight"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(220), aHeight.toInt32()); // It was 280 } CPPUNIT_TEST_SUITE_REGISTRATION(Test); diff --git a/sw/qa/extras/swmodeltestbase.hxx b/sw/qa/extras/swmodeltestbase.hxx index 0ddd226..669e559 100644 --- a/sw/qa/extras/swmodeltestbase.hxx +++ b/sw/qa/extras/swmodeltestbase.hxx @@ -32,12 +32,31 @@ #include <unotest/macros_test.hxx> #include <rtl/ustrbuf.hxx> +#include <unotxdoc.hxx> +#include <docsh.hxx> +#include <doc.hxx> +#include <rootfrm.hxx> + +#include <libxml/xmlwriter.h> +#include <libxml/xpath.h> + using namespace com::sun::star; /// Base class for filter tests loading or roundtriping a document, then asserting the document model. class SwModelTestBase : public test::BootstrapFixture, public unotest::MacrosTest { public: + SwModelTestBase() + : mpXmlBuffer(0) + { + } + + ~SwModelTestBase() + { + if (mpXmlBuffer) + xmlBufferFree(mpXmlBuffer); + } + virtual void setUp() { test::BootstrapFixture::setUp(); @@ -54,6 +73,26 @@ public: test::BootstrapFixture::tearDown(); } +private: + void dumpLayout() + { + // create the xml writer + mpXmlBuffer = xmlBufferCreate(); + xmlTextWriterPtr pXmlWriter = xmlNewTextWriterMemory(mpXmlBuffer, 0); + xmlTextWriterStartDocument(pXmlWriter, NULL, NULL, NULL); + + // create the dump + SwXTextDocument* pTxtDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get()); + SwDoc* pDoc = pTxtDoc->GetDocShell()->GetDoc(); + SwRootFrm* pLayout = pDoc->GetCurrentLayout(); + pLayout->dumpAsXml(pXmlWriter); + + // delete xml writer + xmlTextWriterEndDocument(pXmlWriter); + xmlFreeTextWriter(pXmlWriter); + } + + protected: /// Get the length of the whole document. int getLength() @@ -84,7 +123,27 @@ protected: return xStyleFamily; } + /// Extract a value from the layout dump using an XPath expression and an attribute name. + rtl::OUString parseDump(rtl::OString aXPath, rtl::OString aAttribute) + { + if (!mpXmlBuffer) + dumpLayout(); + + xmlDocPtr pXmlDoc = xmlParseMemory((const char*)xmlBufferContent(mpXmlBuffer), xmlBufferLength(mpXmlBuffer));; + + xmlXPathContextPtr pXmlXpathCtx = xmlXPathNewContext(pXmlDoc); + xmlXPathObjectPtr pXmlXpathObj = xmlXPathEvalExpression(BAD_CAST(aXPath.getStr()), pXmlXpathCtx); + xmlNodeSetPtr pXmlNodes = pXmlXpathObj->nodesetval; + xmlNodePtr pXmlNode = pXmlNodes->nodeTab[0]; + rtl::OUString aRet = rtl::OUString::createFromAscii((const char*)xmlGetProp(pXmlNode, BAD_CAST(aAttribute.getStr()))); + + xmlFreeDoc(pXmlDoc); + + return aRet; + } + uno::Reference<lang::XComponent> mxComponent; + xmlBufferPtr mpXmlBuffer; }; /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/ww8tok/ww8tok.cxx b/sw/qa/extras/ww8tok/ww8tok.cxx index a63ff14..53f9030 100644 --- a/sw/qa/extras/ww8tok/ww8tok.cxx +++ b/sw/qa/extras/ww8tok/ww8tok.cxx @@ -36,14 +36,6 @@ #include <vcl/svapp.hxx> -#include <unotxdoc.hxx> -#include <docsh.hxx> -#include <doc.hxx> -#include <rootfrm.hxx> - -#include <libxml/xmlwriter.h> -#include <libxml/xpath.h> - using rtl::OString; using rtl::OUString; using rtl::OUStringBuffer; @@ -225,34 +217,10 @@ void Test::testN757905() // paragraph height. When in Word-compat mode, we should take the max of // the two, not just the height of the fly. - // create xml writer - xmlBufferPtr pXmlBuffer = xmlBufferCreate(); - xmlTextWriterPtr pXmlWriter = xmlNewTextWriterMemory(pXmlBuffer, 0); - xmlTextWriterStartDocument(pXmlWriter, NULL, NULL, NULL); - - // create dump load("n757905.doc"); - SwXTextDocument* pTxtDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get()); - SwDoc* pDoc = pTxtDoc->GetDocShell()->GetDoc(); - SwRootFrm* pLayout = pDoc->GetCurrentLayout(); - pLayout->dumpAsXml(pXmlWriter); - // delete xml writer - xmlTextWriterEndDocument(pXmlWriter); - xmlFreeTextWriter(pXmlWriter); - - // parse the dump - xmlDocPtr pXmlDoc = xmlParseMemory((const char*)xmlBufferContent(pXmlBuffer), xmlBufferLength(pXmlBuffer));; - xmlXPathContextPtr pXmlXpathCtx = xmlXPathNewContext(pXmlDoc); - xmlXPathObjectPtr pXmlXpathObj = xmlXPathEvalExpression(BAD_CAST("/root/page/body/txt/infos/bounds"), pXmlXpathCtx); - xmlNodeSetPtr pXmlNodes = pXmlXpathObj->nodesetval; - xmlNodePtr pXmlNode = pXmlNodes->nodeTab[0]; - OUString aHeight = OUString::createFromAscii((const char*)xmlGetProp(pXmlNode, BAD_CAST("height"))); + OUString aHeight = parseDump("/root/page/body/txt/infos/bounds", "height"); CPPUNIT_ASSERT(sal_Int32(31) < aHeight.toInt32()); - - // delete dump - xmlFreeDoc(pXmlDoc); - xmlBufferFree(pXmlBuffer); } CPPUNIT_TEST_SUITE_REGISTRATION(Test); commit 4cc2c691a93ec1ada687ad49ba2dd9665d52a3a3 Author: Miklos Vajna <vmik...@suse.cz> Date: Thu Jun 21 17:10:17 2012 +0200 sw/qa/extras: link to libxml2 in all tests Change-Id: I6355b17042a42d44c7086f54b3efc6ba4d0c5d55 diff --git a/sw/CppunitTest_sw_subsequent_ooxmlexport.mk b/sw/CppunitTest_sw_subsequent_ooxmlexport.mk index be81973..531e0b5 100644 --- a/sw/CppunitTest_sw_subsequent_ooxmlexport.mk +++ b/sw/CppunitTest_sw_subsequent_ooxmlexport.mk @@ -37,6 +37,7 @@ $(eval $(call gb_CppunitTest_add_exception_objects,sw_subsequent_ooxmlexport, \ $(eval $(call gb_CppunitTest_use_libraries,sw_subsequent_ooxmlexport, \ cppu \ sal \ + sw \ test \ tl \ unotest \ @@ -45,6 +46,16 @@ $(eval $(call gb_CppunitTest_use_libraries,sw_subsequent_ooxmlexport, \ $(gb_STDLIBS) \ )) +$(eval $(call gb_CppunitTest_use_externals,sw_subsequent_ooxmlexport,\ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_set_include,sw_subsequent_ooxmlexport,\ + -I$(SRCDIR)/sw/inc \ + -I$(SRCDIR)/sw/source/core/inc \ + $$(INCLUDE) \ +)) + $(eval $(call gb_CppunitTest_use_api,sw_subsequent_ooxmlexport,\ offapi \ udkapi \ diff --git a/sw/CppunitTest_sw_subsequent_rtfexport.mk b/sw/CppunitTest_sw_subsequent_rtfexport.mk index 3943f7e..e55af88 100644 --- a/sw/CppunitTest_sw_subsequent_rtfexport.mk +++ b/sw/CppunitTest_sw_subsequent_rtfexport.mk @@ -37,6 +37,7 @@ $(eval $(call gb_CppunitTest_add_exception_objects,sw_subsequent_rtfexport, \ $(eval $(call gb_CppunitTest_use_libraries,sw_subsequent_rtfexport, \ cppu \ sal \ + sw \ test \ unotest \ utl \ @@ -44,6 +45,16 @@ $(eval $(call gb_CppunitTest_use_libraries,sw_subsequent_rtfexport, \ $(gb_STDLIBS) \ )) +$(eval $(call gb_CppunitTest_use_externals,sw_subsequent_rtfexport,\ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_set_include,sw_subsequent_rtfexport,\ + -I$(SRCDIR)/sw/inc \ + -I$(SRCDIR)/sw/source/core/inc \ + $$(INCLUDE) \ +)) + $(eval $(call gb_CppunitTest_use_api,sw_subsequent_rtfexport,\ offapi \ udkapi \ diff --git a/sw/CppunitTest_sw_subsequent_rtftok.mk b/sw/CppunitTest_sw_subsequent_rtftok.mk index 1c9da96..2207756 100644 --- a/sw/CppunitTest_sw_subsequent_rtftok.mk +++ b/sw/CppunitTest_sw_subsequent_rtftok.mk @@ -37,6 +37,7 @@ $(eval $(call gb_CppunitTest_add_exception_objects,sw_subsequent_rtftok, \ $(eval $(call gb_CppunitTest_use_libraries,sw_subsequent_rtftok, \ cppu \ sal \ + sw \ test \ unotest \ vcl \ @@ -44,6 +45,16 @@ $(eval $(call gb_CppunitTest_use_libraries,sw_subsequent_rtftok, \ $(gb_STDLIBS) \ )) +$(eval $(call gb_CppunitTest_use_externals,sw_subsequent_rtftok,\ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_set_include,sw_subsequent_rtftok,\ + -I$(SRCDIR)/sw/inc \ + -I$(SRCDIR)/sw/source/core/inc \ + $$(INCLUDE) \ +)) + $(eval $(call gb_CppunitTest_use_api,sw_subsequent_rtftok,\ offapi \ udkapi \ diff --git a/sw/CppunitTest_sw_subsequent_ww8export.mk b/sw/CppunitTest_sw_subsequent_ww8export.mk index 57a1faf..d46fdfb 100644 --- a/sw/CppunitTest_sw_subsequent_ww8export.mk +++ b/sw/CppunitTest_sw_subsequent_ww8export.mk @@ -56,6 +56,16 @@ $(eval $(call gb_CppunitTest_set_include,sw_subsequent_ww8export,\ $$(INCLUDE) \ )) +$(eval $(call gb_CppunitTest_use_externals,sw_subsequent_ww8export,\ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_set_include,sw_subsequent_ww8export,\ + -I$(SRCDIR)/sw/inc \ + -I$(SRCDIR)/sw/source/core/inc \ + $$(INCLUDE) \ +)) + $(eval $(call gb_CppunitTest_use_api,sw_subsequent_ww8export,\ offapi \ udkapi \ commit 6713b8d3ecd14293ecc6ba1f37a7a77f8a1cdea0 Author: Miklos Vajna <vmik...@suse.cz> Date: Thu Jun 21 16:43:10 2012 +0200 n#758883 testcase Change-Id: Ibcaf427849ef69f379e0d6e77f586d77e4d0c92f diff --git a/sw/CppunitTest_sw_subsequent_ooxmltok.mk b/sw/CppunitTest_sw_subsequent_ooxmltok.mk index 92a4cc4..4348603 100644 --- a/sw/CppunitTest_sw_subsequent_ooxmltok.mk +++ b/sw/CppunitTest_sw_subsequent_ooxmltok.mk @@ -39,10 +39,21 @@ $(eval $(call gb_CppunitTest_use_libraries,sw_subsequent_ooxmltok, \ sal \ test \ unotest \ + sw \ vcl \ $(gb_STDLIBS) \ )) +$(eval $(call gb_CppunitTest_use_externals,sw_subsequent_ooxmltok,\ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_set_include,sw_subsequent_ooxmltok,\ + -I$(SRCDIR)/sw/inc \ + -I$(SRCDIR)/sw/source/core/inc \ + $$(INCLUDE) \ +)) + $(eval $(call gb_CppunitTest_use_api,sw_subsequent_ooxmltok,\ offapi \ udkapi \ diff --git a/sw/qa/extras/ooxmltok/data/n758883.docx b/sw/qa/extras/ooxmltok/data/n758883.docx new file mode 100644 index 0000000..fed398f Binary files /dev/null and b/sw/qa/extras/ooxmltok/data/n758883.docx differ diff --git a/sw/qa/extras/ooxmltok/ooxmltok.cxx b/sw/qa/extras/ooxmltok/ooxmltok.cxx index 792b1db..a34dd39 100644 --- a/sw/qa/extras/ooxmltok/ooxmltok.cxx +++ b/sw/qa/extras/ooxmltok/ooxmltok.cxx @@ -45,6 +45,14 @@ #include <vcl/svapp.hxx> +#include <unotxdoc.hxx> +#include <docsh.hxx> +#include <doc.hxx> +#include <rootfrm.hxx> + +#include <libxml/xmlwriter.h> +#include <libxml/xpath.h> + using rtl::OString; using rtl::OUString; using rtl::OUStringBuffer; @@ -69,6 +77,7 @@ public: void testSmartart(); void testN764745(); void testN766477(); + void testN758883(); CPPUNIT_TEST_SUITE(Test); #if !defined(MACOSX) && !defined(WNT) @@ -89,6 +98,7 @@ public: CPPUNIT_TEST(testSmartart); CPPUNIT_TEST(testN764745); CPPUNIT_TEST(testN766477); + CPPUNIT_TEST(testN758883); #endif CPPUNIT_TEST_SUITE_END(); @@ -551,6 +561,43 @@ void Test::testN766477() CPPUNIT_ASSERT_EQUAL(OUString("Checkbox_Checked"), aElementNames[0]); } +void Test::testN758883() +{ + /* + * The problem was that direct formatting of the paragraph was not applied + * to the numbering. This is easier to test using a layout dump. + */ + + // create xml writer + xmlBufferPtr pXmlBuffer = xmlBufferCreate(); + xmlTextWriterPtr pXmlWriter = xmlNewTextWriterMemory(pXmlBuffer, 0); + xmlTextWriterStartDocument(pXmlWriter, NULL, NULL, NULL); + + // create dump + load("n758883.docx"); + SwXTextDocument* pTxtDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get()); + SwDoc* pDoc = pTxtDoc->GetDocShell()->GetDoc(); + SwRootFrm* pLayout = pDoc->GetCurrentLayout(); + pLayout->dumpAsXml(pXmlWriter); + + // delete xml writer + xmlTextWriterEndDocument(pXmlWriter); + xmlFreeTextWriter(pXmlWriter); + + // parse the dump + xmlDocPtr pXmlDoc = xmlParseMemory((const char*)xmlBufferContent(pXmlBuffer), xmlBufferLength(pXmlBuffer));; + xmlXPathContextPtr pXmlXpathCtx = xmlXPathNewContext(pXmlDoc); + xmlXPathObjectPtr pXmlXpathObj = xmlXPathEvalExpression(BAD_CAST("/root/page/body/txt/Special"), pXmlXpathCtx); + xmlNodeSetPtr pXmlNodes = pXmlXpathObj->nodesetval; + xmlNodePtr pXmlNode = pXmlNodes->nodeTab[0]; + OUString aHeight = OUString::createFromAscii((const char*)xmlGetProp(pXmlNode, BAD_CAST("nHeight"))); + CPPUNIT_ASSERT_EQUAL(sal_Int32(220), aHeight.toInt32()); // It was 280 + + // delete dump + xmlFreeDoc(pXmlDoc); + xmlBufferFree(pXmlBuffer); +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_PLUGIN_IMPLEMENT(); commit a208d96584009de2b902534e62f03de8124160a9 Author: Miklos Vajna <vmik...@suse.cz> Date: Thu Jun 21 16:25:15 2012 +0200 sw: include the height of SwNumberPortions in layout dump Change-Id: I7c7d78c212683e47f726fc91d59c9c495b78641e diff --git a/sw/source/core/access/accportions.cxx b/sw/source/core/access/accportions.cxx index 17ed51e..03ee5a1 100644 --- a/sw/source/core/access/accportions.cxx +++ b/sw/source/core/access/accportions.cxx @@ -142,7 +142,7 @@ void SwAccessiblePortionData::Text(sal_uInt16 nLength, sal_uInt16 nType) } void SwAccessiblePortionData::Special( - sal_uInt16 nLength, const String& rText, sal_uInt16 nType) + sal_uInt16 nLength, const String& rText, sal_uInt16 nType, sal_Int32 /*nHeight*/) { OSL_ENSURE( nModelPosition >= 0, "illegal position" ); OSL_ENSURE( (nModelPosition + nLength) <= pTxtNode->GetTxt().Len(), diff --git a/sw/source/core/access/accportions.hxx b/sw/source/core/access/accportions.hxx index 9389b1a..4b7f19a 100644 --- a/sw/source/core/access/accportions.hxx +++ b/sw/source/core/access/accportions.hxx @@ -95,7 +95,7 @@ public: // SwPortionHandler methods virtual void Text(sal_uInt16 nLength, sal_uInt16 nType); - virtual void Special(sal_uInt16 nLength, const String& rText, sal_uInt16 nType); + virtual void Special(sal_uInt16 nLength, const String& rText, sal_uInt16 nType, sal_Int32 nHeight = 0); virtual void LineBreak(); virtual void Skip(sal_uInt16 nLength); virtual void Finish(); diff --git a/sw/source/core/inc/SwPortionHandler.hxx b/sw/source/core/inc/SwPortionHandler.hxx index 7c1084e..5f81b9a 100644 --- a/sw/source/core/inc/SwPortionHandler.hxx +++ b/sw/source/core/inc/SwPortionHandler.hxx @@ -66,7 +66,8 @@ public: virtual void Special( sal_uInt16 nLength, /// length of this portion in the model string const String& rText, /// text which is painted on-screen - sal_uInt16 nType /// type of this portion + sal_uInt16 nType, /// type of this portion + sal_Int32 nHeight = 0 /// font height of the painted text ) = 0; /** line break. This method is called whenever a line break in the diff --git a/sw/source/core/text/porfld.cxx b/sw/source/core/text/porfld.cxx index 62cdbe9..fbb5eb7 100644 --- a/sw/source/core/text/porfld.cxx +++ b/sw/source/core/text/porfld.cxx @@ -471,7 +471,10 @@ sal_Bool SwFldPortion::GetExpTxt( const SwTxtSizeInfo &rInf, XubString &rTxt ) c void SwFldPortion::HandlePortion( SwPortionHandler& rPH ) const { - rPH.Special( GetLen(), aExpand, GetWhichPor() ); + sal_Int32 nH = 0; + if (pFnt) + nH = pFnt->GetSize(pFnt->GetActual()).Height(); + rPH.Special( GetLen(), aExpand, GetWhichPor(), nH ); } /************************************************************************* diff --git a/sw/source/core/text/xmldump.cxx b/sw/source/core/text/xmldump.cxx index 7df0ec8..c9578a3 100644 --- a/sw/source/core/text/xmldump.cxx +++ b/sw/source/core/text/xmldump.cxx @@ -153,10 +153,13 @@ class XmlPortionDumper:public SwPortionHandler text which is painted on-screen @param nType type of this portion + @param nHeight + font size of the painted text */ virtual void Special( sal_uInt16 nLength, const String & rText, - sal_uInt16 nType ) + sal_uInt16 nType, + sal_Int32 nHeight = 0 ) { xmlTextWriterStartElement( writer, BAD_CAST( "Special" ) ); xmlTextWriterWriteFormatAttribute( writer, @@ -171,6 +174,9 @@ class XmlPortionDumper:public SwPortionHandler xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "rText" ), "%s", sText8.getStr( ) ); + if (nHeight > 0) + xmlTextWriterWriteFormatAttribute(writer, BAD_CAST("nHeight"), "%i", (int)nHeight); + xmlTextWriterEndElement( writer ); ofs += nLength; } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits