summaryrefslogtreecommitdiffstats
path: root/src/libs/installer/packagemanagercore_p.cpp
diff options
context:
space:
mode:
authorjkobus <jaroslaw.kobus@digia.com>2014-10-07 16:01:45 +0200
committerJarek Kobus <jaroslaw.kobus@digia.com>2014-10-10 15:09:52 +0200
commit7f97957097ab38ae6e00c1325b840cc22cae33fc (patch)
treecf5e0e5c74bb3cc297c762f69e68842ea28f90b5 /src/libs/installer/packagemanagercore_p.cpp
parentc2fa6212a9a255cb8c5995d0226d023ce8a75dc7 (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.cpp127
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> &params)
{
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())