summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKatja Marttila <katja.marttila@qt.io>2017-05-08 11:58:08 +0300
committerKatja Marttila <katja.marttila@qt.io>2017-05-10 06:00:10 +0000
commitbb671cba0a2ffcb0f165d373a51b76a57a7dfacc (patch)
tree8ff894df74683b833b8df5421b447637ce3781cf /src
parenta1694a8ea3e34df7d06cb36275200f08ec54ce59 (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.cpp15
-rw-r--r--src/libs/installer/packagemanagercore_p.cpp22
-rw-r--r--src/libs/installer/packagemanagercore_p.h2
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;