summaryrefslogtreecommitdiffstats
path: root/src/libs/installer/packagemanagercore_p.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/installer/packagemanagercore_p.cpp')
-rw-r--r--src/libs/installer/packagemanagercore_p.cpp73
1 files changed, 66 insertions, 7 deletions
diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp
index 73738d1cb..fc7a8e2c0 100644
--- a/src/libs/installer/packagemanagercore_p.cpp
+++ b/src/libs/installer/packagemanagercore_p.cpp
@@ -430,12 +430,13 @@ bool PackageManagerCorePrivate::buildComponentTree(QHash<QString, Component*> &c
m_core->appendRootComponent(component);
}
- // after everything is set up, load the scripts if needed
- if (loadScript) {
- foreach (QInstaller::Component *component, components)
+ // after everything is set up, load the scripts if needed and create helper hashes
+ // for autodependency and dependency components for quicker search later
+ foreach (QInstaller::Component *component, components) {
+ if (loadScript)
component->loadComponentScript();
+ createDependencyHashes(component);
}
-
// now we can preselect components in the tree
foreach (QInstaller::Component *component, components) {
// set the checked state for all components without child (means without tristate)
@@ -490,6 +491,10 @@ bool PackageManagerCorePrivate::buildComponentTree(QHash<QString, Component*> &c
void PackageManagerCorePrivate::cleanUpComponentEnvironment()
{
+ m_componentReplaces.clear();
+ m_autoDependencyComponentHash.clear();
+ m_dependencyComponentHash.clear();
+ m_localVirtualComponents.clear();
// clean up registered (downloaded) data
if (m_core->isMaintainer())
BinaryFormatEngineHandler::instance()->clear();
@@ -565,6 +570,26 @@ QHash<QString, QPair<Component*, Component*> > &PackageManagerCorePrivate::compo
return (!isUpdater()) ? m_componentsToReplaceAllMode : m_componentsToReplaceUpdaterMode;
}
+QHash<QString, QStringList> &PackageManagerCorePrivate::componentReplaces()
+{
+ return m_componentReplaces;
+}
+
+QList<Component*> PackageManagerCorePrivate::replacedComponentsByName(const QString &name)
+{
+ // Creates a list of components which are replaced by component 'name'
+ QList<Component*> replacedComponents;
+ if (m_componentReplaces.contains(name)) {
+ for (const QString &replacedComponentName : m_componentReplaces.value(name)) {
+ Component *replacedComponent = m_core->componentByName(replacedComponentName,
+ m_core->components(PackageManagerCore::ComponentType::All));
+ if (replacedComponent)
+ replacedComponents.append(replacedComponent);
+ }
+ }
+ return replacedComponents;
+}
+
void PackageManagerCorePrivate::clearInstallerCalculator()
{
delete m_installerCalculator;
@@ -576,7 +601,7 @@ InstallerCalculator *PackageManagerCorePrivate::installerCalculator() const
if (!m_installerCalculator) {
PackageManagerCorePrivate *const pmcp = const_cast<PackageManagerCorePrivate *> (this);
pmcp->m_installerCalculator = new InstallerCalculator(
- m_core->components(PackageManagerCore::ComponentType::AllNoReplacements));
+ m_core->components(PackageManagerCore::ComponentType::AllNoReplacements), pmcp->m_autoDependencyComponentHash);
}
return m_installerCalculator;
}
@@ -600,7 +625,8 @@ UninstallerCalculator *PackageManagerCorePrivate::uninstallerCalculator() const
}
}
- pmcp->m_uninstallerCalculator = new UninstallerCalculator(installedComponents, m_core);
+ pmcp->m_uninstallerCalculator = new UninstallerCalculator(installedComponents, m_core,
+ pmcp->m_autoDependencyComponentHash, pmcp->m_dependencyComponentHash, pmcp->m_localVirtualComponents);
}
return m_uninstallerCalculator;
}
@@ -2685,8 +2711,11 @@ LocalPackagesHash PackageManagerCorePrivate::localInstalledPackages()
if (statusCanceledOrFailed())
break;
installedPackages.insert(package.name, package);
+ if (package.virtualComp && package.autoDependencies.isEmpty()) {
+ if (!m_localVirtualComponents.contains(package.name))
+ m_localVirtualComponents.append(package.name);
+ }
}
-
return installedPackages;
}
@@ -2823,6 +2852,19 @@ void PackageManagerCorePrivate::storeCheckState()
m_coreCheckedHash.insert(component, component->checkState());
}
+void PackageManagerCorePrivate::updateComponentCheckedState()
+{
+ for (Component *component : m_core->components(PackageManagerCore::ComponentType::All)) {
+ component->setInstallAction(component->isInstalled()
+ ? ComponentModelHelper::KeepInstalled
+ : ComponentModelHelper::KeepUninstalled);
+ }
+ for (Component *component : uninstallerCalculator()->componentsToUninstall())
+ component->setInstallAction(ComponentModelHelper::Uninstall);
+ for (Component *component : installerCalculator()->orderedComponentsToInstall())
+ component->setInstallAction(ComponentModelHelper::Install);
+}
+
void PackageManagerCorePrivate::connectOperationCallMethodRequest(Operation *const operation)
{
QObject *const operationObject = dynamic_cast<QObject *> (operation);
@@ -3093,4 +3135,21 @@ void PackageManagerCorePrivate::commitPendingUnstableComponents()
m_pendingUnstableComponents.clear();
}
+void PackageManagerCorePrivate::createDependencyHashes(const Component* component)
+{
+ for (const QString &autodepend : component->autoDependencies()) {
+ QStringList value = m_autoDependencyComponentHash.value(autodepend);
+ if (!value.contains(component->name()))
+ value.append(component->name());
+ m_autoDependencyComponentHash.insert(autodepend, value);
+ }
+
+ for (const QString &depend : component->dependencies()) {
+ QStringList value = m_dependencyComponentHash.value(depend);
+ if (!value.contains(component->name()))
+ value.append(component->name());
+ m_dependencyComponentHash.insert(depend, value);
+ }
+}
+
} // namespace QInstaller