From f05ec1bcd90bfb168cef039f319ab79bdbfa0b5b Mon Sep 17 00:00:00 2001 From: Katja Marttila Date: Tue, 20 Apr 2021 16:52:07 +0300 Subject: Fix return value for operations run as detached Task-number: QTIFW-2210 Change-Id: If02422317039cc7aced3ff175576660cb260a005 Reviewed-by: Tim Jenssen Reviewed-by: Arttu Tarkiainen --- src/libs/installer/elevatedexecuteoperation.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/libs') diff --git a/src/libs/installer/elevatedexecuteoperation.cpp b/src/libs/installer/elevatedexecuteoperation.cpp index f81377ac4..4ca9a8e59 100644 --- a/src/libs/installer/elevatedexecuteoperation.cpp +++ b/src/libs/installer/elevatedexecuteoperation.cpp @@ -151,13 +151,15 @@ int ElevatedExecuteOperation::Private::run(QStringList &arguments, const Operati // unix style: when there's an ampersand after the command, it's started detached if (args.count() >= 2 && args.last() == QLatin1String("&")) { + int returnValue = NoError; args.pop_back(); const bool success = QProcessWrapper::startDetached(args.front(), args.mid(1)); if (!success) { q->setError(UserDefinedError); q->setErrorString(tr("Cannot start detached: \"%1\"").arg(callstr)); + returnValue = Error; } - return success; + return returnValue; } process = new QProcessWrapper(); -- cgit v1.2.3 From 3660ca50d05802a1f03c2c7f1ba7c1e873c01f78 Mon Sep 17 00:00:00 2001 From: Arttu Tarkiainen Date: Thu, 22 Apr 2021 10:52:15 +0300 Subject: Do not try to remove non-existing package information file on rollback The installation information XML file (components.xml by default) is not yet written to disk when downloading archives. Canceling the installation here would try to remove the not-yet-created file unconditionally. Task-number: QTIFW-2213 Change-Id: I922ffd7d1344755ed7fcf3f02e83bc02e789cd17 Reviewed-by: Katja Marttila --- src/libs/installer/packagemanagercore.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'src/libs') diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp index 5b36f8bc6..6682bde7c 100644 --- a/src/libs/installer/packagemanagercore.cpp +++ b/src/libs/installer/packagemanagercore.cpp @@ -896,11 +896,10 @@ void PackageManagerCore::rollBackInstallation() } d->m_localPackageHub->writeToDisk(); - if (isInstaller()) { - if (d->m_localPackageHub->packageInfoCount() == 0) { - QFile file(d->m_localPackageHub->fileName()); + if (isInstaller() && d->m_localPackageHub->packageInfoCount() == 0) { + QFile file(d->m_localPackageHub->fileName()); + if (!file.fileName().isEmpty() && file.exists()) file.remove(); - } } if (becameAdmin) -- cgit v1.2.3 From 8119a82e950cc063df92d5c6d26cac1a3e4954ca Mon Sep 17 00:00:00 2001 From: Katja Marttila Date: Mon, 26 Apr 2021 16:23:00 +0300 Subject: Fix values overwritten by maintenancetool Maintenancetool has saved values, which are loaded after installer has initialized some values, overwriting the installer initial values. Fixed so that only values that are not already set in installer init will be set from maintenancetool ini file. Task-number: QTIFW-2218 Change-Id: Ide6a3f67daec81fe22d6dcde1e95a28f5ed2c53a Reviewed-by: Arttu Tarkiainen --- src/libs/installer/packagemanagercore_p.cpp | 6 +++--- src/libs/installer/packagemanagercoredata.cpp | 20 +++++++++++++++----- src/libs/installer/packagemanagercoredata.h | 2 +- 3 files changed, 19 insertions(+), 9 deletions(-) (limited to 'src/libs') diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp index d1e482912..24a67d095 100644 --- a/src/libs/installer/packagemanagercore_p.cpp +++ b/src/libs/installer/packagemanagercore_p.cpp @@ -611,7 +611,7 @@ UninstallerCalculator *PackageManagerCorePrivate::uninstallerCalculator() const void PackageManagerCorePrivate::initialize(const QHash ¶ms) { m_coreCheckedHash.clear(); - m_data = PackageManagerCoreData(params); + m_data = PackageManagerCoreData(params, isInstaller()); m_componentsToInstallCalculated = false; #ifdef Q_OS_LINUX @@ -920,8 +920,8 @@ void PackageManagerCorePrivate::readMaintenanceConfigFiles(const QString &target const QVariantHash v = cfg.value(QLatin1String("Variables")).toHash(); // Do not change to // QVariantMap! Breaks reading from existing .ini files, cause the variant types do not match. for (QVariantHash::const_iterator it = v.constBegin(); it != v.constEnd(); ++it) { - m_data.setValue(it.key(), replacePath(it.value().toString(), QLatin1String(scRelocatable), - targetDir)); + if (!m_data.contains(it.key()) || m_data.value(it.key()).isNull()) + m_data.setValue(it.key(), replacePath(it.value().toString(), QLatin1String(scRelocatable), targetDir)); } QSet repos; const QVariantList variants = cfg.value(QLatin1String("DefaultRepositories")) diff --git a/src/libs/installer/packagemanagercoredata.cpp b/src/libs/installer/packagemanagercoredata.cpp index 3326ec65e..8f6f24a09 100644 --- a/src/libs/installer/packagemanagercoredata.cpp +++ b/src/libs/installer/packagemanagercoredata.cpp @@ -50,14 +50,13 @@ namespace QInstaller \internal */ -PackageManagerCoreData::PackageManagerCoreData(const QHash &variables) +PackageManagerCoreData::PackageManagerCoreData(const QHash &variables, const bool isInstaller) { // Add user defined variables before dynamic as user settings can affect dynamic variables. setUserDefinedVariables(variables); addDynamicPredefinedVariables(); // Set some common variables that may used e.g. as placeholder in some of the settings variables or // in a script or... - addNewVariable(scTargetConfigurationFile, QLatin1String("components.xml")); addNewVariable(QLatin1String("InstallerDirPath"), QCoreApplication::applicationDirPath()); addNewVariable(QLatin1String("InstallerFilePath"), QCoreApplication::applicationFilePath()); @@ -81,8 +80,6 @@ PackageManagerCoreData::PackageManagerCoreData(const QHash &va addNewVariable(scTitle, replaceVariables(m_settings.title())); addNewVariable(scPublisher, m_settings.publisher()); addNewVariable(QLatin1String("Url"), m_settings.url()); - addNewVariable(scStartMenuDir, m_settings.startMenuDir()); - addNewVariable(scTargetConfigurationFile, m_settings.configurationFileName()); addNewVariable(scLogo, m_settings.logo()); addNewVariable(scWatermark, m_settings.watermark()); addNewVariable(scBanner, m_settings.banner()); @@ -92,7 +89,20 @@ PackageManagerCoreData::PackageManagerCoreData(const QHash &va if (!description.isEmpty()) addNewVariable(scRunProgramDescription, description); - addNewVariable(scTargetDir, replaceVariables(m_settings.targetDir())); + // Some settings might change during install, read those settings later from + // maintenancetool if maintenancetool is used. + if (isInstaller) { + addNewVariable(scTargetDir, replaceVariables(m_settings.targetDir())); + addNewVariable(scTargetConfigurationFile, m_settings.configurationFileName()); + addNewVariable(scStartMenuDir, m_settings.startMenuDir()); + } else { +#ifdef Q_OS_MACOS + addNewVariable(scTargetDir, QFileInfo(QCoreApplication::applicationDirPath() + QLatin1String("/../../..")).absoluteFilePath()); +#else + addNewVariable(scTargetDir, QCoreApplication::applicationDirPath()); +#endif + + } addNewVariable(scRemoveTargetDir, replaceVariables(m_settings.removeTargetDir())); } diff --git a/src/libs/installer/packagemanagercoredata.h b/src/libs/installer/packagemanagercoredata.h index 32a848aed..3cfb77c95 100644 --- a/src/libs/installer/packagemanagercoredata.h +++ b/src/libs/installer/packagemanagercoredata.h @@ -37,7 +37,7 @@ class PackageManagerCoreData { public: PackageManagerCoreData() {} - explicit PackageManagerCoreData(const QHash &variables); + explicit PackageManagerCoreData(const QHash &variables, const bool isInstaller); void clear(); void addDynamicPredefinedVariables(); -- cgit v1.2.3 From 14b12d2730bbde50dac8c81d4aef45ef78c48391 Mon Sep 17 00:00:00 2001 From: Arttu Tarkiainen Date: Wed, 14 Apr 2021 17:56:42 +0300 Subject: CLI: Print warning when creating over 4GB installers on Windows Task-number: QTIFW-2199 Change-Id: I56f3663ae605b2c568925702e06c4438e11830ac (cherry picked from commit 35f79da9cb99c7c0456f002829dc0fdfe55b4f8d) Reviewed-by: Katja Marttila --- src/libs/installer/packagemanagercore.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'src/libs') diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp index 6682bde7c..a18374f0c 100644 --- a/src/libs/installer/packagemanagercore.cpp +++ b/src/libs/installer/packagemanagercore.cpp @@ -70,7 +70,8 @@ #include "updateoperationfactory.h" #ifdef Q_OS_WIN -# include "qt_windows.h" +#include "qt_windows.h" +#include #endif #include @@ -2718,6 +2719,13 @@ bool PackageManagerCore::checkAvailableSpace(QString &message) const message = tr("The volume you selected for installation seems to have sufficient " "space for installation, but there will be less than 100 MB available afterwards."); } +#ifdef Q_OS_WIN + if (isOfflineGenerator() && (required > UINT_MAX)) { + message = tr("The estimated installer size %1 would exceed the supported executable " + "size limit of %2. The application may not be able to run.") + .arg(humanReadableSize(required), humanReadableSize(UINT_MAX)); + } +#endif } message = QString::fromLatin1("%1 %2").arg(message, tr("Installation will use %1 of disk space.") .arg(humanReadableSize(requiredDiskSpace()))).simplified(); -- cgit v1.2.3 From 33334e2a8aa9d847172d1f6c1cf9a447dce094f9 Mon Sep 17 00:00:00 2001 From: Katja Marttila Date: Mon, 3 May 2021 15:27:54 +0300 Subject: Fix component translation loading Component translations were following the system language although allowed languages were set in config.xml using field. Also the translation file name was not correct as IFW languages has the syntax 'ifw_'. Task-number: QTIFW-2220 Change-Id: I6a6f19351cbb956accbc22bc532f7a12dde21a2f Reviewed-by: Iikka Eklund Reviewed-by: Arttu Tarkiainen --- src/libs/installer/component.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/libs') diff --git a/src/libs/installer/component.cpp b/src/libs/installer/component.cpp index 66f333377..cb9959ba3 100644 --- a/src/libs/installer/component.cpp +++ b/src/libs/installer/component.cpp @@ -617,15 +617,15 @@ void Component::loadTranslations(const QDir &directory, const QStringList &qms) while (it.hasNext()) { const QString filename = it.next(); const QString basename = QFileInfo(filename).baseName(); - if (!uiLanguage.startsWith(QFileInfo(filename).baseName(), Qt::CaseInsensitive)) - continue; // do not load the file if it does not match the UI language if (!translations.isEmpty()) { bool found = false; foreach (const QString &translation, translations) - found |= translation.startsWith(basename, Qt::CaseInsensitive); + found |= translation.startsWith(QLatin1String("ifw_") + basename, Qt::CaseInsensitive); if (!found) // don't load the file if it does match the UI language but is not allowed to be used continue; + } else if (!uiLanguage.startsWith(QFileInfo(filename).baseName(), Qt::CaseInsensitive)) { + continue; // do not load the file if it does not match the UI language } QScopedPointer translator(new QTranslator(this)); -- cgit v1.2.3 From be2c54531eeb00822259d6f6bfcb90b43768cea3 Mon Sep 17 00:00:00 2001 From: Katja Marttila Date: Thu, 15 Apr 2021 15:52:33 +0300 Subject: Add possibility to list components with regexp Task-number: QTIFW-2225 Change-Id: I6a7fdfc1070ad54d520563cae7d2446e97e2e87c Reviewed-by: Arttu Tarkiainen --- src/libs/installer/packagemanagercore.cpp | 14 +++++++++++++- src/libs/installer/packagemanagercore.h | 2 +- src/libs/installer/scriptengine.cpp | 6 +++--- src/libs/installer/scriptengine_p.h | 4 ++-- 4 files changed, 19 insertions(+), 7 deletions(-) (limited to 'src/libs') diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp index a18374f0c..145eb30d7 100644 --- a/src/libs/installer/packagemanagercore.cpp +++ b/src/libs/installer/packagemanagercore.cpp @@ -1863,8 +1863,9 @@ void PackageManagerCore::appendRootComponent(Component *component) /*! Returns a list of components depending on the component types passed in \a mask. + Optionally, a \a regexp expression can be used to further filter the listed packages. */ -QList PackageManagerCore::components(ComponentTypes mask) const +QList PackageManagerCore::components(ComponentTypes mask, const QString ®exp) const { QList components; @@ -1885,6 +1886,17 @@ QList PackageManagerCore::components(ComponentTypes mask) const // No descendants here, updates are always a flat list and cannot have children! } + if (!regexp.isEmpty()) { + QRegularExpression re(regexp); + QList::iterator iter = components.begin(); + while (iter != components.end()) { + if (!re.match(iter.i->t()->name()).hasMatch()) + iter = components.erase(iter); + else + iter++; + } + } + return components; } diff --git a/src/libs/installer/packagemanagercore.h b/src/libs/installer/packagemanagercore.h index 9d89e4763..d4833a979 100644 --- a/src/libs/installer/packagemanagercore.h +++ b/src/libs/installer/packagemanagercore.h @@ -224,7 +224,7 @@ public: void appendRootComponent(Component *components); void appendUpdaterComponent(Component *components); - QList components(ComponentTypes mask) const; + QList components(ComponentTypes mask, const QString ®exp = QString()) const; Component *componentByName(const QString &identifier) const; Q_INVOKABLE bool calculateComponentsToInstall() const; diff --git a/src/libs/installer/scriptengine.cpp b/src/libs/installer/scriptengine.cpp index 5dd56939c..c8fc65d34 100644 --- a/src/libs/installer/scriptengine.cpp +++ b/src/libs/installer/scriptengine.cpp @@ -1,6 +1,6 @@ /************************************************************************** ** -** Copyright (C) 2020 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Installer Framework. @@ -75,10 +75,10 @@ namespace QInstaller { \internal */ -QJSValue InstallerProxy::components() const +QJSValue InstallerProxy::components(const QString ®exp) const { if (m_core) { - const QList all = m_core->components(PackageManagerCore::ComponentType::All); + const QList all = m_core->components(PackageManagerCore::ComponentType::All, regexp); QJSValue scriptComponentsObject = m_engine->newArray(all.count()); for (int i = 0; i < all.count(); ++i) { Component *const component = all.at(i); diff --git a/src/libs/installer/scriptengine_p.h b/src/libs/installer/scriptengine_p.h index c5f04c0dc..e5c39663c 100644 --- a/src/libs/installer/scriptengine_p.h +++ b/src/libs/installer/scriptengine_p.h @@ -1,6 +1,6 @@ /************************************************************************** ** -** Copyright (C) 2020 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Installer Framework. @@ -63,7 +63,7 @@ public: : m_engine(engine), m_core(core) {} public slots: - QJSValue components() const; + QJSValue components(const QString ®exp = QString()) const; QJSValue componentByName(const QString &componentName); private: -- cgit v1.2.3