From c5a8076439d48ed4575306e73ad401b6e0575012 Mon Sep 17 00:00:00 2001 From: Arttu Tarkiainen Date: Fri, 14 Jan 2022 13:38:51 +0200 Subject: Fix hard restart of maintenance tool This was only working when a component containing maintenance tool replacement was updated. For other 'Essential' and 'ForcedUpdate' components nothing happened after clicking the restart button. Task-number: QTIFW-2381 Change-Id: Ie59315b1d7e123af7169dff267ee2e1a4cf6b470 Reviewed-by: Katja Marttila --- src/libs/installer/packagemanagercore_p.cpp | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) (limited to 'src/libs/installer/packagemanagercore_p.cpp') diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp index 18736e587..08e382e7d 100644 --- a/src/libs/installer/packagemanagercore_p.cpp +++ b/src/libs/installer/packagemanagercore_p.cpp @@ -1495,14 +1495,19 @@ void PackageManagerCorePrivate::writeMaintenanceTool(OperationList performedOper if (m_core->isInstaller()) registerMaintenanceTool(); writeMaintenanceConfigFiles(); - deferredRename(dataFile + QLatin1String(".new"), dataFile, false); - if (newBinaryWritten) { - const bool restart = replacementExists && isUpdater() && (!statusCanceledOrFailed()) && m_needsHardRestart; + QFile::remove(dataFile); + QFile::rename(dataFile + QLatin1String(".new"), dataFile); + + const bool restart = !statusCanceledOrFailed() && m_needsHardRestart; + qCDebug(QInstaller::lcInstallerInstallLog) << "Maintenance tool hard restart:" + << (restart ? "true." : "false."); + + if (newBinaryWritten) deferredRename(maintenanceToolName() + QLatin1String(".new"), maintenanceToolName(), restart); - qCDebug(QInstaller::lcInstallerInstallLog) << "Maintenance tool restart:" - << (restart ? "true." : "false."); - } + else if (restart) + SelfRestarter::setRestartOnQuit(true); + } catch (const Error &err) { setStatus(PackageManagerCore::Failure); if (gainedAdminRights) @@ -2222,9 +2227,11 @@ void PackageManagerCorePrivate::installComponent(Component *component, double pr if (!ok && !ignoreError) throw Error(operation->errorString()); - if (((component->value(scEssential, scFalse) == scTrue) || (component->value(scForcedUpdate, scFalse) == scTrue)) - && !m_core->isCommandLineInstance()) { - m_needsHardRestart = true; + if (!m_core->isCommandLineInstance()) { + if ((component->value(scEssential, scFalse) == scTrue) && !isInstaller()) + m_needsHardRestart = true; + else if ((component->value(scForcedUpdate, scFalse) == scTrue) && isUpdater()) + m_needsHardRestart = true; } } -- cgit v1.2.3