diff options
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... |