From 94a5281912f08fc098c4360ccd4b45b0e10176fe67b07f8df77e65ae04c2cfe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Chv=C3=A1tal?= Date: Thu, 14 Mar 2019 14:52:17 +0000 Subject: [PATCH 1/7] - Add patch to fix build on Leap 42: * kde5.patch OBS-URL: https://build.opensuse.org/package/show/LibreOffice:Factory/libreoffice?expand=0&rev=769 --- kde5.patch | 350 ++++++++++++++++++++++++++++++++++++++++++++ libreoffice.changes | 6 + libreoffice.spec | 2 + 3 files changed, 358 insertions(+) create mode 100644 kde5.patch diff --git a/kde5.patch b/kde5.patch new file mode 100644 index 0000000..49c1250 --- /dev/null +++ b/kde5.patch @@ -0,0 +1,350 @@ +From 265caa4381c048c346c907b017561ab0fe0367ff Mon Sep 17 00:00:00 2001 +From: Michael Stahl +Date: Fri, 22 Feb 2019 19:19:27 +0100 +Subject: [PATCH] tdf#119856 vcl: Qt5/KDE5 RunInMainThread + +The problem with the current approach of transferring calls to the main +thread with Q_EMIT signals is that if the code that should run in the +main thread needs SolarMutex, then the non-main-thread must use +SolarMutexReleaser - but then the main thread will run not only the call +that is needed right now, but will potentially process all pending +events, and the other thread hasn't prepared for that. + +We need the inter-thread feature of Qt::BlockingQueuedConnection and the +non-queued feature of Qt::DirectConnection, but this combination doesn't +appear to exist. + +So the SolarMutexReleaser needs to go - but then the main thread does +need SolarMutex for some things, and hence we need to trick it into +believing it has SolarMutex with the m_bNoYieldLock hack. + +Then it becomes apparent that the main thread may be blocked on either +Qt events, which is fine, or on the SalYieldMutex's m_aMutex, which will +never be released now. + +So the main thread must never block on m_aMutex; the alternative is to +use the same approach as the osx code (and, in a somewhat different +form, the svp code), and add some condition variables on which the main +thread can block if it fails to acquire the m_aMutex immediately. + +It's even possible to do this in a somewhat generic way with lambdas. + +This does appear to work, but it makes the Q_EMIT approach entirely +untenable, because now the main thread will be blocked on the condition +variable and the non-main-thread will be blocked until the Qt event is +processed. + +Change-Id: I6480a6b909d5ec8814b2ff10dbefb0f3686a83c7 +Reviewed-on: https://gerrit.libreoffice.org/68232 +Tested-by: Jenkins +Reviewed-by: Katarina Behrens +--- + vcl/inc/qt5/Qt5Instance.hxx | 7 +- + vcl/qt5/Qt5Instance.cxx | 175 ++++++++++++++++++++++++++++--- + vcl/unx/kde5/KDE5SalInstance.cxx | 23 ++-- + vcl/unx/kde5/KDE5SalInstance.hxx | 8 +- + 4 files changed, 181 insertions(+), 32 deletions(-) + +Index: libreoffice-6.2.2.1/vcl/inc/qt5/Qt5Instance.hxx +=================================================================== +--- libreoffice-6.2.2.1.orig/vcl/inc/qt5/Qt5Instance.hxx ++++ libreoffice-6.2.2.1/vcl/inc/qt5/Qt5Instance.hxx +@@ -27,6 +27,8 @@ + + #include + ++#include ++ + class QApplication; + class SalYieldMutex; + class SalFrame; +@@ -50,15 +52,18 @@ public: + + private Q_SLOTS: + bool ImplYield(bool bWait, bool bHandleAllCurrentEvents); ++ void ImplRunInMain(); + + Q_SIGNALS: + bool ImplYieldSignal(bool bWait, bool bHandleAllCurrentEvents); +- std::unique_ptr createMenuSignal(bool, Menu*); ++ void ImplRunInMainSignal(); + + public: + explicit Qt5Instance(bool bUseCairo = false); + virtual ~Qt5Instance() override; + ++ void RunInMainThread(std::function func); ++ + virtual SalFrame* CreateFrame(SalFrame* pParent, SalFrameStyleFlags nStyle) override; + virtual SalFrame* CreateChildFrame(SystemParentData* pParent, + SalFrameStyleFlags nStyle) override; +Index: libreoffice-6.2.2.1/vcl/qt5/Qt5Instance.cxx +=================================================================== +--- libreoffice-6.2.2.1.orig/vcl/qt5/Qt5Instance.cxx ++++ libreoffice-6.2.2.1/vcl/qt5/Qt5Instance.cxx +@@ -43,13 +43,165 @@ + #include + + #include ++#include ++#include + #include + #include + + #include + ++#include ++#include ++ ++/// TODO: not much Qt5 specific here? could be generalised, esp. for OSX... ++/// this subclass allows for the transfer of a closure for running on the main ++/// thread, to handle all the thread affine stuff in Qt5; the SolarMutex is ++/// "loaned" to the main thread for the execution of the closure. ++/// @note it doesn't work to just use "emit" and signals/slots to move calls to ++/// the main thread, because the other thread has the SolarMutex; the other ++/// thread (typically) cannot release SolarMutex, because then the main thread ++/// will handle all sorts of events and whatnot; this design ensures that the ++/// main thread only runs the passed closure (unless the closure releases ++/// SolarMutex itself, which should probably be avoided). ++class Qt5YieldMutex : public SalYieldMutex ++{ ++public: ++ /// flag only accessed on main thread: ++ /// main thread has "borrowed" SolarMutex from another thread ++ bool m_bNoYieldLock = false; ++ /// members for communication from non-main thread to main thread ++ std::mutex m_RunInMainMutex; ++ std::condition_variable m_InMainCondition; ++ bool m_isWakeUpMain = false; ++ std::function m_Closure; ///< code for main thread to run ++ /// members for communication from main thread to non-main thread ++ std::condition_variable m_ResultCondition; ++ bool m_isResultReady = false; ++ ++ virtual bool IsCurrentThread() const override; ++ virtual void doAcquire(sal_uInt32 nLockCount) override; ++ virtual sal_uInt32 doRelease(bool const bUnlockAll) override; ++}; ++ ++bool Qt5YieldMutex::IsCurrentThread() const ++{ ++ auto const* pSalInst(static_cast(GetSalData()->m_pInstance)); ++ assert(pSalInst); ++ if (pSalInst->IsMainThread() && m_bNoYieldLock) ++ { ++ return true; // main thread has borrowed SolarMutex ++ } ++ return SalYieldMutex::IsCurrentThread(); ++} ++ ++void Qt5YieldMutex::doAcquire(sal_uInt32 nLockCount) ++{ ++ auto const* pSalInst(static_cast(GetSalData()->m_pInstance)); ++ assert(pSalInst); ++ if (!pSalInst->IsMainThread()) ++ { ++ SalYieldMutex::doAcquire(nLockCount); ++ return; ++ } ++ if (m_bNoYieldLock) ++ { ++ return; // special case for main thread: borrowed from other thread ++ } ++ do // main thread acquire... ++ { ++ std::function func; // copy of closure on thread stack ++ { ++ std::unique_lock g(m_RunInMainMutex); ++ if (m_aMutex.tryToAcquire()) ++ { ++ // if there's a closure, the other thread holds m_aMutex ++ assert(!m_Closure); ++ m_isWakeUpMain = false; ++ --nLockCount; // have acquired once! ++ ++m_nCount; ++ break; ++ } ++ m_InMainCondition.wait(g, [this]() { return m_isWakeUpMain; }); ++ m_isWakeUpMain = false; ++ std::swap(func, m_Closure); ++ } ++ if (func) ++ { ++ assert(!m_bNoYieldLock); ++ m_bNoYieldLock = true; // execute closure with borrowed SolarMutex ++ func(); ++ m_bNoYieldLock = false; ++ std::unique_lock g(m_RunInMainMutex); ++ assert(!m_isResultReady); ++ m_isResultReady = true; ++ m_ResultCondition.notify_all(); // unblock other thread ++ } ++ } while (true); ++ SalYieldMutex::doAcquire(nLockCount); ++} ++ ++sal_uInt32 Qt5YieldMutex::doRelease(bool const bUnlockAll) ++{ ++ auto const* pSalInst(static_cast(GetSalData()->m_pInstance)); ++ assert(pSalInst); ++ if (pSalInst->IsMainThread() && m_bNoYieldLock) ++ { ++ return 1; // dummy value ++ } ++ ++ std::unique_lock g(m_RunInMainMutex); ++ // read m_nCount before doRelease (it's guarded by m_aMutex) ++ bool const isReleased(bUnlockAll || m_nCount == 1); ++ sal_uInt32 nCount = SalYieldMutex::doRelease(bUnlockAll); ++ if (isReleased && !pSalInst->IsMainThread()) ++ { ++ m_isWakeUpMain = true; ++ m_InMainCondition.notify_all(); // unblock main thread ++ } ++ return nCount; ++} ++ ++// this could be abstracted to be independent of Qt5 by passing in the ++// event-trigger as another function parameter... ++// it could also be a template of the return type, then it could return the ++// result of func... but then how to handle the result in doAcquire? ++void Qt5Instance::RunInMainThread(std::function func) ++{ ++ DBG_TESTSOLARMUTEX(); ++ if (IsMainThread()) ++ { ++ func(); ++ return; ++ } ++ ++ Qt5YieldMutex* const pMutex(static_cast(GetYieldMutex())); ++ { ++ std::unique_lock g(pMutex->m_RunInMainMutex); ++ assert(!pMutex->m_Closure); ++ pMutex->m_Closure = func; ++ // unblock main thread in case it is blocked on condition ++ pMutex->m_isWakeUpMain = true; ++ pMutex->m_InMainCondition.notify_all(); ++ } ++ // wake up main thread in case it is blocked on event queue ++ // TriggerUserEventProcessing() appears to be insufficient in case the ++ // main thread does QEventLoop::WaitForMoreEvents ++ Q_EMIT ImplRunInMainSignal(); ++ { ++ std::unique_lock g(pMutex->m_RunInMainMutex); ++ pMutex->m_ResultCondition.wait(g, [pMutex]() { return pMutex->m_isResultReady; }); ++ pMutex->m_isResultReady = false; ++ } ++} ++ ++void Qt5Instance::ImplRunInMain() ++{ ++ SolarMutexGuard g; // trigger the dispatch code in Qt5YieldMutex::doAcquire ++ (void)this; // suppress unhelpful [loplugin:staticmethods]; can't be static ++} ++ + Qt5Instance::Qt5Instance(bool bUseCairo) +- : SalGenericInstance(o3tl::make_unique()) ++ : SalGenericInstance(o3tl::make_unique()) + , m_postUserEventId(-1) + , m_bUseCairo(bUseCairo) + { +@@ -65,8 +217,8 @@ Qt5Instance::Qt5Instance(bool bUseCairo) + // is processed before the thread emitting the signal continues + connect(this, SIGNAL(ImplYieldSignal(bool, bool)), this, SLOT(ImplYield(bool, bool)), + Qt::BlockingQueuedConnection); +- connect(this, &Qt5Instance::createMenuSignal, this, &Qt5Instance::CreateMenu, +- Qt::BlockingQueuedConnection); ++ connect(this, &Qt5Instance::ImplRunInMainSignal, this, &Qt5Instance::ImplRunInMain, ++ Qt::QueuedConnection); // no Blocking! + } + + Qt5Instance::~Qt5Instance() +@@ -136,15 +288,14 @@ Qt5Instance::CreateVirtualDevice(SalGrap + + std::unique_ptr Qt5Instance::CreateMenu(bool bMenuBar, Menu* pVCLMenu) + { +- if (qApp->thread() != QThread::currentThread()) +- { +- SolarMutexReleaser aReleaser; +- return Q_EMIT createMenuSignal(bMenuBar, pVCLMenu); +- } +- +- Qt5Menu* pSalMenu = new Qt5Menu(bMenuBar); +- pSalMenu->SetMenu(pVCLMenu); +- return std::unique_ptr(pSalMenu); ++ std::unique_ptr pRet; ++ RunInMainThread([&pRet, bMenuBar, pVCLMenu]() { ++ Qt5Menu* pSalMenu = new Qt5Menu(bMenuBar); ++ pRet.reset(pSalMenu); ++ pSalMenu->SetMenu(pVCLMenu); ++ }); ++ assert(pRet); ++ return pRet; + } + + std::unique_ptr Qt5Instance::CreateMenuItem(const SalItemParams& rItemData) +Index: libreoffice-6.2.2.1/vcl/unx/kde5/KDE5SalInstance.cxx +=================================================================== +--- libreoffice-6.2.2.1.orig/vcl/unx/kde5/KDE5SalInstance.cxx ++++ libreoffice-6.2.2.1/vcl/unx/kde5/KDE5SalInstance.cxx +@@ -46,21 +46,16 @@ KDE5SalInstance::KDE5SalInstance() + pSVData->maAppData.mxToolkitName = OUString("kde5"); + + KDE5SalData::initNWF(); +- +- connect(this, &KDE5SalInstance::createFrameSignal, this, &KDE5SalInstance::CreateFrame, +- Qt::BlockingQueuedConnection); +- connect(this, &KDE5SalInstance::createFilePickerSignal, this, +- &KDE5SalInstance::createFilePicker, Qt::BlockingQueuedConnection); + } + + SalFrame* KDE5SalInstance::CreateFrame(SalFrame* pParent, SalFrameStyleFlags nState) + { +- if (!IsMainThread()) +- { +- SolarMutexReleaser aReleaser; +- return Q_EMIT createFrameSignal(pParent, nState); +- } +- return new KDE5SalFrame(static_cast(pParent), nState, true); ++ SalFrame* pRet(nullptr); ++ RunInMainThread(std::function([&pRet, pParent, nState]() { ++ pRet = new KDE5SalFrame(static_cast(pParent), nState, true); ++ })); ++ assert(pRet); ++ return pRet; + } + + uno::Reference +@@ -68,7 +63,11 @@ KDE5SalInstance::createFilePicker(const + { + if (!IsMainThread()) + { +- return Q_EMIT createFilePickerSignal(xMSF); ++ uno::Reference xRet; ++ RunInMainThread( ++ std::function([&xRet, this, xMSF]() { xRet = this->createFilePicker(xMSF); })); ++ assert(xRet); ++ return xRet; + } + + // In order to insert custom controls, KDE5FilePicker currently relies on KFileWidget +Index: libreoffice-6.2.2.1/vcl/unx/kde5/KDE5SalInstance.hxx +=================================================================== +--- libreoffice-6.2.2.1.orig/vcl/unx/kde5/KDE5SalInstance.hxx ++++ libreoffice-6.2.2.1/vcl/unx/kde5/KDE5SalInstance.hxx +@@ -42,13 +42,7 @@ public: + + virtual bool IsMainThread() const override; + +-Q_SIGNALS: +- SalFrame* createFrameSignal(SalFrame* pParent, SalFrameStyleFlags nStyle); +- +- css::uno::Reference +- createFilePickerSignal(const css::uno::Reference&); +- +-private Q_SLOTS: ++private: + virtual SalFrame* CreateFrame(SalFrame* pParent, SalFrameStyleFlags nStyle) override; + + virtual css::uno::Reference diff --git a/libreoffice.changes b/libreoffice.changes index b69bda0..88f2188 100644 --- a/libreoffice.changes +++ b/libreoffice.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Thu Mar 14 14:44:58 UTC 2019 - Tomáš Chvátal + +- Add patch to fix build on Leap 42: + * kde5.patch + ------------------------------------------------------------------- Tue Mar 12 10:07:34 UTC 2019 - Tomáš Chvátal diff --git a/libreoffice.spec b/libreoffice.spec index a1e9487..58142f9 100644 --- a/libreoffice.spec +++ b/libreoffice.spec @@ -103,6 +103,7 @@ Patch5: old-boost.patch Patch7: libreoffice-postgresql.patch Patch8: 0001-Fix-LTO-segfault-in-libtest_sw_uwriter-test.patch Patch9: boost_169.patch +Patch10: kde5.patch # try to save space by using hardlinks Patch990: install-with-hardlinks.diff # save time by relying on rpm check rather than doing stupid find+grep @@ -969,6 +970,7 @@ Provides %{langname} translations and additional resources (help files, etc.) fo %patch7 %patch8 -p1 %patch9 -p1 +%patch10 -p1 %patch990 -p1 %patch991 -p1 From a751fee39ae2808b8648d08c08f1c0a08d0bf21f0e0b0efd9a12f751b577e65e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Chv=C3=A1tal?= Date: Fri, 15 Mar 2019 11:33:36 +0000 Subject: [PATCH 2/7] OBS-URL: https://build.opensuse.org/package/show/LibreOffice:Factory/libreoffice?expand=0&rev=770 --- kde5.patch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kde5.patch b/kde5.patch index 49c1250..f58fa7e 100644 --- a/kde5.patch +++ b/kde5.patch @@ -323,7 +323,7 @@ Index: libreoffice-6.2.2.1/vcl/unx/kde5/KDE5SalInstance.cxx - return Q_EMIT createFilePickerSignal(xMSF); + uno::Reference xRet; + RunInMainThread( -+ std::function([&xRet, this, xMSF]() { xRet = this->createFilePicker(xMSF); })); ++ [&xRet, this, xMSF]() { xRet = this->createFilePicker(xMSF); }); + assert(xRet); + return xRet; } From 7c1e7d19de97820e29c35d66ac593e597165a6c6b5344e2af5ee3849f1716ee3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Chv=C3=A1tal?= Date: Fri, 15 Mar 2019 11:48:40 +0000 Subject: [PATCH 3/7] OBS-URL: https://build.opensuse.org/package/show/LibreOffice:Factory/libreoffice?expand=0&rev=771 --- kde5.patch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kde5.patch b/kde5.patch index f58fa7e..7294a85 100644 --- a/kde5.patch +++ b/kde5.patch @@ -308,9 +308,9 @@ Index: libreoffice-6.2.2.1/vcl/unx/kde5/KDE5SalInstance.cxx - } - return new KDE5SalFrame(static_cast(pParent), nState, true); + SalFrame* pRet(nullptr); -+ RunInMainThread(std::function([&pRet, pParent, nState]() { ++ RunInMainThread([&pRet, pParent, nState]() { + pRet = new KDE5SalFrame(static_cast(pParent), nState, true); -+ })); ++ }); + assert(pRet); + return pRet; } From 4683ad5d2ee50d47abf50ae508844dce664833c4b6d0981879788bb296e90014 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Chv=C3=A1tal?= Date: Fri, 15 Mar 2019 15:06:43 +0000 Subject: [PATCH 4/7] - Add patch to fix build with old icu from Leap 42: * old-icu.patch OBS-URL: https://build.opensuse.org/package/show/LibreOffice:Factory/libreoffice?expand=0&rev=772 --- libreoffice.changes | 6 ++++++ libreoffice.spec | 2 ++ old-icu.patch | 24 ++++++++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 old-icu.patch diff --git a/libreoffice.changes b/libreoffice.changes index 88f2188..ea43edc 100644 --- a/libreoffice.changes +++ b/libreoffice.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Fri Mar 15 15:05:42 UTC 2019 - Tomáš Chvátal + +- Add patch to fix build with old icu from Leap 42: + * old-icu.patch + ------------------------------------------------------------------- Thu Mar 14 14:44:58 UTC 2019 - Tomáš Chvátal diff --git a/libreoffice.spec b/libreoffice.spec index 58142f9..d3c1dde 100644 --- a/libreoffice.spec +++ b/libreoffice.spec @@ -104,6 +104,7 @@ Patch7: libreoffice-postgresql.patch Patch8: 0001-Fix-LTO-segfault-in-libtest_sw_uwriter-test.patch Patch9: boost_169.patch Patch10: kde5.patch +Patch11: old-icu.patch # try to save space by using hardlinks Patch990: install-with-hardlinks.diff # save time by relying on rpm check rather than doing stupid find+grep @@ -971,6 +972,7 @@ Provides %{langname} translations and additional resources (help files, etc.) fo %patch8 -p1 %patch9 -p1 %patch10 -p1 +%patch11 -p1 %patch990 -p1 %patch991 -p1 diff --git a/old-icu.patch b/old-icu.patch new file mode 100644 index 0000000..bda0a0f --- /dev/null +++ b/old-icu.patch @@ -0,0 +1,24 @@ +diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx +index 75fd8f82b874..caf84853071e 100644 +--- a/sc/source/core/tool/interpr1.cxx ++++ b/sc/source/core/tool/interpr1.cxx +@@ -9408,7 +9408,8 @@ void ScInterpreter::ScRegex() + { + // Find n-th occurrence. + sal_Int32 nCount = 0; +- while (aRegexMatcher.find( status) && U_SUCCESS(status) && ++nCount < nOccurrence) ++ int32_t nStartPos = 0; ++ while (aRegexMatcher.find(nStartPos, status) && U_SUCCESS(status) && ++nCount < nOccurrence) + ; + if (U_FAILURE(status)) + { +@@ -9448,7 +9449,8 @@ void ScInterpreter::ScRegex() + { + // Replace n-th occurrence of match with replacement. + sal_Int32 nCount = 0; +- while (aRegexMatcher.find( status) && U_SUCCESS(status)) ++ int32_t nStartPos = 0; ++ while (aRegexMatcher.find(nStartPos, status) && U_SUCCESS(status)) + { + // XXX NOTE: After several RegexMatcher::find() the + // RegexMatcher::appendReplacement() still starts at the From 271627681fc0b55b205955c519baa724868eb84a63c600c76a431aa081fd91ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Chv=C3=A1tal?= Date: Mon, 18 Mar 2019 12:30:37 +0000 Subject: [PATCH 5/7] - Update to 6.2.2.2: * Few more tweaks over previous RC1 OBS-URL: https://build.opensuse.org/package/show/LibreOffice:Factory/libreoffice?expand=0&rev=773 --- libreoffice-6.2.2.1.tar.xz | 3 --- libreoffice-6.2.2.1.tar.xz.asc | 16 ---------------- libreoffice-6.2.2.2.tar.xz | 3 +++ libreoffice-6.2.2.2.tar.xz.asc | 16 ++++++++++++++++ libreoffice-help-6.2.2.1.tar.xz | 3 --- libreoffice-help-6.2.2.1.tar.xz.asc | 16 ---------------- libreoffice-help-6.2.2.2.tar.xz | 3 +++ libreoffice-help-6.2.2.2.tar.xz.asc | 16 ++++++++++++++++ libreoffice-translations-6.2.2.1.tar.xz | 3 --- libreoffice-translations-6.2.2.1.tar.xz.asc | 16 ---------------- libreoffice-translations-6.2.2.2.tar.xz | 3 +++ libreoffice-translations-6.2.2.2.tar.xz.asc | 16 ++++++++++++++++ libreoffice.changes | 6 ++++++ libreoffice.spec | 2 +- 14 files changed, 64 insertions(+), 58 deletions(-) delete mode 100644 libreoffice-6.2.2.1.tar.xz delete mode 100644 libreoffice-6.2.2.1.tar.xz.asc create mode 100644 libreoffice-6.2.2.2.tar.xz create mode 100644 libreoffice-6.2.2.2.tar.xz.asc delete mode 100644 libreoffice-help-6.2.2.1.tar.xz delete mode 100644 libreoffice-help-6.2.2.1.tar.xz.asc create mode 100644 libreoffice-help-6.2.2.2.tar.xz create mode 100644 libreoffice-help-6.2.2.2.tar.xz.asc delete mode 100644 libreoffice-translations-6.2.2.1.tar.xz delete mode 100644 libreoffice-translations-6.2.2.1.tar.xz.asc create mode 100644 libreoffice-translations-6.2.2.2.tar.xz create mode 100644 libreoffice-translations-6.2.2.2.tar.xz.asc diff --git a/libreoffice-6.2.2.1.tar.xz b/libreoffice-6.2.2.1.tar.xz deleted file mode 100644 index 48c1028..0000000 --- a/libreoffice-6.2.2.1.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f1dede48c4891019126fb7e3cf0d36a7fa422730435ff64b4127c727973371cd -size 214021928 diff --git a/libreoffice-6.2.2.1.tar.xz.asc b/libreoffice-6.2.2.1.tar.xz.asc deleted file mode 100644 index 818480e..0000000 --- a/libreoffice-6.2.2.1.tar.xz.asc +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQIzBAABCAAdFiEEwoOeytlAj76VMcPp9DSh76/urqMFAlx9T/EACgkQ9DSh76/u -rqN8vQ/9HbmIliP9MIgM5DmATLJdxXktJAC4T6Qlv2THWVbPMPIVqAeHavfU6joH -iH2SB1/yGeRAzphHKfoI4yCRISz23erBOkybH18B49AeVu6vJ2egyId4JeuvUMNn -5J4dmBJ231Yrm1DX9fIgD0fNrpyumr2weJIp8DTzfUZO4fN7EAn6le7hUule5iRg -MAp5OBhECcyQ5KLQsA338Iw2QUGYUOXER6g3xZm9UzRMXZOXyym8pBbRdOvh+Yhx -+7t2IVGHzH0vX9JC8ncvUQZ+z6fltba6Pvh2wFE5C79uYT6OJvjUhALV1QYa3FF+ -2d5JyQNamWCAvnYn6rr1/v4o3aq72M/ByJWodNtdjhaQpZ3F16K42yLf+vFO8z0+ -/BjBCpsWMkALPtOTa85JM3JnqR5SkLUaovxE5hHxpE52B8C0B14v3wDmTqPvPmj9 -UXsoyvddLypmObm+ejb5uoz+4ofwJGUU68MYN6SNObQykAjhcJrqKWCN7yOmh6Iw -ieE+RmxxhherDF3TpyTvmcohUBMjQrljs9P/bRa5fCH8girOFY6Qom4RUMxeoiua -IO6GlMSfL7vFqly/9AHTFCde4jja4SF+mMB8BFYTyzWu4LSI364fPyzSWH9H3dgN -z/TQWTkn7cVrALsNyx799Hy6EJvB1fBljlEE2RHZEsDg4ghGcb0= -=VUTs ------END PGP SIGNATURE----- diff --git a/libreoffice-6.2.2.2.tar.xz b/libreoffice-6.2.2.2.tar.xz new file mode 100644 index 0000000..71123eb --- /dev/null +++ b/libreoffice-6.2.2.2.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b83ad3a8aa7bebf34db9e984d518a8f2248ed685e04be8373cfa87bb04e31f69 +size 214029032 diff --git a/libreoffice-6.2.2.2.tar.xz.asc b/libreoffice-6.2.2.2.tar.xz.asc new file mode 100644 index 0000000..b4e52f0 --- /dev/null +++ b/libreoffice-6.2.2.2.tar.xz.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIzBAABCAAdFiEEwoOeytlAj76VMcPp9DSh76/urqMFAlyMCLQACgkQ9DSh76/u +rqPa6w//fQXFAkUgOqDprN/wO07NIpDj5o3dONHdUk1o7cVZ9jV9SDxaKJ/+CDdW ++d7e5fkVZXo6JRul3sG9ovszpF7D09Af8C4RKGaarEj0oK4TurKaW58J+0jnOGRG +IRZITZwN68hSu1pwINOso6aSctCd6RYEkUZjb7ZA25c00kQpNhFr/pIDl2hG6tm6 +V9KH/j1Cc/gYEWKt8cag8ByVCeUwNfFRhjvmBS6f2ms26D/mMVMypKyI2UcgMZE3 +kcd5Q0C5JIf9AQhzWrPTrFoZq5CH9Axlfb9r5EFhj1vt0aw0gqQmNXfi/iZIPbyC +KrGh8GRiJmu0aOinEF1TXDuzBX9VX93yBUCcxF1vEniF+esGeq+Mqb5rPyvD047e +uK67/GEnG86j2ewDJHgHr/rteQCP09kbkICHQwKuEmc+hi8H2GBVB0YihFETBh3l +WXHnPVMGDcihrXGiggaGVXFv7Br4SFZCia9C3Hj1RNBD4HO4VXnhCJgXuC2HFga8 +oetINLa2WqKl6MJEfp0lIsjSBn9byv9VlodaQRy103tm3OGKviKsrlfqqYl2vFUn +cVEWyHZx2nLOPS6kjnlf0OtxZnqhyh0VeojDOAcpv+hbV84BprGEcyrx3OWGnMfg +yXdvHTBWhSJUDOXM0vxirrZTI4JgrcPJOzWJZCYJXCyyNqMKdB8= +=uRnL +-----END PGP SIGNATURE----- diff --git a/libreoffice-help-6.2.2.1.tar.xz b/libreoffice-help-6.2.2.1.tar.xz deleted file mode 100644 index 310ab54..0000000 --- a/libreoffice-help-6.2.2.1.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:46a4d2d21014ee1bad72caeca0df32214fba3731713d4b64205b48cded1e280c -size 15267328 diff --git a/libreoffice-help-6.2.2.1.tar.xz.asc b/libreoffice-help-6.2.2.1.tar.xz.asc deleted file mode 100644 index a350551..0000000 --- a/libreoffice-help-6.2.2.1.tar.xz.asc +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQIzBAABCAAdFiEEwoOeytlAj76VMcPp9DSh76/urqMFAlx9T/kACgkQ9DSh76/u -rqNaUA//aWKi8+1X51ewDsnUKE9KGloHysfZx0IePISHllW1SgzVC943kotknPRR -2a3RX6QtGO6NTmKIAS3BVq+PZwZxejahpxm+Huk/Mt5qO1dR/H/xa1eaop1npmty -c8EZnJuWF/G064vKCTpOVOvmUlMsRC7hxKNGnU45lTsyTZt5qIGmKk3XCe3XX/xG -IGiBTErVSn3hNOaq4id8apkynTzSq3Lo/qtZAJcZAZNosJ1OSX6XwXrlghssT1Uf -/uddMkZusUi2Mt7YRgdLf6yt0YxfW5vw7Mais1obp9e/iQdKPamh2soPzFv2TDb4 -zwPA2cHAh7m6L9mM5U1h4Y/xGjJ5dIqpA/2MQXcg7UnHfuwmZLW3sEadjCoV2t4i -oURwC49E07dGb5dC47reW4OpKEg2habYed1rXZUZFKGy+iGsTXhqLUe17C0I8NIx -/kYhnj7IjGltW8MoV15sc9vv2OS6iOgxnuV5HLth5+2qm2r+25WGr+yDHQ2HsHUa -k6kVa2ZxEXJRCV3cZ3iLHSIjYhb6/LmhCXRFBFSR+c/lJiy/qPkIiUtabIxa4LIN -324y5MIx/CKAZaMtjrVbwjhCG7LRFt3uaG0cyvYlOYO7EiXTJzajYuRYqUsvE1v1 -Eg36lggFLwz/Ka9+R2wP6rZ+2ThZf1ENNrm73WMd8yWwFK0bqRM= -=VNac ------END PGP SIGNATURE----- diff --git a/libreoffice-help-6.2.2.2.tar.xz b/libreoffice-help-6.2.2.2.tar.xz new file mode 100644 index 0000000..5f441e5 --- /dev/null +++ b/libreoffice-help-6.2.2.2.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:619f92db787dc8cb4aa81f203b3eefbd02a4affd382bf8d1b9268c846d360d92 +size 15267780 diff --git a/libreoffice-help-6.2.2.2.tar.xz.asc b/libreoffice-help-6.2.2.2.tar.xz.asc new file mode 100644 index 0000000..7b129a9 --- /dev/null +++ b/libreoffice-help-6.2.2.2.tar.xz.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIzBAABCAAdFiEEwoOeytlAj76VMcPp9DSh76/urqMFAlyMCLgACgkQ9DSh76/u +rqOx1Q/9EEm+O4ly/+Sf79Hmhgi4nD3OmZOpN9s+Z0zxbEq/7P9UtBxQiD21yqwW +XQN0w77dJwFflVVF8yb2rvsdfs9LFs4XzbnSEMmlCNq3OAKYazRbK9XYz2pnazB6 +mEHi3mE0z2jdvbbO9xbRjrIc90bg3T2dEFKX27FjpL19JpSQDpEILJyi9VHqyupJ +GsQnIdPK8Z9bKX6tcftu4ldh1601UNoRBNprj/0Ay+j4XPpYoWhdDaOA9sI+CP6L +irWZTCObulzrFObpkCzZm/fx9qegGLZ1f/X9B64aBDGPPOACc3smmjhAFSwpOsvT +JrvHb46Xgd3gM4fs64uZ/BOSkw5NCEM/kRZoCTrwVMezi4np/0mZEeN0wYa+jJaH +n+fWYiraAHibnIfvypWveUyXYRkeUaqJfthg7ajewbfvA4e4Fsx5TMgIz9/WQafm +NlznBHAoCWo8jXrub1RDk32zU1ubLnroZxFvdDmGZZSNIuom9wIc2pv/YAsc6ISC +EnwRMu8WEyQWu4yKNcLQaVqZnTX+6Xks7aCmEUBy4uLRiAOMPK2kzPeJsq68Jwpp +7yuZoi8GbpQo08Y8yQ6V5MdjSFwjSK9Vv1SiOONF/MFxNqYrVRQEQwgfs0Mk2aem +goVHu6jGvNV+Z3RTbCsTS/7mqrJUKlZPXzwr75BFrUcZ7894W24= +=2T6D +-----END PGP SIGNATURE----- diff --git a/libreoffice-translations-6.2.2.1.tar.xz b/libreoffice-translations-6.2.2.1.tar.xz deleted file mode 100644 index 1d2f008..0000000 --- a/libreoffice-translations-6.2.2.1.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:106c66c26d049c99ae4d1b266bce9866ccae6da33412729751bd056726eb0355 -size 141855216 diff --git a/libreoffice-translations-6.2.2.1.tar.xz.asc b/libreoffice-translations-6.2.2.1.tar.xz.asc deleted file mode 100644 index 7c04e43..0000000 --- a/libreoffice-translations-6.2.2.1.tar.xz.asc +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQIzBAABCAAdFiEEwoOeytlAj76VMcPp9DSh76/urqMFAlx9T/oACgkQ9DSh76/u -rqNvhw/6AtxBjHPtWRmbi8phmYjAD0qVPEklRD6HDNG6gEoyGDpck1u4I3MU4Qd5 -tKABcVxsAITKkPik87Uwo4uItCGVbgIxAhxYWslyJQgp8Uz0TiJNOJMZthdZjrXw -P5kokF45ZW6CiGUbvru5JqDVvgfnCzB5y6lmiuwbTfasTmJt+nhzbNYJPP1fAR6z -0epeaaKx9RcaRLtGH6q7fIb3zTSR2d24mA6uxj/JrGCRBSkd03Jh6B05jNxw92s/ -EY4fClrUpxCvflb+HLd9+LVD6MdeMocNQ3tCHvEZwkMg6TNM6bAurmLi25aVPRwg -uX1G6UI+7F9pgv7km/gnDfbcchBKehZpKkU9Z1J4cCf2bxpidvlDEbZYlulZZU+F -n5AJXxe8lfta2Yo5yd53pPZCoKTs6B4V60A3tqPOw5vUBFGC3kKgvtBO6r3w90jy -nwM2w0PpFxBUEBYxk1+nURZbDzvWFKD71fycrWOEl3fzcQQHe8iOUS+e0pHsHIdT -VKTGeX1dDZfURaSaEhvoJIhyeegBZVN6LzJJ2a2F1m5E1rNgNL0Co+RjSoNx238p -7wx7EXAtP380s4s4NL/bxScwxsNoVuBaenwB1um6HPa9LcPN2NNUyGfq7wEmXZuR -eiexSGA9wp7K7XppV2KQ7sdMWey8Fpg6XMmbxwQrldQ4gM4qlvk= -=EdQS ------END PGP SIGNATURE----- diff --git a/libreoffice-translations-6.2.2.2.tar.xz b/libreoffice-translations-6.2.2.2.tar.xz new file mode 100644 index 0000000..d61d407 --- /dev/null +++ b/libreoffice-translations-6.2.2.2.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37e86f2675003a43379658ca5ad65e9093df5353dc0e6dc0a2d34450dbab1745 +size 141946920 diff --git a/libreoffice-translations-6.2.2.2.tar.xz.asc b/libreoffice-translations-6.2.2.2.tar.xz.asc new file mode 100644 index 0000000..018e7e2 --- /dev/null +++ b/libreoffice-translations-6.2.2.2.tar.xz.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIzBAABCAAdFiEEwoOeytlAj76VMcPp9DSh76/urqMFAlyMCLgACgkQ9DSh76/u +rqPn+g/+PpdUeW8Mx8/whNCsIt04ONGc1/e+3506krbFJmd38a4n/MoHQuljQjID +tWODxMjXp7perwaR6wGVzHEkRv8YXZq7CiSwhuxa+e+dwWunkc99/4ICHLXMdkaR +uDgDQRHaoT6bYpU1vkzXglrJl+Vs+N+LBJQq7kjNbHztzb1MJkOkn6EmJKutUaQP +ijDpRAnrJ2G8HpcPQjgSCyzBdJ54whm7FGCTasaTk/RtKIweFiopBZQ9l8gJIFyg +yivdEG1VugAIwVBZy9OtWy9vuIF47BfIa02OmnHkq3P5ZQa24OFrAf9N+JohnPwN +zV5DfHxluBi3BRsS/UtVgQPk+LCmnfCdscM+XULHcJUAXUey8C6oKPltgNRq6kcK +V10rm7npmUpDkM16RQ7JN/PbSMnDBPXp5ImE3wCgRLbZJk2uzR/+1hZ5UO9BeZnK +EQVWWLXx1Tf2d8oRyRIl5DJ4ncOATOW+R0e04qYtgI2ckiYACNnkUteRzsaKIcgn +d7U/hAlUpXmwCad4uZMfUF4xSd0iiql/YBxLkfEh2WB46cDmX96qU4FQV0htBHbi +VfQX2nNLWUxgv58Gi15VUlzMj3JDQWfr5TzgMgc9wQtg5MhhyMu0uhsPSGjxKmbV +88J95raPPqRXXL+OBVHRakoQUOSwoh+49aMpstCn7rLfcXEvTO0= +=OAxv +-----END PGP SIGNATURE----- diff --git a/libreoffice.changes b/libreoffice.changes index ea43edc..06220ce 100644 --- a/libreoffice.changes +++ b/libreoffice.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Mon Mar 18 12:27:36 UTC 2019 - Tomáš Chvátal + +- Update to 6.2.2.2: + * Few more tweaks over previous RC1 + ------------------------------------------------------------------- Fri Mar 15 15:05:42 UTC 2019 - Tomáš Chvátal diff --git a/libreoffice.spec b/libreoffice.spec index d3c1dde..335ce5b 100644 --- a/libreoffice.spec +++ b/libreoffice.spec @@ -52,7 +52,7 @@ %bcond_with gtk3 %endif Name: libreoffice -Version: 6.2.2.1 +Version: 6.2.2.2 Release: 0 Summary: A Free Office Suite (Framework) License: LGPL-3.0-or-later AND MPL-2.0+ From 36ba140ae27711b1c3099fd838cde33f1299510eac316815b5d974488db1621e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Chv=C3=A1tal?= Date: Wed, 20 Mar 2019 11:00:29 +0000 Subject: [PATCH 6/7] Accepting request 686905 from home:adamm:branches:LibreOffice:Factory - old-boost.patch: update patch to fix build with Boost from SLE-12 OBS-URL: https://build.opensuse.org/request/show/686905 OBS-URL: https://build.opensuse.org/package/show/LibreOffice:Factory/libreoffice?expand=0&rev=774 --- libreoffice.changes | 5 +++++ old-boost.patch | 49 ++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/libreoffice.changes b/libreoffice.changes index 06220ce..0f31057 100644 --- a/libreoffice.changes +++ b/libreoffice.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Mon Mar 19 10:44:31 UTC 2019 - Adam Majer + +- old-boost.patch: update patch to fix build with Boost from SLE-12 + ------------------------------------------------------------------- Mon Mar 18 12:27:36 UTC 2019 - Tomáš Chvátal diff --git a/old-boost.patch b/old-boost.patch index 601788a..c3beefb 100644 --- a/old-boost.patch +++ b/old-boost.patch @@ -1,7 +1,7 @@ -Index: libreoffice-6.1.0.0.beta2/vcl/unx/gtk3_kde5/gtk3_kde5_filepicker_ipc.cxx +Index: libreoffice-6.2.2.1/vcl/unx/gtk3_kde5/gtk3_kde5_filepicker_ipc.cxx =================================================================== ---- libreoffice-6.1.0.0.beta2.orig/vcl/unx/gtk3_kde5/gtk3_kde5_filepicker_ipc.cxx -+++ libreoffice-6.1.0.0.beta2/vcl/unx/gtk3_kde5/gtk3_kde5_filepicker_ipc.cxx +--- libreoffice-6.2.2.1.orig/vcl/unx/gtk3_kde5/gtk3_kde5_filepicker_ipc.cxx ++++ libreoffice-6.2.2.1/vcl/unx/gtk3_kde5/gtk3_kde5_filepicker_ipc.cxx @@ -58,7 +58,7 @@ OUString applicationDirPath() const auto utf8Path = applicationSystemPath.toUtf8(); auto ret = boost::filesystem::path(utf8Path.getStr(), utf8Path.getStr() + utf8Path.getLength()); @@ -11,3 +11,46 @@ Index: libreoffice-6.1.0.0.beta2/vcl/unx/gtk3_kde5/gtk3_kde5_filepicker_ipc.cxx } OUString findPickerExecutable() +Index: libreoffice-6.2.2.1/sw/source/core/crsr/findtxt.cxx +=================================================================== +--- libreoffice-6.2.2.1.orig/sw/source/core/crsr/findtxt.cxx ++++ libreoffice-6.2.2.1/sw/source/core/crsr/findtxt.cxx +@@ -152,7 +152,11 @@ public: + { + if (pFrame) + { ++#if BOOST_VERSION < 105600 ++ m_oMergedIter.reset(*pFrame); ++#else + m_oMergedIter.emplace(*pFrame); ++#endif + } + } + +Index: libreoffice-6.2.2.1/sw/source/core/inc/txtfrm.hxx +=================================================================== +--- libreoffice-6.2.2.1.orig/sw/source/core/inc/txtfrm.hxx ++++ libreoffice-6.2.2.1/sw/source/core/inc/txtfrm.hxx +@@ -24,6 +24,8 @@ + #include + #include "TextFrameIndex.hxx" + ++#include ++ + namespace com { namespace sun { namespace star { namespace linguistic2 { class XHyphenatedWord; } } } } + + namespace sw { namespace mark { class IMark; } } +@@ -980,8 +982,13 @@ struct MergedPara + class MergedAttrIterBase + { + protected: ++#if BOOST_VERSION < 105600 ++ sw::MergedPara const* m_pMerged; ++ SwTextNode const* m_pNode; ++#else + sw::MergedPara const*const m_pMerged; + SwTextNode const*const m_pNode; ++#endif + size_t m_CurrentExtent; + size_t m_CurrentHint; + MergedAttrIterBase(SwTextFrame const& rFrame); From bfba39e33a2879e4f85eed869f17b7703608d4d61809ea24356ff322b8843b43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Chv=C3=A1tal?= Date: Fri, 22 Mar 2019 10:52:56 +0000 Subject: [PATCH 7/7] - Update the old-icu.patch based on the upstream feedback OBS-URL: https://build.opensuse.org/package/show/LibreOffice:Factory/libreoffice?expand=0&rev=775 --- libreoffice.changes | 5 +++++ old-icu.patch | 31 ++++++++++++++++++++++++++++--- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/libreoffice.changes b/libreoffice.changes index 0f31057..ef128b3 100644 --- a/libreoffice.changes +++ b/libreoffice.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Fri Mar 22 10:52:26 UTC 2019 - Tomáš Chvátal + +- Update the old-icu.patch based on the upstream feedback + ------------------------------------------------------------------- Mon Mar 19 10:44:31 UTC 2019 - Adam Majer diff --git a/old-icu.patch b/old-icu.patch index bda0a0f..0bb1d6b 100644 --- a/old-icu.patch +++ b/old-icu.patch @@ -1,24 +1,49 @@ +From 8e264d64093e11fbabdd13e0f86bec8b7c989796 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Chv=C3=A1tal?= +Date: Fri, 15 Mar 2019 16:43:31 +0100 +Subject: [PATCH] Use RegexMatcher.find(pos, status) call on old ICU + +The RegexMatcher.find(status) is new since icu 55 and this works even +on the old releases thus revert there to the available albeit slower +call. + +Change-Id: I964c10efd15515b04ac9037cda3b5b309910baf5 +--- + sc/source/core/tool/interpr1.cxx | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx -index 75fd8f82b874..caf84853071e 100644 +index 75fd8f82b874..0281ab3f4cbf 100644 --- a/sc/source/core/tool/interpr1.cxx +++ b/sc/source/core/tool/interpr1.cxx -@@ -9408,7 +9408,8 @@ void ScInterpreter::ScRegex() +@@ -9408,7 +9408,12 @@ void ScInterpreter::ScRegex() { // Find n-th occurrence. sal_Int32 nCount = 0; - while (aRegexMatcher.find( status) && U_SUCCESS(status) && ++nCount < nOccurrence) ++#if (U_ICU_VERSION_MAJOR_NUM < 55) + int32_t nStartPos = 0; + while (aRegexMatcher.find(nStartPos, status) && U_SUCCESS(status) && ++nCount < nOccurrence) ++#else ++ while (aRegexMatcher.find(status) && U_SUCCESS(status) && ++nCount < nOccurrence) ++#endif ; if (U_FAILURE(status)) { -@@ -9448,7 +9449,8 @@ void ScInterpreter::ScRegex() +@@ -9448,7 +9453,12 @@ void ScInterpreter::ScRegex() { // Replace n-th occurrence of match with replacement. sal_Int32 nCount = 0; - while (aRegexMatcher.find( status) && U_SUCCESS(status)) ++#if (U_ICU_VERSION_MAJOR_NUM < 55) + int32_t nStartPos = 0; + while (aRegexMatcher.find(nStartPos, status) && U_SUCCESS(status)) ++#else ++ while (aRegexMatcher.find(status) && U_SUCCESS(status)) ++#endif { // XXX NOTE: After several RegexMatcher::find() the // RegexMatcher::appendReplacement() still starts at the +-- +2.21.0 +