diff options
author | Katja Marttila <katja.marttila@qt.io> | 2022-01-06 14:26:03 +0200 |
---|---|---|
committer | Katja Marttila <katja.marttila@qt.io> | 2022-01-11 12:50:15 +0200 |
commit | eb8b24f8e3466ecfccb4975dd76c224847d34dd0 (patch) | |
tree | ae1be03b22f61c358b93fab0eef697fdc270ae97 /src/libs | |
parent | c048aecb4858286a1516dba50317b4568f0d5c3d (diff) |
Fix Replace -element beviour
Replacable component was not correctly removed in install and update.
Also added new tests for Replace element.
Task-number: QTIFW-2454
Change-Id: Idce7fd1ef0ac2025ca5ca0952ab837e14516ac2b
Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
Diffstat (limited to 'src/libs')
-rw-r--r-- | src/libs/installer/packagemanagercore.cpp | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp index 81c0bea3a..5ebe44d6c 100644 --- a/src/libs/installer/packagemanagercore.cpp +++ b/src/libs/installer/packagemanagercore.cpp @@ -3787,8 +3787,8 @@ bool PackageManagerCore::updateComponentData(struct Data &data, Component *compo foreach (const QString &componentName, componentsToReplace) { if (data.installedPackages->contains(componentName)) { // We found a replacement that is installed. - if (isPackageManager()) { - // Mark the replacement component as installed as well. Only do this in package manager + if (isUpdater()) { + // Mark the replacement component as installed as well. Only do this in updater // mode, otherwise it would not show up in the updaters component list. component->setInstalled(); component->setValue(scInstalledVersion, data.installedPackages->value(componentName).version); @@ -3826,14 +3826,7 @@ void PackageManagerCore::storeReplacedComponents(QHash<QString, Component *> &co qCWarning(QInstaller::lcDeveloperBuild) << componentName << "- Does not exist in the repositories anymore."; continue; } - if (!d->componentsToReplace().contains(componentName)) { - componentToReplace = new Component(this); - componentToReplace->setValue(scName, componentName); - } else { - // This case can happen when in installer mode as well, a component - // is in the installer binary and its replacement component as well. - d->replacementDependencyComponents().append(componentToReplace); - } + d->replacementDependencyComponents().append(componentToReplace); d->componentsToReplace().insert(componentName, qMakePair(it.key(), componentToReplace)); } } @@ -4009,7 +4002,7 @@ bool PackageManagerCore::fetchUpdaterPackages(const PackagesList &remotes, const installedPackages.take(name); // remove from local installed packages bool isValidUpdate = locals.contains(name); - if (!isValidUpdate && !replaces.isEmpty()) { + if (!replaces.isEmpty()) { const QStringList possibleNames = replaces.split(QInstaller::commaRegExp(), Qt::SkipEmptyParts); foreach (const QString &possibleName, possibleNames) { @@ -4050,9 +4043,18 @@ bool PackageManagerCore::fetchUpdaterPackages(const PackagesList &remotes, const QInstaller::Component *component = new QInstaller::Component(this); component->loadDataFromPackage(installedPackages.value(key)); d->m_updaterComponentsDeps.append(component); + } + + foreach (const QString &key, locals.keys()) { // Keep a list of local components that should be replaced - if (replaceMes.contains(component->name())) + // Remove from components list - we don't want to update the component + // as it is replaced by other component + if (replaceMes.contains(key)) { + QInstaller::Component *component = new QInstaller::Component(this); + component->loadDataFromPackage(locals.value(key)); localReplaceMes.insert(component->name(), component); + delete components.take(component->name()); + } } // store all components that got a replacement, but do not modify the components list |