diff options
author | Katja Marttila <katja.marttila@qt.io> | 2022-05-13 15:25:18 +0300 |
---|---|---|
committer | Katja Marttila <katja.marttila@qt.io> | 2022-05-17 06:18:41 +0000 |
commit | c107d9ae122f83ae653badc04c37f9bfe099f45d (patch) | |
tree | 7d53f4ff387d900abda22f576fdef560d27f97de /src | |
parent | 21de5f081ab3b18625febcd8ac181f6a122c4c7f (diff) |
Fix calculating autodependencies for install/uninstall
Autodependencies can be added also from script. The uninstaller and
installer calculators ignored the values set from script depending on at
what state of the script run the autodependencies were added. Fixed so
that at any point the autodependencies are added from script, the
installer and uninstaller calculators has correct values.
Change-Id: If993bcce72f889b51e4b981473540c4e1ccd6067
Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/libs/installer/component.cpp | 4 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore.cpp | 20 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore.h | 2 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore_p.cpp | 37 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore_p.h | 3 |
5 files changed, 53 insertions, 13 deletions
diff --git a/src/libs/installer/component.cpp b/src/libs/installer/component.cpp index c703bfdcd..c7dfa65da 100644 --- a/src/libs/installer/component.cpp +++ b/src/libs/installer/component.cpp @@ -473,6 +473,10 @@ void Component::setValue(const QString &key, const QString &value) setCheckState(Qt::Checked); } } + if (key == scAutoDependOn) + packageManagerCore()->createAutoDependencyHash(name(), d->m_vars[key], normalizedValue); + if (key == scLocalDependencies) + packageManagerCore()->createLocalDependencyHash(name(), normalizedValue); d->m_vars[key] = normalizedValue; emit valueChanged(key, normalizedValue); diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp index 543852e20..9110d0c91 100644 --- a/src/libs/installer/packagemanagercore.cpp +++ b/src/libs/installer/packagemanagercore.cpp @@ -2704,6 +2704,24 @@ void PackageManagerCore::addLicenseItem(const QHash<QString, QVariantMap> &licen } /*! + * Adds \a component local \a dependencies to a hash table for quicker search for + * uninstall dependency components. + */ +void PackageManagerCore::createLocalDependencyHash(const QString &component, const QString &dependencies) const +{ + d->createLocalDependencyHash(component, dependencies); +} + +/*! + * Adds \a component \a newDependencies to a hash table for quicker search for + * install and uninstall autodependency components. Removes \a oldDependencies + * from the hash table if dependencies have changed. + */ +void PackageManagerCore::createAutoDependencyHash(const QString &component, const QString &oldDependencies, const QString &newDependencies) const +{ + d->createAutoDependencyHash(component, oldDependencies, newDependencies); +} +/*! Uninstalls the selected components \a components without GUI. Returns PackageManagerCore installation status. */ @@ -4246,7 +4264,6 @@ bool PackageManagerCore::fetchUpdaterPackages(const PackagesList &remotes, const component->loadComponentScript(); if (!component->isUnstable() && component->autoDependencies().isEmpty()) component->setCheckState(Qt::Checked); - d->createDependencyHashes(component); } // after everything is set up, check installed components @@ -4261,7 +4278,6 @@ bool PackageManagerCore::fetchUpdaterPackages(const PackagesList &remotes, const if (!component->isUnstable()) component->setCheckState(Qt::Checked); } - d->createDependencyHashes(component); } if (foundEssentialUpdate()) { foreach (QInstaller::Component *component, components) { diff --git a/src/libs/installer/packagemanagercore.h b/src/libs/installer/packagemanagercore.h index 50cdac486..1cc62cac5 100644 --- a/src/libs/installer/packagemanagercore.h +++ b/src/libs/installer/packagemanagercore.h @@ -340,6 +340,8 @@ public: void clearLicenses(); QHash<QString, QMap<QString, QString>> sortedLicenses(); void addLicenseItem(const QHash<QString, QVariantMap> &licenses); + void createLocalDependencyHash(const QString &component, const QString &dependencies) const; + void createAutoDependencyHash(const QString &component, const QString &oldDependencies, const QString &newDependencies) const; public Q_SLOTS: bool runInstaller(); diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp index e279a8027..92e30c28c 100644 --- a/src/libs/installer/packagemanagercore_p.cpp +++ b/src/libs/installer/packagemanagercore_p.cpp @@ -405,7 +405,6 @@ bool PackageManagerCorePrivate::buildComponentTree(QHash<QString, Component*> &c foreach (QInstaller::Component *component, components) { if (loadScript) component->loadComponentScript(); - createDependencyHashes(component); } // now we can preselect components in the tree foreach (QInstaller::Component *component, components) { @@ -3155,20 +3154,38 @@ void PackageManagerCorePrivate::commitPendingUnstableComponents() m_pendingUnstableComponents.clear(); } -void PackageManagerCorePrivate::createDependencyHashes(const Component* component) +void PackageManagerCorePrivate::createAutoDependencyHash(const QString &component, const QString &oldDependencies, const QString &newDependencies) { - for (const QString &autodepend : component->autoDependencies()) { + // User might have changed autodependencies with setValue. Remove the old values. + const QStringList oldDependencyList = oldDependencies.split(QInstaller::commaRegExp(), Qt::SkipEmptyParts); + for (const QString &removedDependency : oldDependencyList) { + QStringList value = m_autoDependencyComponentHash.value(removedDependency); + value.removeAll(component); + if (value.isEmpty()) + m_autoDependencyComponentHash.remove(removedDependency); + else + m_autoDependencyComponentHash.insert(removedDependency, value); + } + + const QStringList newDependencyList = newDependencies.split(QInstaller::commaRegExp(), Qt::SkipEmptyParts); + for (const QString &autodepend : newDependencyList) { QStringList value = m_autoDependencyComponentHash.value(autodepend); - if (!value.contains(component->name())) - value.append(component->name()); - m_autoDependencyComponentHash.insert(autodepend, value); + if (!value.contains(component)) { + value.append(component); + m_autoDependencyComponentHash.insert(autodepend, value); + } } +} - for (const QString &depend : component->localDependencies()) { +void PackageManagerCorePrivate::createLocalDependencyHash(const QString &component, const QString &dependencies) +{ + const QStringList localDependencies = dependencies.split(QInstaller::commaRegExp(), Qt::SkipEmptyParts); + for (const QString &depend : localDependencies) { QStringList value = m_localDependencyComponentHash.value(depend); - if (!value.contains(component->name())) - value.append(component->name()); - m_localDependencyComponentHash.insert(depend, value); + if (!value.contains(component)) { + value.append(component); + m_localDependencyComponentHash.insert(depend, value); + } } } diff --git a/src/libs/installer/packagemanagercore_p.h b/src/libs/installer/packagemanagercore_p.h index 8a5b805d8..24782b598 100644 --- a/src/libs/installer/packagemanagercore_p.h +++ b/src/libs/installer/packagemanagercore_p.h @@ -268,7 +268,8 @@ private: bool askUserConfirmCommand() const; bool packageNeedsUpdate(const LocalPackage &localPackage, const Package *update) const; void commitPendingUnstableComponents(); - void createDependencyHashes(const Component* component); + void createAutoDependencyHash(const QString &componentName, const QString &oldValue, const QString &newValue); + void createLocalDependencyHash(const QString &componentName, const QString &dependencies); void updateComponentCheckedState(); // remove once we deprecate isSelected, setSelected etc... |