From c38ab26a426e3e8835757091eeefe2f8f3437959 Mon Sep 17 00:00:00 2001 From: chrip Date: Wed, 29 Oct 2025 14:13:04 +0100 Subject: [PATCH 1/2] Fix #7009: Remove leftover .msi and msi.log after update Ensure leftover installer and msi.log are removed after external manual or internal updates. Improve logging on delete/copy failures. Fixes #7009. Signed-off-by: chrip --- src/gui/updater/ocupdater.cpp | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/gui/updater/ocupdater.cpp b/src/gui/updater/ocupdater.cpp index 4d43357fa80c0..2a1e2c9ec8717 100644 --- a/src/gui/updater/ocupdater.cpp +++ b/src/gui/updater/ocupdater.cpp @@ -304,8 +304,21 @@ void NSISUpdater::wipeUpdateData() ConfigFile cfg; QSettings settings(cfg.configFile(), QSettings::IniFormat); QString updateFileName = settings.value(updateAvailableC).toString(); - if (!updateFileName.isEmpty()) - QFile::remove(updateFileName); + if (!updateFileName.isEmpty()) { + if (QFile::remove(updateFileName)) { + qCInfo(lcUpdater) << "Removed updater file:" << updateFileName; + } else { + qCWarning(lcUpdater) << "Failed to remove updater file:" << updateFileName; + } + } + // Also try to remove the msi log file (created when running msiexec) + QString msiLogFileName = cfg.configPath() + "msi.log"; + if (QFile::remove(msiLogFileName)) { + qCInfo(lcUpdater) << "Removed msi log file:" << msiLogFileName; + } else { + qCWarning(lcUpdater) << "Failed to remove msi log file:" << msiLogFileName; + } + settings.remove(updateAvailableC); settings.remove(updateTargetVersionC); settings.remove(updateTargetVersionStringC); @@ -522,6 +535,13 @@ bool NSISUpdater::handleStartup() return false; } } else { + // No internal updater was executed (possible manual install). + // If the app has already been upgraded externally, clean up leftover msi and log files. + if (updateSucceeded()) { + qCInfo(lcUpdater) << "Detected externally installed update - cleaning leftover msi and log files."; + wipeUpdateData(); + return false; + } qCInfo(lcUpdater) << "Triggering an update"; return performUpdate(); } From 819c7fd6ea59ef41678e6f0e0ae29a1ea77ba5e5 Mon Sep 17 00:00:00 2001 From: chrip Date: Wed, 5 Nov 2025 13:01:04 +0100 Subject: [PATCH 2/2] Use constant for msi log filename (msi.log) Signed-off-by: chrip --- src/gui/updater/ocupdater.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/gui/updater/ocupdater.cpp b/src/gui/updater/ocupdater.cpp index 2a1e2c9ec8717..6feb09e074871 100644 --- a/src/gui/updater/ocupdater.cpp +++ b/src/gui/updater/ocupdater.cpp @@ -26,6 +26,7 @@ const auto updateAvailableC = QStringLiteral("Updater/updateAvailable"); const auto updateTargetVersionC = QStringLiteral("Updater/updateTargetVersion"); const auto updateTargetVersionStringC = QStringLiteral("Updater/updateTargetVersionString"); const auto autoUpdateAttemptedC = QStringLiteral("Updater/autoUpdateAttempted"); +const auto msiLogFileNameC = QStringLiteral("msi.log"); } UpdaterScheduler::UpdaterScheduler(QObject *parent) @@ -219,7 +220,7 @@ void OCUpdater::slotStartInstaller() return QDir::toNativeSeparators(path); }; - QString msiLogFile = cfg.configPath() + "msi.log"; + QString msiLogFile = cfg.configPath() + msiLogFileNameC; QString command = QStringLiteral("&{msiexec /i '%1' /L*V '%2'| Out-Null ; &'%3'}") .arg(preparePathForPowershell(updateFile)) .arg(preparePathForPowershell(msiLogFile)) @@ -312,7 +313,7 @@ void NSISUpdater::wipeUpdateData() } } // Also try to remove the msi log file (created when running msiexec) - QString msiLogFileName = cfg.configPath() + "msi.log"; + QString msiLogFileName = cfg.configPath() + msiLogFileNameC; if (QFile::remove(msiLogFileName)) { qCInfo(lcUpdater) << "Removed msi log file:" << msiLogFileName; } else {