diff options
author | jkobus <jaroslaw.kobus@digia.com> | 2014-10-07 16:01:45 +0200 |
---|---|---|
committer | Jarek Kobus <jaroslaw.kobus@digia.com> | 2014-10-10 15:09:52 +0200 |
commit | 7f97957097ab38ae6e00c1325b840cc22cae33fc (patch) | |
tree | cf5e0e5c74bb3cc297c762f69e68842ea28f90b5 /src/libs/installer/packagemanagercore_p.cpp | |
parent | c2fa6212a9a255cb8c5995d0226d023ce8a75dc7 (diff) |
Move the uninstallation calculations into UninstallerCalculator
Change-Id: I1b398815414430c2fab9a5c611b44e3a92c2fb39
Reviewed-by: Jarek Kobus <jaroslaw.kobus@digia.com>
Diffstat (limited to 'src/libs/installer/packagemanagercore_p.cpp')
-rw-r--r-- | src/libs/installer/packagemanagercore_p.cpp | 127 |
1 files changed, 28 insertions, 99 deletions
diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp index ca9aca625..5b31255e5 100644 --- a/src/libs/installer/packagemanagercore_p.cpp +++ b/src/libs/installer/packagemanagercore_p.cpp @@ -50,7 +50,6 @@ #include "errors.h" #include "fileio.h" #include "remotefileengine.h" -#include "globals.h" #include "graph.h" #include "messageboxhandler.h" #include "packagemanagercore.h" @@ -60,6 +59,7 @@ #include "qsettingswrapper.h" #include "remoteclient.h" #include "installercalculator.h" +#include "uninstallercalculator.h" #include "kdselfrestarter.h" #include "kdupdaterfiledownloaderfactory.h" @@ -198,6 +198,7 @@ PackageManagerCorePrivate::PackageManagerCorePrivate(PackageManagerCore *core) , m_componentScriptEngine(0) , m_controlScriptEngine(0) , m_installerCalculator(0) + , m_uninstallerCalculator(0) , m_proxyFactory(0) , m_defaultModel(0) , m_updaterModel(0) @@ -226,6 +227,7 @@ PackageManagerCorePrivate::PackageManagerCorePrivate(PackageManagerCore *core, q , m_componentScriptEngine(0) , m_controlScriptEngine(0) , m_installerCalculator(0) + , m_uninstallerCalculator(0) , m_proxyFactory(0) , m_defaultModel(0) , m_updaterModel(0) @@ -269,6 +271,7 @@ PackageManagerCorePrivate::~PackageManagerCorePrivate() clearAllComponentLists(); clearUpdaterComponentLists(); clearInstallerCalculator(); + clearUninstallerCalculator(); qDeleteAll(m_ownedOperations); qDeleteAll(m_performedOperationsOld); @@ -497,6 +500,30 @@ InstallerCalculator *PackageManagerCorePrivate::installerCalculator() const return m_installerCalculator; } +void PackageManagerCorePrivate::clearUninstallerCalculator() +{ + delete m_uninstallerCalculator; + m_uninstallerCalculator = 0; +} + +UninstallerCalculator *PackageManagerCorePrivate::uninstallerCalculator() const +{ + if (!m_uninstallerCalculator) { + PackageManagerCorePrivate *const pmcp = const_cast<PackageManagerCorePrivate *> (this); + + QList<Component*> installedComponents; + foreach (const QString &name, pmcp->localInstalledPackages().keys()) { + if (Component *component = m_core->componentByName(name)) { + if (!component->uninstallationRequested()) + installedComponents.append(component); + } + } + + pmcp->m_uninstallerCalculator = new UninstallerCalculator(installedComponents); + } + return m_uninstallerCalculator; +} + void PackageManagerCorePrivate::initialize(const QHash<QString, QString> ¶ms) { m_coreCheckedHash.clear(); @@ -2178,104 +2205,6 @@ bool PackageManagerCorePrivate::addUpdateResourcesFromRepositories(bool parseChe return m_updateSourcesAdded; } -bool PackageManagerCorePrivate::appendComponentToUninstall(Component *component) -{ - // remove all already resolved dependees - QSet<Component *> dependees = m_core->dependees(component).toSet().subtract(m_componentsToUninstall); - if (dependees.isEmpty()) { - component->setCheckState(Qt::Unchecked); - m_componentsToUninstall.insert(component); - return true; - } - - QSet<Component *> dependeesToResolve; - foreach (Component *dependee, dependees) { - if (dependee->isInstalled()) { - // keep them as already resolved - dependee->setCheckState(Qt::Unchecked); - m_componentsToUninstall.insert(dependee); - // gather possible dependees, keep them to resolve it later - dependeesToResolve.unite(m_core->dependees(dependee).toSet()); - } - } - - bool allResolved = true; - foreach (Component *dependee, dependeesToResolve) - allResolved &= appendComponentToUninstall(dependee); - - return allResolved; -} - -bool PackageManagerCorePrivate::appendComponentsToUninstall(const QList<Component*> &components) -{ - if (components.isEmpty()) { - qDebug() << "components list is empty in" << Q_FUNC_INFO; - return true; - } - - bool allResolved = true; - foreach (Component *component, components) { - if (component->isInstalled()) { - component->setCheckState(Qt::Unchecked); - m_componentsToUninstall.insert(component); - allResolved &= appendComponentToUninstall(component); - } - } - - QSet<Component*> installedComponents; - foreach (const QString &name, localInstalledPackages().keys()) { - if (Component *component = m_core->componentByName(name)) { - if (!component->uninstallationRequested()) - installedComponents.insert(component); - } - } - - QList<Component*> autoDependOnList; - if (allResolved) { - // All regular dependees are resolved. Now we are looking for auto depend on components. - foreach (Component *component, installedComponents) { - // If a components is installed and not yet scheduled for un-installation, check for auto depend. - if (component->isInstalled() && !m_componentsToUninstall.contains(component)) { - QStringList autoDependencies = component->autoDependencies(); - if (autoDependencies.isEmpty()) - continue; - - // This code needs to be enabled once the scripts use isInstalled, installationRequested and - // uninstallationRequested... - if (autoDependencies.first().compare(QLatin1String("script"), Qt::CaseInsensitive) == 0) { - //QScriptValue valueFromScript; - //try { - // valueFromScript = callScriptMethod(QLatin1String("isAutoDependOn")); - //} catch (const Error &error) { - // // keep the component, should do no harm - // continue; - //} - - //if (valueFromScript.isValid() && !valueFromScript.toBool()) - // autoDependOnList.append(component); - continue; - } - - foreach (Component *c, installedComponents) { - const QString replaces = c->value(scReplaces); - const QStringList possibleNames = replaces.split(QInstaller::commaRegExp(), - QString::SkipEmptyParts) << c->name(); - foreach (const QString &possibleName, possibleNames) - autoDependencies.removeAll(possibleName); - } - - // A component requested auto installation, keep it to resolve their dependencies as well. - if (!autoDependencies.isEmpty()) - autoDependOnList.append(component); - } - } - } - - if (!autoDependOnList.isEmpty()) - return appendComponentsToUninstall(autoDependOnList); - return allResolved; -} - void PackageManagerCorePrivate::restoreCheckState() { if (m_coreCheckedHash.isEmpty()) |