diff options
Diffstat (limited to 'src/libs/installer/uninstallercalculator.cpp')
-rw-r--r-- | src/libs/installer/uninstallercalculator.cpp | 86 |
1 files changed, 30 insertions, 56 deletions
diff --git a/src/libs/installer/uninstallercalculator.cpp b/src/libs/installer/uninstallercalculator.cpp index 36d769207..2f029630f 100644 --- a/src/libs/installer/uninstallercalculator.cpp +++ b/src/libs/installer/uninstallercalculator.cpp @@ -30,9 +30,6 @@ #include "component.h" #include "packagemanagercore.h" -#include "globals.h" - -#include <QDebug> namespace QInstaller { @@ -42,13 +39,11 @@ namespace QInstaller { \internal */ -UninstallerCalculator::UninstallerCalculator(const QList<Component *> &installedComponents - , PackageManagerCore *core +UninstallerCalculator::UninstallerCalculator(PackageManagerCore *core , const AutoDependencyHash &autoDependencyComponentHash , const LocalDependencyHash &localDependencyComponentHash , const QStringList &localVirtualComponents) - : m_installedComponents(installedComponents) - , m_core(core) + : m_core(core) , m_autoDependencyComponentHash(autoDependencyComponentHash) , m_localDependencyComponentHash(localDependencyComponentHash) , m_localVirtualComponents(localVirtualComponents) @@ -60,7 +55,7 @@ QSet<Component *> UninstallerCalculator::componentsToUninstall() const return m_componentsToUninstall; } -void UninstallerCalculator::appendComponentToUninstall(Component *component, const bool reverse) +void UninstallerCalculator::appendComponentToUninstall(Component *component) { if (!component) return; @@ -74,29 +69,22 @@ void UninstallerCalculator::appendComponentToUninstall(Component *component, con Component *depComponent = m_core->componentByName(dependencyComponent); if (!depComponent) continue; - if (depComponent->isInstalled() && !m_componentsToUninstall.contains(depComponent)) { - appendComponentToUninstall(depComponent, reverse); + if (depComponent->isInstalled() && !m_componentsToUninstall.contains(depComponent) + && !m_core->orderedComponentsToInstall().contains(depComponent)) { + appendComponentToUninstall(depComponent); insertUninstallReason(depComponent, UninstallerCalculator::Dependent, component->name()); - } else if (reverse && depComponent->isVirtual()) { - // Remove from uninstall only hidden components, user - // can select other dependencies manually - appendComponentToUninstall(depComponent, true); } } } - if (reverse) { - m_componentsToUninstall.remove(component); - } else { - m_componentsToUninstall.insert(component); - } + + m_componentsToUninstall.insert(component); } -void UninstallerCalculator::appendComponentsToUninstall(const QList<Component*> &components, const bool reverse) +void UninstallerCalculator::appendComponentsToUninstall(const QList<Component*> &components) { - if (components.isEmpty()) - return; foreach (Component *component, components) - appendComponentToUninstall(component, reverse); + appendComponentToUninstall(component); + QList<Component*> autoDependOnList; // All regular dependees are resolved. Now we are looking for auto depend on components. for (Component *component : components) { @@ -108,9 +96,7 @@ void UninstallerCalculator::appendComponentsToUninstall(const QList<Component*> Component *autoDepComponent = m_core->componentByName(autoDependencyComponent); if (autoDepComponent && autoDepComponent->isInstalled()) { // A component requested auto uninstallation, keep it to resolve their dependencies as well. - if (reverse) { - autoDependOnList.append(autoDepComponent); - } else if (!m_componentsToUninstall.contains(autoDepComponent)) { + if (!m_componentsToUninstall.contains(autoDepComponent)) { insertUninstallReason(autoDepComponent, UninstallerCalculator::AutoDependent, component->name()); autoDepComponent->setInstallAction(ComponentModelHelper::AutodependUninstallation); autoDependOnList.append(autoDepComponent); @@ -118,15 +104,11 @@ void UninstallerCalculator::appendComponentsToUninstall(const QList<Component*> } } } + if (!autoDependOnList.isEmpty()) - appendComponentsToUninstall(autoDependOnList, reverse); + appendComponentsToUninstall(autoDependOnList); else - appendVirtualComponentsToUninstall(reverse); -} - -void UninstallerCalculator::removeComponentsFromUnInstall(const QList<Component*> &components) -{ - appendComponentsToUninstall(components, true); + appendVirtualComponentsToUninstall(); } void UninstallerCalculator::insertUninstallReason(Component *component, const UninstallReasonType uninstallReason, @@ -172,38 +154,30 @@ QString UninstallerCalculator::uninstallReasonReferencedComponent(Component *com return m_toUninstallComponentIdReasonHash.value(component->name()).second; } -void UninstallerCalculator::appendVirtualComponentsToUninstall(const bool reverse) +void UninstallerCalculator::appendVirtualComponentsToUninstall() { QList<Component*> unneededVirtualList; - // Check for virtual components without dependees - if (reverse) { - for (Component *reverseFromUninstall : qAsConst(m_virtualComponentsForReverse)) { - if (m_componentsToUninstall.contains(reverseFromUninstall) && (isRequiredVirtualPackage(reverseFromUninstall))) - unneededVirtualList.append(reverseFromUninstall); - } - } else { - for (const QString &componentName : qAsConst(m_localVirtualComponents)) { - Component *virtualComponent = m_core->componentByName(componentName, m_core->components(PackageManagerCore::ComponentType::All)); - if (!virtualComponent) - continue; + for (const QString &componentName : qAsConst(m_localVirtualComponents)) { + Component *virtualComponent = m_core->componentByName(componentName, m_core->components(PackageManagerCore::ComponentType::All)); + if (!virtualComponent) + continue; - if (virtualComponent->isInstalled() && !m_componentsToUninstall.contains(virtualComponent)) { - // Components with auto dependencies were handled in the previous step - if (!virtualComponent->autoDependencies().isEmpty() || virtualComponent->forcedInstallation()) - continue; + if (virtualComponent->isInstalled() && !m_componentsToUninstall.contains(virtualComponent)) { + // Components with auto dependencies were handled in the previous step + if (!virtualComponent->autoDependencies().isEmpty() || virtualComponent->forcedInstallation()) + continue; - if (!isRequiredVirtualPackage(virtualComponent)) { - unneededVirtualList.append(virtualComponent); - m_virtualComponentsForReverse.append(virtualComponent); - insertUninstallReason(virtualComponent, UninstallerCalculator::VirtualDependent); - } - } + if (!isRequiredVirtualPackage(virtualComponent)) { + unneededVirtualList.append(virtualComponent); + m_virtualComponentsForReverse.append(virtualComponent); + insertUninstallReason(virtualComponent, UninstallerCalculator::VirtualDependent); + } } } if (!unneededVirtualList.isEmpty()) - appendComponentsToUninstall(unneededVirtualList, reverse); + appendComponentsToUninstall(unneededVirtualList); } bool UninstallerCalculator::isRequiredVirtualPackage(Component *component) |