diff options
author | Arttu Tarkiainen <arttu.tarkiainen@qt.io> | 2022-11-03 10:03:36 +0200 |
---|---|---|
committer | Arttu Tarkiainen <arttu.tarkiainen@qt.io> | 2022-11-03 10:03:36 +0200 |
commit | e7a8a075f7b8637b3701fa5559b0477355be91c8 (patch) | |
tree | b14f4f753e5ecaa674943a9af7d151445e0d3ecf /src/libs/installer | |
parent | 65f98b65bce94c3b1a3a2792072c3f30360b075f (diff) | |
parent | f23bccb3bce725041bfea050e6a4ce9a907a2af0 (diff) |
Merge remote-tracking branch 'origin/4.4' into 4.5
Change-Id: If99e84c5f6e6914f0d90770053ce6850e70ed403
Diffstat (limited to 'src/libs/installer')
-rw-r--r-- | src/libs/installer/commandlineparser.cpp | 4 | ||||
-rw-r--r-- | src/libs/installer/component.cpp | 10 | ||||
-rw-r--r-- | src/libs/installer/directoryguard.cpp | 4 | ||||
-rw-r--r-- | src/libs/installer/extractarchiveoperation.cpp | 15 | ||||
-rw-r--r-- | src/libs/installer/fileutils.cpp | 46 | ||||
-rw-r--r-- | src/libs/installer/fileutils.h | 1 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore_p.cpp | 2 | ||||
-rw-r--r-- | src/libs/installer/uninstallercalculator.cpp | 3 |
8 files changed, 61 insertions, 24 deletions
diff --git a/src/libs/installer/commandlineparser.cpp b/src/libs/installer/commandlineparser.cpp index 3b5b46e0e..937c966ba 100644 --- a/src/libs/installer/commandlineparser.cpp +++ b/src/libs/installer/commandlineparser.cpp @@ -226,8 +226,8 @@ CommandLineParser::CommandLineParser() QLatin1String("socketname, key"))); addOption(QCommandLineOption(QStringList() << CommandLineOptions::scSquishPortShort << CommandLineOptions::scSquishPortLong, - QLatin1String("Give a port where Squish can connect to. If no port is given, default port 11233 is " - "used. Note: To enable Squish support you first need to build IFW with SQUISH_PATH " + QLatin1String("Give a port where Squish can connect to. If no port is given, attach to squish " + "not done. Note: To enable Squish support you first need to build IFW with SQUISH_PATH " "parameter where SQUISH_PATH is pointing to your Squish installation folder: " "<path_to_qt>/bin/qmake -r SQUISH_PATH=<pat_to_squish>"), QLatin1String("port number"))); diff --git a/src/libs/installer/component.cpp b/src/libs/installer/component.cpp index c7dfa65da..37abcea8a 100644 --- a/src/libs/installer/component.cpp +++ b/src/libs/installer/component.cpp @@ -1082,10 +1082,12 @@ OperationList Component::operations(const Operation::OperationGroups &mask) cons d->m_operations.append(d->m_licenseOperation); } } - OperationList operations = d->m_operations; - QtConcurrent::blockingFilter(operations, [&](const Operation *op) { - return mask.testFlag(op->group()); - }); + OperationList operations; + std::copy_if(d->m_operations.begin(), d->m_operations.end(), std::back_inserter(operations), + [&](const Operation *op) { + return mask.testFlag(op->group()); + } + ); return operations; } diff --git a/src/libs/installer/directoryguard.cpp b/src/libs/installer/directoryguard.cpp index 9c97130a4..014d213d7 100644 --- a/src/libs/installer/directoryguard.cpp +++ b/src/libs/installer/directoryguard.cpp @@ -28,6 +28,7 @@ #include "directoryguard.h" +#include "fileutils.h" #include "globals.h" #include "errors.h" @@ -92,8 +93,7 @@ QStringList DirectoryGuard::tryCreate() toCreate = QDir(p); } - QDir dir(m_path); - m_created = dir.mkpath(m_path); + m_created = QInstaller::createDirectoryWithParents(m_path); if (!m_created) { throw Error(QCoreApplication::translate("DirectoryGuard", "Cannot create directory \"%1\".").arg(QDir::toNativeSeparators(m_path))); diff --git a/src/libs/installer/extractarchiveoperation.cpp b/src/libs/installer/extractarchiveoperation.cpp index 6b9ecb687..986b9d8c8 100644 --- a/src/libs/installer/extractarchiveoperation.cpp +++ b/src/libs/installer/extractarchiveoperation.cpp @@ -193,20 +193,7 @@ bool ExtractArchiveOperation::performOperation() QFileInfo targetDirectoryInfo(fileDirectory); - // We need to create the directory structure step-by-step to avoid a rare race condition - // on Windows. QDir::mkpath() doesn't check if the leading directories were created elsewhere - // (like from within another thread) after the initial check that the given path requires - // creating also parent directories. - // - // On Unix patforms this case is handled by QFileSystemEngine though. - QDir resourcesDir(resourcesPath); - if (!resourcesDir.exists()) - resourcesDir.mkdir(resourcesPath); - - QDir resourceFileDir(targetDirectoryInfo.absolutePath()); - if (!resourceFileDir.exists()) - resourceFileDir.mkdir(targetDirectoryInfo.absolutePath()); - + QInstaller::createDirectoryWithParents(targetDirectoryInfo.absolutePath()); setDefaultFilePermissions(resourcesPath, DefaultFilePermissions::Executable); setDefaultFilePermissions(targetDirectoryInfo.absolutePath(), DefaultFilePermissions::Executable); diff --git a/src/libs/installer/fileutils.cpp b/src/libs/installer/fileutils.cpp index 0a2ead07e..48b0ac309 100644 --- a/src/libs/installer/fileutils.cpp +++ b/src/libs/installer/fileutils.cpp @@ -457,6 +457,52 @@ void QInstaller::mkpath(const QString &path) /*! \internal + Creates directory \a path including all parent directories. Return \c true on + success, \c false otherwise. + + On Windows \c QDir::mkpath() doesn't check if the leading directories were created + elsewhere (i.e. in another thread) after the initial check that the given path + requires creating also parent directories, and returns \c false. + + On Unix platforms this case is handled different by QFileSystemEngine though, + which checks for \c EEXIST error code in case any of the recursive directories + could not be created. + + Compared to \c QInstaller::mkpath() and \c QDir::mkpath() this function checks if + each parent directory to-be-created were created elsewhere. +*/ +bool QInstaller::createDirectoryWithParents(const QString &path) +{ + if (path.isEmpty()) + return false; + + QFileInfo dirInfo(path); + if (dirInfo.exists() && dirInfo.isDir()) + return true; + + // bail out if we are at the root directory + if (dirInfo.isRoot()) + return false; + + QDir dir(path); + if (dir.mkdir(path)) + return true; + + // mkdir failed, try to create the parent directory + if (!createDirectoryWithParents(dirInfo.absolutePath())) + return false; + + // now try again + if (dir.mkdir(path)) + return true; + + // directory may be have also been created elsewhere + return (dirInfo.exists() && dirInfo.isDir()); +} + +/*! + \internal + Generates and returns a temporary file name. The name can start with a template \a templ. */ diff --git a/src/libs/installer/fileutils.h b/src/libs/installer/fileutils.h index 304569ec5..3c995937c 100644 --- a/src/libs/installer/fileutils.h +++ b/src/libs/installer/fileutils.h @@ -89,6 +89,7 @@ private: void INSTALLER_EXPORT mkdir(const QString &path); void INSTALLER_EXPORT mkpath(const QString &path); + bool INSTALLER_EXPORT createDirectoryWithParents(const QString &path); #ifdef Q_OS_MACOS void INSTALLER_EXPORT mkalias(const QString &path, const QString &alias); #endif diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp index 41eccf799..6eb589086 100644 --- a/src/libs/installer/packagemanagercore_p.cpp +++ b/src/libs/installer/packagemanagercore_p.cpp @@ -2355,7 +2355,7 @@ void PackageManagerCorePrivate::unpackComponents(const QList<Component *> &compo runner.setType(Operation::Perform); const QHash<Operation *, bool> results = runner.run(); - const OperationList performedOperations = backupResults.keys(); + const OperationList performedOperations = results.keys(); QString error; for (auto &operation : performedOperations) { diff --git a/src/libs/installer/uninstallercalculator.cpp b/src/libs/installer/uninstallercalculator.cpp index 3de9f5b60..d54b5c2ab 100644 --- a/src/libs/installer/uninstallercalculator.cpp +++ b/src/libs/installer/uninstallercalculator.cpp @@ -205,7 +205,8 @@ void UninstallerCalculator::appendVirtualComponentsToUninstall(const bool revers // Check if installed or about to be updated -packages are dependant on the package const QList<Component*> installDependants = m_core->installDependants(virtualComponent); for (Component *dependant : installDependants) { - if (dependant->isInstalled() && !m_componentsToUninstall.contains(dependant)) { + if ((dependant->isInstalled() && !m_componentsToUninstall.contains(dependant)) + || m_core->orderedComponentsToInstall().contains(dependant)) { required = true; break; } |