diff options
-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; |