diff options
author | Arttu Tarkiainen <arttu.tarkiainen@qt.io> | 2022-11-03 14:06:36 +0200 |
---|---|---|
committer | Arttu Tarkiainen <arttu.tarkiainen@qt.io> | 2022-11-03 14:06:36 +0200 |
commit | f0a4a3ef6a1b4bfd596f079e1dd1d219bcc9d8a6 (patch) | |
tree | 831a830dd856a6035a77a6b77c2a4bd7effc534c /src/libs | |
parent | c4c211c73c987dc267899a2084da98b87ff45340 (diff) | |
parent | 83b669586bd24fab082720876ff8aea75264ec36 (diff) |
Merge remote-tracking branch 'origin/4.5'
Change-Id: Ic3759bb073b00a168ec3348122484514e02138f5
Diffstat (limited to 'src/libs')
-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 | 3 | ||||
-rw-r--r-- | src/libs/installer/uninstallercalculator.cpp | 3 |
8 files changed, 62 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 5d21cd1da..e6c8eac34 100644 --- a/src/libs/installer/component.cpp +++ b/src/libs/installer/component.cpp @@ -1081,10 +1081,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 dac1c62f6..ebef3495d 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 64af77a98..6eb589086 100644 --- a/src/libs/installer/packagemanagercore_p.cpp +++ b/src/libs/installer/packagemanagercore_p.cpp @@ -1431,6 +1431,7 @@ void PackageManagerCorePrivate::writeMaintenanceTool(OperationList performedOper << error.message(); } } else { + writeMaintenanceToolAppBundle(performedOperations); QFile replacementBinary(installerBaseBinary); try { QInstaller::openForRead(&replacementBinary); @@ -2354,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; } |