diff options
author | Arttu Tarkiainen <arttu.tarkiainen@qt.io> | 2022-01-03 17:08:13 +0200 |
---|---|---|
committer | Arttu Tarkiainen <arttu.tarkiainen@qt.io> | 2022-01-06 07:25:58 +0000 |
commit | 30f2a6b89bedfc5bfda5bba07032d23169230e4e (patch) | |
tree | a6bb9e960a4d81752a90984779524ffcbf5267bb /src/libs/installer | |
parent | 4cc03d71647ba0f29684f717bb9d8b4d41d75986 (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/libs/installer')
-rw-r--r-- | src/libs/installer/packagemanagercore.cpp | 14 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore.h | 3 |
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); |