summaryrefslogtreecommitdiffstats
path: root/src/libs/installer
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/installer')
-rw-r--r--src/libs/installer/packagemanagercore.cpp43
-rw-r--r--src/libs/installer/packagemanagercore.h3
-rw-r--r--src/libs/installer/uninstallercalculator.cpp9
-rw-r--r--src/libs/installer/uninstallercalculator.h2
4 files changed, 50 insertions, 7 deletions
diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp
index d2c732ddb..820c97cb9 100644
--- a/src/libs/installer/packagemanagercore.cpp
+++ b/src/libs/installer/packagemanagercore.cpp
@@ -1,6 +1,6 @@
/**************************************************************************
**
-** Copyright (C) 2021 The Qt Company Ltd.
+** Copyright (C) 2022 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Installer Framework.
@@ -2251,6 +2251,47 @@ QList<Component*> PackageManagerCore::dependees(const Component *_component) con
}
/*!
+ Returns a list of components that depend on \a component. The list can be
+ empty. Dependendants are calculated from components which are about to be updated,
+ if no update is requested then the dependant is calculated from installed packages.
+
+ \note Automatic dependencies are not resolved.
+*/
+QList<Component*> PackageManagerCore::installDependants(const Component *component) const
+{
+ if (!component)
+ return QList<Component *>();
+
+ const QList<QInstaller::Component *> availableComponents = components(ComponentType::All);
+ if (availableComponents.isEmpty())
+ return QList<Component *>();
+
+ QList<Component *> dependants;
+ QString name;
+ QString version;
+ foreach (Component *availableComponent, availableComponents) {
+ if (isUpdater() && availableComponent->updateRequested()) {
+ const QStringList &dependencies = availableComponent->dependencies();
+ foreach (const QString &dependency, dependencies) {
+ parseNameAndVersion(dependency, &name, &version);
+ if (componentMatches(component, name, version)) {
+ dependants.append(availableComponent);
+ }
+ }
+ } else {
+ KDUpdater::LocalPackage localPackage = d->m_localPackageHub->packageInfo(availableComponent->name());
+ foreach (const QString &dependency, localPackage.dependencies) {
+ parseNameAndVersion(dependency, &name, &version);
+ if (componentMatches(component, name, version)) {
+ dependants.append(availableComponent);
+ }
+ }
+ }
+ }
+ return dependants;
+}
+
+/*!
Returns the default component model.
*/
ComponentModel *PackageManagerCore::defaultComponentModel() const
diff --git a/src/libs/installer/packagemanagercore.h b/src/libs/installer/packagemanagercore.h
index cf1916c48..012c57d58 100644
--- a/src/libs/installer/packagemanagercore.h
+++ b/src/libs/installer/packagemanagercore.h
@@ -1,6 +1,6 @@
/**************************************************************************
**
-** Copyright (C) 2021 The Qt Company Ltd.
+** Copyright (C) 2022 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Installer Framework.
@@ -242,6 +242,7 @@ public:
QString installReason(Component *component) const;
QList<Component*> dependees(const Component *component) const;
+ QList<Component*> installDependants(const Component *component) const;
ComponentModel *defaultComponentModel() const;
ComponentModel *updaterComponentModel() const;
diff --git a/src/libs/installer/uninstallercalculator.cpp b/src/libs/installer/uninstallercalculator.cpp
index fc5620936..7d5ce9e2a 100644
--- a/src/libs/installer/uninstallercalculator.cpp
+++ b/src/libs/installer/uninstallercalculator.cpp
@@ -127,10 +127,10 @@ void UninstallerCalculator::appendComponentsToUninstall(const QList<Component*>
if (!autoDependOnList.isEmpty())
appendComponentsToUninstall(autoDependOnList);
else
- continueAppendComponentsToUninstall();
+ appendVirtualComponentsToUninstall();
}
-void UninstallerCalculator::continueAppendComponentsToUninstall()
+void UninstallerCalculator::appendVirtualComponentsToUninstall()
{
QList<Component*> unneededVirtualList;
// Check for virtual components without dependees
@@ -141,8 +141,9 @@ void UninstallerCalculator::continueAppendComponentsToUninstall()
continue;
bool required = false;
- for (Component *dependee : m_core->dependees(component)) {
- if (dependee->isInstalled() && !m_componentsToUninstall.contains(dependee)) {
+ // Check if installed or about to be updated -packages are dependant on the package
+ for (Component *dependant : m_core->installDependants(component)) {
+ if (dependant->isInstalled() && !m_componentsToUninstall.contains(dependant)) {
required = true;
break;
}
diff --git a/src/libs/installer/uninstallercalculator.h b/src/libs/installer/uninstallercalculator.h
index 4d1f8816a..fb7035d4e 100644
--- a/src/libs/installer/uninstallercalculator.h
+++ b/src/libs/installer/uninstallercalculator.h
@@ -52,7 +52,7 @@ public:
private:
void appendComponentToUninstall(Component *component);
- void continueAppendComponentsToUninstall();
+ void appendVirtualComponentsToUninstall();
QList<Component *> m_installedComponents;
QSet<Component *> m_componentsToUninstall;