diff options
author | Katja Marttila <katja.marttila@qt.io> | 2017-05-08 11:58:08 +0300 |
---|---|---|
committer | Katja Marttila <katja.marttila@qt.io> | 2017-05-10 06:00:10 +0000 |
commit | bb671cba0a2ffcb0f165d373a51b76a57a7dfacc (patch) | |
tree | 8ff894df74683b833b8df5421b447637ce3781cf /src | |
parent | a1694a8ea3e34df7d06cb36275200f08ec54ce59 (diff) |
Fix install corrupt with silentInstall
If there are updates available for a component that is executable and the
executable is running, installer is unable to update the component and
results to a corrupted install. Check that there are no processes running
from the install tree and cancel update if there are any. The update is
canceled if there are processes running even if the process does not get
update.
Task-number: QTIFW-969
Change-Id: I5614cdd21d8538ccf8b0d114d3616804fe367667
Reviewed-by: Iikka Eklund <iikka.eklund@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/libs/installer/packagemanagercore.cpp | 15 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore_p.cpp | 22 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore_p.h | 2 |
3 files changed, 39 insertions, 0 deletions
diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp index 72e2ec928..c4ba5ae4a 100644 --- a/src/libs/installer/packagemanagercore.cpp +++ b/src/libs/installer/packagemanagercore.cpp @@ -1799,7 +1799,22 @@ ComponentModel *PackageManagerCore::updaterComponentModel() const void PackageManagerCore::updateComponentsSilently() { + //Check if there are processes running in the install + QStringList excludeFiles; + excludeFiles.append(maintenanceToolName()); + + QStringList runningProcesses = d->runningInstallerProcesses(excludeFiles); + if (!runningProcesses.isEmpty()) { + qDebug() << "Unable to update components. Please stop these processes: " + << runningProcesses << " and try again."; + return; + } + autoAcceptMessageBoxes(); + + //Prevent infinite loop if installation for some reason fails. + setMessageBoxAutomaticAnswer(QLatin1String("installationErrorWithRetry"), QMessageBox::Cancel); + fetchRemotePackagesTree(); //Mark all components to be installed const QList<QInstaller::Component*> componentList = components( diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp index 5fa2b0515..ef5dd3d48 100644 --- a/src/libs/installer/packagemanagercore_p.cpp +++ b/src/libs/installer/packagemanagercore_p.cpp @@ -2421,4 +2421,26 @@ void PackageManagerCorePrivate::processFilesForDelayedDeletion() } } +void PackageManagerCorePrivate::findExecutablesRecursive(const QString &path, const QStringList &excludeFiles, QStringList *result) +{ + QString executable; + QDirIterator it(path, QDir::NoDotAndDotDot | QDir::Executable | QDir::Files | QDir::System, QDirIterator::Subdirectories ); + + while (it.hasNext()) { + executable = it.next(); + foreach (QString exclude, excludeFiles) { + if (executable.compare(exclude, Qt::CaseInsensitive) != 0) + result->append(executable); + } + } +} + +QStringList PackageManagerCorePrivate::runningInstallerProcesses(const QStringList &excludeFiles) +{ + QStringList resultFiles; + findExecutablesRecursive(QCoreApplication::applicationDirPath(), excludeFiles, &resultFiles); + return checkRunningProcessesFromList(resultFiles); +} + + } // namespace QInstaller diff --git a/src/libs/installer/packagemanagercore_p.h b/src/libs/installer/packagemanagercore_p.h index 7ba081539..4dd0b9735 100644 --- a/src/libs/installer/packagemanagercore_p.h +++ b/src/libs/installer/packagemanagercore_p.h @@ -230,6 +230,8 @@ private: bool fetchMetaInformationFromCompressedRepositories(); bool addUpdateResourcesFromRepositories(bool parseChecksum, bool compressedRepository = false); void processFilesForDelayedDeletion(); + void findExecutablesRecursive(const QString &path, const QStringList &excludeFiles, QStringList *result); + QStringList runningInstallerProcesses(const QStringList &exludeFiles); private: PackageManagerCore *m_core; |