summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorArttu Tarkiainen <arttu.tarkiainen@qt.io>2022-01-03 17:08:13 +0200
committerArttu Tarkiainen <arttu.tarkiainen@qt.io>2022-01-06 07:25:58 +0000
commit30f2a6b89bedfc5bfda5bba07032d23169230e4e (patch)
treea6bb9e960a4d81752a90984779524ffcbf5267bb /src
parent4cc03d71647ba0f29684f717bb9d8b4d41d75986 (diff)
Fix replacing components with <TreeName> element
The QHash dictionary used to store component objects before building the component tree may include keys that are either original names or overridden tree names of components. Only the former were handled when removing replaced components from the QHash. Task-number: QTIFW-2455 Change-Id: I340aa61c724da0da62d7e5a875a38b6ecc0eceb5 Reviewed-by: Katja Marttila <katja.marttila@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/libs/installer/packagemanagercore.cpp14
-rw-r--r--src/libs/installer/packagemanagercore.h3
2 files changed, 13 insertions, 4 deletions
diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp
index 58896de98..8b670fc41 100644
--- a/src/libs/installer/packagemanagercore.cpp
+++ b/src/libs/installer/packagemanagercore.cpp
@@ -3796,13 +3796,21 @@ bool PackageManagerCore::updateComponentData(struct Data &data, Component *compo
return true;
}
-void PackageManagerCore::storeReplacedComponents(QHash<QString, Component *> &components, const struct Data &data)
+void PackageManagerCore::storeReplacedComponents(QHash<QString, Component *> &components,
+ const struct Data &data, QMap<QString, QString> *const treeNameComponents)
{
QHash<Component*, QStringList>::const_iterator it = data.replacementToExchangeables.constBegin();
// remember all components that got a replacement, required for uninstall
for (; it != data.replacementToExchangeables.constEnd(); ++it) {
foreach (const QString &componentName, it.value()) {
- Component *componentToReplace = components.take(componentName);
+ QString key = componentName;
+ if (treeNameComponents && treeNameComponents->contains(componentName)) {
+ // The exchangeable component is stored with a tree name key,
+ // remove from the list of components with tree name.
+ key = treeNameComponents->value(componentName);
+ treeNameComponents->remove(componentName);
+ }
+ Component *componentToReplace = components.take(key);
if (!componentToReplace) {
// If a component replaces another component which is not existing in the
// installer binary or the installed component list, just ignore it. This
@@ -3905,7 +3913,7 @@ bool PackageManagerCore::fetchAllPackages(const PackagesList &remotes, const Loc
}
// store all components that got a replacement
- storeReplacedComponents(components, data);
+ storeReplacedComponents(components, data, &treeNameComponents);
if (!d->buildComponentTree(components, true))
return false;
diff --git a/src/libs/installer/packagemanagercore.h b/src/libs/installer/packagemanagercore.h
index c9945e308..9114578fa 100644
--- a/src/libs/installer/packagemanagercore.h
+++ b/src/libs/installer/packagemanagercore.h
@@ -409,7 +409,8 @@ private:
};
bool updateComponentData(struct Data &data, QInstaller::Component *component);
- void storeReplacedComponents(QHash<QString, Component*> &components, const struct Data &data);
+ void storeReplacedComponents(QHash<QString, Component*> &components, const struct Data &data,
+ QMap<QString, QString> *const treeNameComponents = nullptr);
bool fetchAllPackages(const PackagesList &remotePackages, const LocalPackagesHash &localPackages);
bool fetchUpdaterPackages(const PackagesList &remotePackages, const LocalPackagesHash &localPackages);