sal/osl/unx/file_url.cxx | 202 ++++++++++++++++++++----------------------- sal/qa/osl/file/osl_File.cxx | 111 +++++++++++++++++------ 2 files changed, 174 insertions(+), 139 deletions(-)
New commits: commit e7982510d23c4b6047f0b81bfe1c684ecb1fff8a Author: Chris Sherlock <[email protected]> Date: Sun May 14 17:35:56 2017 +1000 osl: cleanup file_url.cxx Change-Id: I636b0a7765be8e6e96e90ff5a004dc452048541a diff --git a/sal/osl/unx/file_url.cxx b/sal/osl/unx/file_url.cxx index 69ba4349b968..8b4eb69c752a 100644 --- a/sal/osl/unx/file_url.cxx +++ b/sal/osl/unx/file_url.cxx @@ -47,7 +47,7 @@ #include "uunxapi.hxx" -/*************************************************** +/** @file General note @@ -60,7 +60,7 @@ way. In rtl/uri there is already an URI parser etc. so this code should be consolidated. - **************************************************/ +*/ using namespace osl; @@ -134,16 +134,15 @@ oslFileError getSystemPathFromFileUrl( } } // Handle query or fragment: - if (url.indexOf('?', i) != -1 || url.indexOf('#', i) != -1) { + if (url.indexOf('?', i) != -1 || url.indexOf('#', i) != -1) return osl_File_E_INVAL; - } // Handle authority: - if (url.getLength() - i >= 2 && url[i] == '/' && url[i + 1] == '/') { + if (url.getLength() - i >= 2 && url[i] == '/' && url[i + 1] == '/') + { i += 2; sal_Int32 j = url.indexOf('/', i); - if (j == -1) { + if (j == -1) j = url.getLength(); - } if (j != i && (rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths( url.pData->buffer + i, j - i, @@ -159,45 +158,53 @@ oslFileError getSystemPathFromFileUrl( i = j; } // Handle empty path: - if (i == url.getLength()) { + if (i == url.getLength()) + { *path = "/"; return osl_File_E_None; } // Path must not contain %2F: - if (url.indexOf("%2F", i) != -1 || url.indexOf("%2f", i) != -1) { + if (url.indexOf("%2F", i) != -1 || url.indexOf("%2f", i) != -1) return osl_File_E_INVAL; - } + *path = rtl::Uri::decode( url.copy(i), rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8); // Path must not contain %2F: - if (path->indexOf('\0') != -1) { + if (path->indexOf('\0') != -1) return osl_File_E_INVAL; - } + // Handle ~ notation: - if (resolveHome && path->getLength() >= 2 && (*path)[1] == '~') { + if (resolveHome && path->getLength() >= 2 && (*path)[1] == '~') + { sal_Int32 j = path->indexOf('/', 2); - if (j == -1) { + if (j == -1) j = path->getLength(); - } - if (j == 2) { + + if (j == 2) + { OUString home; - if (!osl::Security().getHomeDir(home)) { + if (!osl::Security().getHomeDir(home)) + { SAL_WARN("sal.file", "osl::Security::getHomeDir failed"); return osl_File_E_INVAL; } + i = url.indexOf('/', i + 1); - if (i == -1) { + + if (i == -1) i = url.getLength(); - } else { + else ++i; - } + //TODO: cheesy way of ensuring home's path ends in slash: - if (!home.isEmpty() && home[home.getLength() - 1] != '/') { + if (!home.isEmpty() && home[home.getLength() - 1] != '/') home += "/"; - } - try { + try + { home = rtl::Uri::convertRelToAbs(home, url.copy(i)); - } catch (rtl::MalformedUriException & e) { + } + catch (rtl::MalformedUriException & e) + { SAL_WARN("sal.file", "rtl::MalformedUriException " << e.getMessage()); return osl_File_E_INVAL; } @@ -215,15 +222,19 @@ oslFileError SAL_CALL osl_getSystemPathFromFileURL( rtl_uString *ustrFileURL, rt { OUString path; oslFileError e; - try { + try + { e = getSystemPathFromFileUrl( OUString::unacquired(&ustrFileURL), &path, true); - } catch (std::length_error) { + } + catch (std::length_error) + { e = osl_File_E_RANGE; } - if (e == osl_File_E_None) { + + if (e == osl_File_E_None) rtl_uString_assign(pustrSystemPath, path.pData); - } + return e; } @@ -240,27 +251,7 @@ oslFileError SAL_CALL osl_getFileURLFromSystemPath( rtl_uString *ustrSystemPath, /* temporary hack: if already file url, return ustrSystemPath */ if( rtl_ustr_ascii_shortenedCompare_WithLength( ustrSystemPath->buffer, ustrSystemPath->length,"file:", 5 ) == 0 ) - { - /* - if( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( ustrSystemPath->buffer, ustrSystemPath->length,"file://", 7 ) ) - { - OSL_FAIL( "osl_getFileURLFromSystemPath: input is already file URL" ); - rtl_uString_assign( pustrFileURL, ustrSystemPath ); - } - else - { - rtl_uString *pTmp2 = NULL; - - OSL_FAIL( "osl_getFileURLFromSystemPath: input is wrong file URL" ); - rtl_uString_newFromStr_WithLength( pustrFileURL, ustrSystemPath->buffer + 5, ustrSystemPath->length - 5 ); - rtl_uString_newFromAscii( &pTmp2, "file://" ); - rtl_uString_newConcat( pustrFileURL, *pustrFileURL, pTmp2 ); - rtl_uString_release( pTmp2 ); - } - return osl_File_E_None; - */ return osl_File_E_INVAL; - } /* check if system path starts with ~ or ~user and replace it with the appropriate home dir */ if( ustrSystemPath->buffer[0] == '~' ) @@ -366,10 +357,9 @@ oslFileError osl_getSystemPathFromFileURL_Ex( namespace { - /****************************************************** - * Helper function, return a pinter to the final '\0' - * of a string - ******************************************************/ + /** Helper function, return a pinter to the final '\0' + of a string + */ sal_Unicode* ustrtoend(sal_Unicode* pStr) { @@ -392,24 +382,24 @@ namespace return (*p == Chr); } - /****************************************************** - * Remove the last part of a path, a path that has - * only a '/' or no '/' at all will be returned - * unmodified - ******************************************************/ + /** + Remove the last part of a path, a path that has + only a '/' or no '/' at all will be returned + unmodified + */ sal_Unicode* _rmlastpathtoken(sal_Unicode* aPath) { - /* we always may skip -2 because we - may at least stand on a '/' but - either there is no other character - before this '/' or it's another - character than the '/' + /* we may always skip -2 because we + may at least stand on a '/' but + either there is no other character + before this '/' or it's another + character than the '/' */ sal_Unicode* p = ustrtoend(aPath) - 2; - // move back to the next path separator - // or to the start of the string + /* move back to the next path separator + or to the start of the string */ while ((p > aPath) && (*p != '/')) p--; @@ -422,7 +412,7 @@ namespace } else { - *p = '\0'; + *p = '\0'; } } @@ -446,7 +436,6 @@ namespace { if (!TextToUnicode(resolved_path, strlen(resolved_path), path, PATH_MAX)) return oslTranslateFileError(OSL_FET_ERROR, ENAMETOOLONG); - } else { @@ -460,15 +449,14 @@ namespace return ferr; } - /****************************************************** - * Works even with non existing paths. The resulting - * path must not exceed PATH_MAX else - * osl_File_E_NAMETOOLONG is the result - ******************************************************/ + /** + Works even with non existing paths. The resulting path must not exceed + PATH_MAX else osl_File_E_NAMETOOLONG is the result + */ oslFileError osl_getAbsoluteFileURL_impl_(const rtl::OUString& unresolved_path, rtl::OUString& resolved_path) { - // the given unresolved path must not exceed PATH_MAX + /* the given unresolved path must not exceed PATH_MAX */ if (unresolved_path.getLength() >= (PATH_MAX - 2)) return oslTranslateFileError(OSL_FET_ERROR, ENAMETOOLONG); @@ -476,13 +464,13 @@ namespace const sal_Unicode* punresolved = unresolved_path.getStr(); sal_Unicode* presolvedsf = path_resolved_so_far; - // reserve space for leading '/' and trailing '\0' - // do not exceed this limit + /* reserve space for leading '/' and trailing '\0' + do not exceed this limit */ sal_Unicode* sentinel = path_resolved_so_far + PATH_MAX - 2; - // if realpath fails with error ENOTDIR, EACCES or ENOENT - // we will not call it again, because _osl_realpath should also - // work with non existing directories etc. + /* if realpath fails with error ENOTDIR, EACCES or ENOENT + we will not call it again, because _osl_realpath should also + work with non existing directories etc. */ bool realpath_failed = false; oslFileError ferr; @@ -490,8 +478,7 @@ namespace while (*punresolved != '\0') { - // ignore '/.' , skip one part back when '/..' - + /* ignore '/.' , skip one part back when '/..' */ if ((*punresolved == '.') && (*presolvedsf == '/')) { if (*(punresolved + 1) == '\0') @@ -517,8 +504,8 @@ namespace continue; } - // a file or directory name may start with '.' + /* a file or directory name may start with '.' */ if ((presolvedsf = ustrtoend(path_resolved_so_far)) > sentinel) return oslTranslateFileError(OSL_FET_ERROR, ENAMETOOLONG); @@ -589,24 +576,26 @@ namespace } -oslFileError osl_getAbsoluteFileURL(rtl_uString* ustrBaseDirURL, rtl_uString* ustrRelativeURL, rtl_uString** pustrAbsoluteURL) +oslFileError osl_getAbsoluteFileURL( + rtl_uString* ustrBaseDirURL, + rtl_uString* ustrRelativeURL, + rtl_uString** pustrAbsoluteURL) { - // Work around the below call to getSystemPathFromFileURL rejecting input - // that starts with "/" (for whatever reason it behaves that way; but - // changing that would start to break lots of tests at least): + /* Work around the below call to getSystemPathFromFileURL rejecting input + that starts with "/" (for whatever reason it behaves that way; but + changing that would start to break lots of tests at least) */ rtl::OUString relUrl(ustrRelativeURL); - if (relUrl.startsWith("//")) { + if (relUrl.startsWith("//")) relUrl = "file:" + relUrl; - } else if (relUrl.startsWith("/")) { + else if (relUrl.startsWith("/")) relUrl = "file://" + relUrl; - } FileBase::RC rc; rtl::OUString unresolved_path; rc = FileBase::getSystemPathFromFileURL(relUrl, unresolved_path); - if(rc != FileBase::E_None) + if (rc != FileBase::E_None) return oslFileError(rc); if (systemPathIsRelativePath(unresolved_path)) @@ -634,17 +623,16 @@ oslFileError osl_getAbsoluteFileURL(rtl_uString* ustrBaseDirURL, rtl_uString* u return oslFileError(rc); } -namespace osl { namespace detail { - /********************************************* - No separate error code if unicode to text - conversion or getenv fails because for the - caller there is no difference why a file - could not be found in $PATH - ********************************************/ +namespace osl { +namespace detail { + /** + No separate error code if unicode to text conversion or getenv fails because for the + caller there is no difference why a file could not be found in $PATH + */ bool find_in_PATH(const rtl::OUString& file_path, rtl::OUString& result) { - bool bfound = false; + bool bfound = false; rtl::OUString path("PATH"); rtl::OUString env_path; @@ -653,17 +641,15 @@ namespace osl { namespace detail { return bfound; } -} } +} +} namespace { - /********************************************* - No separate error code if unicode to text - conversion or getcwd fails because for the - caller there is no difference why a file - could not be found in CDW - ********************************************/ - + /** + No separate error code if unicode to text conversion or getcwd fails because for the + caller there is no difference why a file could not be found in CDW + */ bool find_in_CWD(const rtl::OUString& file_path, rtl::OUString& result) { bool bfound = false; @@ -824,15 +810,15 @@ namespace int TextToUnicode( const char* text, - size_t text_buffer_size, + size_t text_buffer_size, sal_Unicode* unic_text, - sal_Int32 unic_text_buffer_size) + sal_Int32 unic_text_buffer_size) { sal_uInt32 nInfo = 0; - sal_Size nSrcChars = 0; + sal_Size nSrcChars = 0; sal_Size nDestBytes = TextToUnicodeConverter_Impl::getInstance().convert( - text, text_buffer_size, unic_text, unic_text_buffer_size, + text, text_buffer_size, unic_text, unic_text_buffer_size, OSTRING_TO_OUSTRING_CVTFLAGS | RTL_TEXTTOUNICODE_FLAGS_FLUSH, &nInfo, &nSrcChars); if (nInfo & RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL) commit 100895cf07a4c01f3b784c6eab344b7667b145e1 Author: Chris Sherlock <[email protected]> Date: Sun May 14 15:56:29 2017 +1000 osl: osl_File.cxx unit test formatting cleanup Change-Id: I0e0386834e9cf76cd3c606ae01175aec9cf7e4f1 diff --git a/sal/qa/osl/file/osl_File.cxx b/sal/qa/osl/file/osl_File.cxx index 31d29d5ee219..8a8294fc7847 100644 --- a/sal/qa/osl/file/osl_File.cxx +++ b/sal/qa/osl/file/osl_File.cxx @@ -282,20 +282,22 @@ enum class oslCheckMode { WriteAccess }; -// check if the file exist +/** check if the file exist +*/ inline bool ifFileExist(const OUString & str) { File testFile(str); return (osl::FileBase::E_None == testFile.open(osl_File_OpenFlag_Read)); } -// check if the file can be written +/** check if the file can be written +*/ inline bool ifFileCanWrite(const OUString & str) { // on Windows, the file has no write right, but can be written #ifdef _WIN32 - bool bCheckResult = false; - OUString aUStr = str.copy(0); + bool bCheckResult = false; + OUString aUStr = str.copy(0); if (isURL(str)) osl::FileBase::getSystemPathFromFileURL(str, aUStr); @@ -311,17 +313,17 @@ inline bool ifFileCanWrite(const OUString & str) return bCheckResult; } -inline bool checkDirectory(const OUString & str, oslCheckMode nCheckMode) +inline bool checkDirectory(const OUString& str, oslCheckMode nCheckMode) { - OUString aUString; - DirectoryItem rItem; + OUString aUString; + DirectoryItem rItem; osl::FileBase::RC rc; - bool bCheckResult= false; + bool bCheckResult= false; Directory aDir(str); rc = aDir.open(); - if ((osl::FileBase::E_NOENT != rc) && (osl::FileBase::E_ACCES != rc)) + if ((rc != osl::FileBase::E_NOENT) && (rc != osl::FileBase::E_ACCES)) { switch (nCheckMode) { @@ -342,7 +344,9 @@ inline bool checkDirectory(const OUString & str, oslCheckMode nCheckMode) CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, rc); } else + { bCheckResult = false; + } break; default: @@ -375,7 +379,7 @@ inline OString outputError(const OString & returnVal, const OString & rightVal, /** Change file mode, two version in UNIX and Windows;. */ -#if (defined UNX) // chmod() method is differ in Windows +#if (defined UNX) /* chmod() method is different in Windows */ inline void changeFileMode(OUString & filepath, sal_Int32 mode) { OString aString; @@ -388,7 +392,7 @@ inline void changeFileMode(OUString & filepath, sal_Int32 mode) int ret = chmod(aString.getStr(), mode); CPPUNIT_ASSERT_EQUAL(0, ret); } -#else // Windows version +#else /* Windows version */ inline void changeFileMode(OUString & filepath, sal_Int32 mode) { (void)filepath; @@ -411,7 +415,10 @@ namespace osl_FileBase class getAbsoluteFileURL : public CppUnit::TestFixture { public: - void check_getAbsoluteFileURL(OUString const& _suBaseURL, OString const& _sRelativeURL, osl::FileBase::RC _nAssumeError, OUString const& _suAssumeResultStr); + void check_getAbsoluteFileURL(OUString const& _suBaseURL, + OString const& _sRelativeURL, + osl::FileBase::RC _nAssumeError, + OUString const& _suAssumeResultStr); void getAbsoluteFileURL_001_1(); void getAbsoluteFileURL_001_2(); @@ -440,16 +447,21 @@ namespace osl_FileBase CPPUNIT_TEST_SUITE_END(); }; - void getAbsoluteFileURL::check_getAbsoluteFileURL(OUString const& _suBaseURL, OString const& _sRelativeURL, osl::FileBase::RC _nAssumeError, OUString const& _suAssumeResultStr) + void getAbsoluteFileURL::check_getAbsoluteFileURL(OUString const& _suBaseURL, + OString const& _sRelativeURL, + osl::FileBase::RC _nAssumeError, + OUString const& _suAssumeResultStr) { OUString suRelativeURL = OStringToOUString(_sRelativeURL, RTL_TEXTENCODING_UTF8); OString sBaseURL = OUStringToOString(_suBaseURL, RTL_TEXTENCODING_UTF8); OUString suResultURL; - osl::FileBase::RC nError = osl::FileBase::getAbsoluteFileURL(_suBaseURL, suRelativeURL, suResultURL); + osl::FileBase::RC nError = osl::FileBase::getAbsoluteFileURL(_suBaseURL, suRelativeURL, suResultURL); OString sResultURL = OUStringToOString(suResultURL, RTL_TEXTENCODING_UTF8); OString sError = errorToString(nError); - printf("getAbsoluteFileURL('%s','%s') deliver absolute URL: '%s', error '%s'\n", sBaseURL.getStr(), _sRelativeURL.getStr(),sResultURL.getStr(), sError.getStr()); + printf("getAbsoluteFileURL('%s','%s') deliver absolute URL: '%s', error '%s'\n", + sBaseURL.getStr(), _sRelativeURL.getStr(),sResultURL.getStr(), sError.getStr()); CPPUNIT_ASSERT_EQUAL_MESSAGE("Assumption is wrong: error number is wrong", _nAssumeError, nError); + if (nError == osl::FileBase::E_None) { bool bStrAreEqual = _suAssumeResultStr.equals(suResultURL); @@ -521,7 +533,7 @@ namespace osl_FileBase void getAbsoluteFileURL::getAbsoluteFileURL_002() { -#if (defined UNX) // Link is not defined in Windows +#if (defined UNX) // Link is not defined in Windows OUString aUStr_LnkFileSys(aTempDirectorySys), aUStr_SrcFileSys(aTempDirectorySys); aUStr_LnkFileSys += aSlashURL + getCurrentPID() + "/link.file"; aUStr_SrcFileSys += aSlashURL + getCurrentPID() + "/canonical.name"; @@ -569,15 +581,7 @@ namespace osl_FileBase class SystemPath_FileURL : public CppUnit::TestFixture { - private: - void check_SystemPath_FileURL(OString const& _sSource, osl::FileBase::RC _nAssumeError, OString const& _sAssumeResultStr, bool bDirection = true); - void checkWNTBehaviour_getSystemPathFromFileURL(OString const& _sURL, osl::FileBase::RC _nAssumeError, OString const& _sWNTAssumeResultString); - void checkUNXBehaviour_getSystemPathFromFileURL(OString const& _sURL, osl::FileBase::RC _nAssumeError, OString const& _sUnixAssumeResultString); - void checkWNTBehaviour_getFileURLFromSystemPath(OString const& _sSysPath, osl::FileBase::RC _nAssumeError, OString const& _sWNTAssumeResultString); - void checkUNXBehaviour_getFileURLFromSystemPath(OString const& _sSysPath, osl::FileBase::RC _nAssumeError, OString const& _sUnixAssumeResultString); - public: - void getSystemPathFromFileURL_001_1(); void getSystemPathFromFileURL_001_2(); void getSystemPathFromFileURL_001_21(); @@ -639,11 +643,42 @@ namespace osl_FileBase CPPUNIT_TEST(getFileURLFromSystemPath_004); CPPUNIT_TEST(getFileURLFromSystemPath_005); CPPUNIT_TEST_SUITE_END(); + + private: + void check_SystemPath_FileURL( + OString const& _sSource, + osl::FileBase::RC _nAssumeError, + OString const& _sAssumeResultStr, + bool bDirection = true); + + void checkWNTBehaviour_getSystemPathFromFileURL( + OString const& _sURL, + osl::FileBase::RC _nAssumeError, + OString const& _sWNTAssumeResultString); + + void checkUNXBehaviour_getSystemPathFromFileURL( + OString const& _sURL, + osl::FileBase::RC _nAssumeError, + OString const& _sUnixAssumeResultString); + + void checkWNTBehaviour_getFileURLFromSystemPath(OString const& _sSysPath, + osl::FileBase::RC _nAssumeError, + OString const& _sWNTAssumeResultString); + + void checkUNXBehaviour_getFileURLFromSystemPath( + OString const& _sSysPath, + osl::FileBase::RC _nAssumeError, + OString const& _sUnixAssumeResultString); + }; // if bDirection==sal_True, check getSystemPathFromFileURL // if bDirection==sal_False, check getFileURLFromSystemPath - void SystemPath_FileURL::check_SystemPath_FileURL(OString const& _sSource, osl::FileBase::RC _nAssumeError, OString const& _sAssumeResultStr, bool bDirection) + void SystemPath_FileURL::check_SystemPath_FileURL( + OString const& _sSource, + osl::FileBase::RC _nAssumeError, + OString const& _sAssumeResultStr, + bool bDirection) { // PRE: URL as String OUString suSource; @@ -662,9 +697,11 @@ namespace osl_FileBase OString sError = errorToString(nError); if (bDirection) - printf("getSystemPathFromFileURL('%s') deliver system path: '%s', error '%s'\n", _sSource.getStr(), sStr.getStr(), sError.getStr()); + printf("getSystemPathFromFileURL('%s') deliver system path: '%s', error '%s'\n", + _sSource.getStr(), sStr.getStr(), sError.getStr()); else - printf("getFileURLFromSystemPath('%s') deliver File URL: '%s', error '%s'\n", _sSource.getStr(), sStr.getStr(), sError.getStr()); + printf("getFileURLFromSystemPath('%s') deliver File URL: '%s', error '%s'\n", + _sSource.getStr(), sStr.getStr(), sError.getStr()); if (!_sAssumeResultStr.isEmpty()) { @@ -680,7 +717,10 @@ namespace osl_FileBase } } - void SystemPath_FileURL::checkWNTBehaviour_getSystemPathFromFileURL(OString const& _sURL, osl::FileBase::RC _nAssumeError, OString const& _sWNTAssumeResultString) + void SystemPath_FileURL::checkWNTBehaviour_getSystemPathFromFileURL( + OString const& _sURL, + osl::FileBase::RC _nAssumeError, + OString const& _sWNTAssumeResultString) { #if defined(_WIN32) check_SystemPath_FileURL(_sURL, _nAssumeError, _sWNTAssumeResultString); @@ -691,7 +731,10 @@ namespace osl_FileBase #endif } - void SystemPath_FileURL::checkUNXBehaviour_getSystemPathFromFileURL(OString const& _sURL, osl::FileBase::RC _nAssumeError, OString const& _sUnixAssumeResultString) + void SystemPath_FileURL::checkUNXBehaviour_getSystemPathFromFileURL( + OString const& _sURL, + osl::FileBase::RC _nAssumeError, + OString const& _sUnixAssumeResultString) { #if (defined UNX) check_SystemPath_FileURL(_sURL, _nAssumeError, _sUnixAssumeResultString); @@ -702,7 +745,10 @@ namespace osl_FileBase #endif } - void SystemPath_FileURL::checkWNTBehaviour_getFileURLFromSystemPath(OString const& _sSysPath, osl::FileBase::RC _nAssumeError, OString const& _sWNTAssumeResultString) + void SystemPath_FileURL::checkWNTBehaviour_getFileURLFromSystemPath( + OString const& _sSysPath, + osl::FileBase::RC _nAssumeError, + OString const& _sWNTAssumeResultString) { #if defined(_WIN32) check_SystemPath_FileURL(_sSysPath, _nAssumeError, _sWNTAssumeResultString, sal_False); @@ -713,7 +759,10 @@ namespace osl_FileBase #endif } - void SystemPath_FileURL::checkUNXBehaviour_getFileURLFromSystemPath(OString const& _sSysPath, osl::FileBase::RC _nAssumeError, OString const& _sUnixAssumeResultString) + void SystemPath_FileURL::checkUNXBehaviour_getFileURLFromSystemPath( + OString const& _sSysPath, + osl::FileBase::RC _nAssumeError, + OString const& _sUnixAssumeResultString) { #if (defined UNX) check_SystemPath_FileURL(_sSysPath, _nAssumeError, _sUnixAssumeResultString, false); _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
