summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorArttu Tarkiainen <arttu.tarkiainen@qt.io>2023-09-25 15:46:33 +0300
committerArttu Tarkiainen <arttu.tarkiainen@qt.io>2023-09-29 09:33:57 +0300
commit170d9b46b4f3ff3d1bdf9a1c2550c2c34ff9b591 (patch)
tree32c32d604ea7a6e7df2bab49bf0880cdf0c6d6e9 /src
parentb91a864a051cf15e8839a22e5c4368c509f8914a (diff)
Add support for optional alias dependencies
In addition to RequiresComponent and RequiresAlias, introduce new OptionalComponent and OptionalAlias properties for component aliases. The new properties are used to declare optional requirements for aliases, which do not cause the declaring alias to become unstable in case the referred component or alias is missing from the installer. Task-number: QTIFW-3166 Change-Id: I43c8cd08099e879180ec7e028b55836750c727bd Reviewed-by: Katja Marttila <katja.marttila@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/libs/installer/componentalias.cpp122
-rw-r--r--src/libs/installer/componentalias.h4
-rw-r--r--src/libs/installer/constants.h2
-rw-r--r--src/libs/installer/loggingutils.cpp3
-rw-r--r--src/libs/installer/packagemanagercore_p.cpp3
5 files changed, 91 insertions, 43 deletions
diff --git a/src/libs/installer/componentalias.cpp b/src/libs/installer/componentalias.cpp
index 6207e7fe6..87ead7e1f 100644
--- a/src/libs/installer/componentalias.cpp
+++ b/src/libs/installer/componentalias.cpp
@@ -246,7 +246,9 @@ bool AliasFinder::parseXml(AliasSource source)
&& tag2 != scVersion
&& tag2 != scVirtual
&& tag2 != scRequiresComponent
- && tag2 != scRequiresAlias) {
+ && tag2 != scRequiresAlias
+ && tag2 != scOptionalComponent
+ && tag2 != scOptionalAlias) {
qCWarning(lcInstallerInstallLog) << "Unexpected element name:" << tag2;
continue;
}
@@ -424,28 +426,11 @@ QList<Component *> ComponentAlias::components()
const QStringList componentList = QInstaller::splitStringWithComma(
m_variables.value(scRequiresComponent));
- for (const auto &componentName : componentList) {
- Component *component = m_core->componentByName(componentName);
- if (!component) {
- const QString error = QLatin1String("No required component found by name: ")
- + componentName;
- qCWarning(lcInstallerInstallLog) << error;
+ const QStringList optionalComponentList = QInstaller::splitStringWithComma(
+ m_variables.value(scOptionalComponent));
- setUnstable(UnstableError::MissingComponent, error);
- continue;
- }
-
- if (component->isUnstable() || !component->isCheckable()) {
- const QString error = QLatin1String("Alias requires component that is uncheckable or unstable: ")
- + componentName;
- qCWarning(lcInstallerInstallLog) << error;
-
- setUnstable(UnstableError::UnselectableComponent, error);
- continue;
- }
-
- m_components.append(component);
- }
+ addRequiredComponents(componentList, false);
+ addRequiredComponents(optionalComponentList, true);
}
return m_components;
@@ -461,27 +446,11 @@ QList<ComponentAlias *> ComponentAlias::aliases()
const QStringList aliasList = QInstaller::splitStringWithComma(
m_variables.value(scRequiresAlias));
- for (const auto &aliasName : aliasList) {
- ComponentAlias *alias = m_core->aliasByName(aliasName);
- if (!alias) {
- const QString error = QLatin1String("No required alias found by name: ") + aliasName;
- qCWarning(lcInstallerInstallLog) << error;
-
- setUnstable(UnstableError::MissingAlias, error);
- continue;
- }
-
- if (alias->isUnstable()) {
- const QString error = QLatin1String("Alias requires another alias "
- "that is marked unstable: ") + aliasName;
- qCWarning(lcInstallerInstallLog) << error;
+ const QStringList optionalAliasList = QInstaller::splitStringWithComma(
+ m_variables.value(scOptionalAlias));
- setUnstable(UnstableError::ReferenceToUnstable, error);
- continue;
- }
-
- m_aliases.append(alias);
- }
+ addRequiredAliases(aliasList, false);
+ addRequiredAliases(optionalAliasList, true);
}
return m_aliases;
@@ -537,4 +506,73 @@ void ComponentAlias::setUnstable(UnstableError error, const QString &message)
QLatin1String(metaEnum.valueToKey(error)), message, name());
}
+/*!
+ \internal
+
+ Adds the \a aliases to the list of required aliases by this alias. If \a optional
+ is \c true, missing alias references are ignored.
+*/
+void ComponentAlias::addRequiredAliases(const QStringList &aliases, const bool optional)
+{
+ for (const auto &aliasName : aliases) {
+ ComponentAlias *alias = m_core->aliasByName(aliasName);
+ if (!alias) {
+ if (optional)
+ continue;
+
+ const QString error = QLatin1String("No required alias found by name: ") + aliasName;
+ qCWarning(lcInstallerInstallLog) << error;
+
+ setUnstable(UnstableError::MissingAlias, error);
+ continue;
+ }
+
+ if (alias->isUnstable()) {
+ const QString error = QLatin1String("Alias requires another alias "
+ "that is marked unstable: ") + aliasName;
+ qCWarning(lcInstallerInstallLog) << error;
+
+ setUnstable(UnstableError::ReferenceToUnstable, error);
+ continue;
+ }
+
+ m_aliases.append(alias);
+ }
+}
+
+/*!
+ \internal
+
+ Adds the \a components to the list of required components by this alias. If \a optional
+ is \c true, missing component references are ignored.
+*/
+void ComponentAlias::addRequiredComponents(const QStringList &components, const bool optional)
+{
+ for (const auto &componentName : components) {
+ Component *component = m_core->componentByName(componentName);
+ if (!component) {
+ if (optional)
+ continue;
+
+ const QString error = QLatin1String("No required component found by name: ")
+ + componentName;
+ qCWarning(lcInstallerInstallLog) << error;
+
+ setUnstable(UnstableError::MissingComponent, error);
+ continue;
+ }
+
+ if (component->isUnstable() || !component->isCheckable()) {
+ const QString error = QLatin1String("Alias requires component that is uncheckable or unstable: ")
+ + componentName;
+ qCWarning(lcInstallerInstallLog) << error;
+
+ setUnstable(UnstableError::UnselectableComponent, error);
+ continue;
+ }
+
+ m_components.append(component);
+ }
+}
+
} // namespace QInstaller
diff --git a/src/libs/installer/componentalias.h b/src/libs/installer/componentalias.h
index f486b23b9..17754f192 100644
--- a/src/libs/installer/componentalias.h
+++ b/src/libs/installer/componentalias.h
@@ -135,6 +135,10 @@ public:
void setUnstable(UnstableError error, const QString &message = QString());
private:
+ void addRequiredAliases(const QStringList &aliases, const bool optional);
+ void addRequiredComponents(const QStringList &components, const bool optional);
+
+private:
PackageManagerCore *const m_core;
QHash<QString, QString> m_variables;
diff --git a/src/libs/installer/constants.h b/src/libs/installer/constants.h
index 73a230e8e..6afd732a0 100644
--- a/src/libs/installer/constants.h
+++ b/src/libs/installer/constants.h
@@ -63,6 +63,8 @@ static const QLatin1String scDependencies("Dependencies");
static const QLatin1String scAlias("Alias");
static const QLatin1String scRequiresAlias("RequiresAlias");
static const QLatin1String scRequiresComponent("RequiresComponent");
+static const QLatin1String scOptionalAlias("OptionalAlias");
+static const QLatin1String scOptionalComponent("OptionalComponent");
static const QLatin1String scLocalDependencies("LocalDependencies");
static const QLatin1String scAutoDependOn("AutoDependOn");
static const QLatin1String scNewComponent("NewComponent");
diff --git a/src/libs/installer/loggingutils.cpp b/src/libs/installer/loggingutils.cpp
index 21ad295f9..a9c96e0c9 100644
--- a/src/libs/installer/loggingutils.cpp
+++ b/src/libs/installer/loggingutils.cpp
@@ -395,6 +395,9 @@ void LoggingHandler::printAliasInformation(const QList<ComponentAlias *> &aliase
stream << "Components: " << alias->value(scRequiresComponent) << Qt::endl;
stream << "Required aliases: " << alias->value(scRequiresAlias) << Qt::endl;
+ stream << "Optional components: " << alias->value(scOptionalComponent) << Qt::endl;
+ stream << "Optional aliases: " << alias->value(scOptionalAlias) << Qt::endl;
+
if (sortedAliases.indexOf(alias) != (sortedAliases.count() - 1))
stream << "========================================" << Qt::endl;
}
diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp
index b4eab7712..16e0b815a 100644
--- a/src/libs/installer/packagemanagercore_p.cpp
+++ b/src/libs/installer/packagemanagercore_p.cpp
@@ -460,7 +460,8 @@ bool PackageManagerCorePrivate::buildComponentAliases()
for (auto *alias : qAsConst(m_componentAliases)) {
aliasGraph.addNode(alias->name());
aliasGraph.addEdges(alias->name(),
- QInstaller::splitStringWithComma(alias->value(scRequiresAlias)));
+ QInstaller::splitStringWithComma(alias->value(scRequiresAlias)) <<
+ QInstaller::splitStringWithComma(alias->value(scOptionalAlias)));
if (!m_core->componentByName(alias->name())) {
// Name ok, select for sanity check calculation