diff options
Diffstat (limited to 'src/libs/installer/installercalculator.cpp')
-rw-r--r-- | src/libs/installer/installercalculator.cpp | 78 |
1 files changed, 49 insertions, 29 deletions
diff --git a/src/libs/installer/installercalculator.cpp b/src/libs/installer/installercalculator.cpp index 65713dc74..064dbafa5 100644 --- a/src/libs/installer/installercalculator.cpp +++ b/src/libs/installer/installercalculator.cpp @@ -71,7 +71,7 @@ QString InstallerCalculator::installReason(Component *component) const "Components added as automatic dependencies:"); case Dependent: return QCoreApplication::translate("InstallerCalculator", "Components added as " - "dependency for '%1':").arg(installReasonReferencedComponent(component)); + "dependency for \"%1\":").arg(installReasonReferencedComponent(component)); case Resolved: return QCoreApplication::translate("InstallerCalculator", "Components that have resolved dependencies:"); @@ -92,9 +92,9 @@ QString InstallerCalculator::componentsToInstallError() const return m_componentsToInstallError; } -void InstallerCalculator::realAppendToInstallComponents(Component *component) +void InstallerCalculator::realAppendToInstallComponents(Component *component, const QString &version) { - if (!component->isInstalled() || component->updateRequested()) { + if (!component->isInstalled(version) || component->updateRequested()) { m_orderedComponentsToInstall.append(component); m_toInstallComponentIds.insert(component->name()); } @@ -102,8 +102,8 @@ void InstallerCalculator::realAppendToInstallComponents(Component *component) QString InstallerCalculator::recursionError(Component *component) { - return QCoreApplication::translate("InstallerCalculator", "Recursion detected, component '%1' " - "already added with reason: '%2'").arg(component->name(), installReason(component)); + return QCoreApplication::translate("InstallerCalculator", "Recursion detected, component \"%1\" " + "already added with reason: \"%2\"").arg(component->name(), installReason(component)); } bool InstallerCalculator::appendComponentsToInstall(const QList<Component *> &components) @@ -115,7 +115,7 @@ bool InstallerCalculator::appendComponentsToInstall(const QList<Component *> &co foreach (Component *component, components){ if (m_toInstallComponentIds.contains(component->name())) { const QString errorMessage = recursionError(component); - qWarning() << errorMessage; + qWarning().noquote() << errorMessage; m_componentsToInstallError.append(errorMessage); Q_ASSERT_X(!m_toInstallComponentIds.contains(component->name()), Q_FUNC_INFO, qPrintable(errorMessage)); @@ -154,10 +154,10 @@ bool InstallerCalculator::appendComponentsToInstall(const QList<Component *> &co return true; } -bool InstallerCalculator::appendComponentToInstall(Component *component) +bool InstallerCalculator::appendComponentToInstall(Component *component, const QString &version) { QSet<QString> allDependencies = component->dependencies().toSet(); - + QString requiredDependencyVersion = version; foreach (const QString &dependencyComponentName, allDependencies) { // PackageManagerCore::componentByName returns 0 if dependencyComponentName contains a // version which is not available @@ -165,36 +165,56 @@ bool InstallerCalculator::appendComponentToInstall(Component *component) PackageManagerCore::componentByName(dependencyComponentName, m_allComponents); if (!dependencyComponent) { const QString errorMessage = QCoreApplication::translate("InstallerCalculator", - "Cannot find missing dependency '%1' for '%2'.").arg(dependencyComponentName, + "Cannot find missing dependency \"%1\" for \"%2\".").arg(dependencyComponentName, component->name()); - qWarning() << errorMessage; + qWarning().noquote() << errorMessage; m_componentsToInstallError.append(errorMessage); return false; } + //Check if component requires higher version than what might be already installed + bool isUpdateRequired = false; + if (dependencyComponentName.contains(QChar::fromLatin1('-')) && + !dependencyComponent->value(scInstalledVersion).isEmpty()) { + QRegExp compEx(QLatin1String("([<=>]+)(.*)")); + const QString installedVersion = compEx.exactMatch(dependencyComponent->value(scInstalledVersion)) ? + compEx.cap(2) : dependencyComponent->value(scInstalledVersion); + + QString requiredVersion = dependencyComponentName.section(QLatin1Char('-'), 1); + requiredVersion = compEx.exactMatch(requiredVersion) ? compEx.cap(2) : requiredVersion; + + if (KDUpdater::compareVersion(requiredVersion, installedVersion) >= 1 ) { + isUpdateRequired = true; + requiredDependencyVersion = requiredVersion; + } + } + //Check dependencies only if + //- Dependency is not installed or update requested, nor newer version of dependency component required + //- And dependency component is not already added for install + //- And component is not already added for install, then dependencies are already resolved + if (((!dependencyComponent->isInstalled() || dependencyComponent->updateRequested()) + || isUpdateRequired) && (!m_toInstallComponentIds.contains(dependencyComponent->name()) + && !m_toInstallComponentIds.contains(component->name()))) { + if (m_visitedComponents.value(component).contains(dependencyComponent)) { + const QString errorMessage = recursionError(component); + qWarning().noquote() << errorMessage; + m_componentsToInstallError = errorMessage; + Q_ASSERT_X(!m_visitedComponents.value(component).contains(dependencyComponent), + Q_FUNC_INFO, qPrintable(errorMessage)); + return false; + } + m_visitedComponents[component].insert(dependencyComponent); + + // add needed dependency components to the next run + insertInstallReason(dependencyComponent, InstallerCalculator::Dependent, + component->name()); - if ((!dependencyComponent->isInstalled() || dependencyComponent->updateRequested()) - && !m_toInstallComponentIds.contains(dependencyComponent->name())) { - if (m_visitedComponents.value(component).contains(dependencyComponent)) { - const QString errorMessage = recursionError(component); - qWarning() << errorMessage; - m_componentsToInstallError = errorMessage; - Q_ASSERT_X(!m_visitedComponents.value(component).contains(dependencyComponent), - Q_FUNC_INFO, qPrintable(errorMessage)); - return false; - } - m_visitedComponents[component].insert(dependencyComponent); - - // add needed dependency components to the next run - insertInstallReason(dependencyComponent, InstallerCalculator::Dependent, - component->name()); - - if (!appendComponentToInstall(dependencyComponent)) - return false; + if (!appendComponentToInstall(dependencyComponent, requiredDependencyVersion)) + return false; } } if (!m_toInstallComponentIds.contains(component->name())) { - realAppendToInstallComponents(component); + realAppendToInstallComponents(component, requiredDependencyVersion); insertInstallReason(component, InstallerCalculator::Resolved); } return true; |