diff options
-rw-r--r-- | doc/installerfw.qdoc | 5 | ||||
-rw-r--r-- | src/libs/installer/extractarchiveoperation_p.h | 8 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore.cpp | 38 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore.h | 3 | ||||
-rw-r--r-- | src/libs/installer/scriptengine.cpp | 2 | ||||
-rw-r--r-- | src/sdk/installerbasecommons.cpp | 2 |
6 files changed, 49 insertions, 9 deletions
diff --git a/doc/installerfw.qdoc b/doc/installerfw.qdoc index b766eb78f..682bca95a 100644 --- a/doc/installerfw.qdoc +++ b/doc/installerfw.qdoc @@ -495,7 +495,10 @@ \o Essential \o Marks the package as essential to force a restart of the \c UpdateAgent or \c MaintenanceTool. This is relevant for - updates found with \c UpdateAgent. + updates found with \c UpdateAgent. If there are updates available + for an essential component, the package manager stays disabled + until that component is updated. Newly introduced essential components + are automatically installed when running the updater. \row \o ForcedInstallation \o Determines that the package must always be installed. End users diff --git a/src/libs/installer/extractarchiveoperation_p.h b/src/libs/installer/extractarchiveoperation_p.h index 44e75a949..4e0632830 100644 --- a/src/libs/installer/extractarchiveoperation_p.h +++ b/src/libs/installer/extractarchiveoperation_p.h @@ -117,9 +117,11 @@ public Q_SLOTS: case PackageManagerCore::Failure: state = E_FAIL; break; - case PackageManagerCore::Unfinished: // fall through - case PackageManagerCore::Success: - case PackageManagerCore::Running: + default: // fall through + // PackageManagerCore::Unfinished, PackageManagerCore::Success, PackageManagerCore::Running + // PackageManagerCore::ForceUpdate + + // already set //state = S_OK; break; } diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp index 3030777f8..36c16e87a 100644 --- a/src/libs/installer/packagemanagercore.cpp +++ b/src/libs/installer/packagemanagercore.cpp @@ -887,9 +887,39 @@ bool PackageManagerCore::fetchRemotePackagesTree() return false; bool success = false; - if (!isUpdater()) + if (!isUpdater()) { success = fetchAllPackages(packages, installedPackages); - else { + if (success && !d->statusCanceledOrFailed() && isPackageManager()) { + foreach (Package *const update, packages) { + if (update->data(scEssential, scFalse).toString().toLower() == scTrue) { + const QString name = update->data(scName).toString(); + if (!installedPackages.contains(name)) { + success = false; + break; // unusual, the maintenance tool should always be available + } + + const LocalPackage localPackage = installedPackages.value(name); + const QString updateVersion = update->data(scRemoteVersion).toString(); + if (KDUpdater::compareVersion(updateVersion, localPackage.version) <= 0) + break; // remote version equals or is less than the installed maintenance tool + + const QDate updateDate = update->data(scReleaseDate).toDate(); + if (localPackage.lastUpdateDate >= updateDate) + break; // remote release date equals or is less than the installed maintenance tool + + success = false; + break; // we found a newer version of the maintenance tool + } + } + + if (!success && !d->statusCanceledOrFailed()) { + updateDisplayVersions(scRemoteDisplayVersion); + d->setStatus(ForceUpdate, tr("There is an important update available, please run the " + "updater first.")); + return false; + } + } + } else { success = fetchUpdaterPackages(packages, installedPackages); } @@ -2185,7 +2215,9 @@ bool PackageManagerCore::fetchUpdaterPackages(const PackagesList &remotes, const } } - if (!isValidUpdate) + // break if the update is not valid and if it's not the maintenance tool (we might get an update + // for the maintenance tool even if it's not currently installed - possible offline installation) + if (!isValidUpdate && (update->data(scEssential, scFalse).toString().toLower() == scFalse)) continue; // Update for not installed package found, skip it. const LocalPackage &localPackage = locals.value(name); diff --git a/src/libs/installer/packagemanagercore.h b/src/libs/installer/packagemanagercore.h index 24fbc4d64..20a3293fa 100644 --- a/src/libs/installer/packagemanagercore.h +++ b/src/libs/installer/packagemanagercore.h @@ -82,7 +82,8 @@ public: Failure = EXIT_FAILURE, Running, Canceled, - Unfinished + Unfinished, + ForceUpdate }; Status status() const; QString error() const; diff --git a/src/libs/installer/scriptengine.cpp b/src/libs/installer/scriptengine.cpp index 9ff8ae75e..b6a8a971a 100644 --- a/src/libs/installer/scriptengine.cpp +++ b/src/libs/installer/scriptengine.cpp @@ -402,6 +402,8 @@ QScriptValue ScriptEngine::generateQInstallerObject() qinstaller.setProperty(QLatin1String("Failure"), PackageManagerCore::Failure); qinstaller.setProperty(QLatin1String("Running"), PackageManagerCore::Running); qinstaller.setProperty(QLatin1String("Canceled"), PackageManagerCore::Canceled); + qinstaller.setProperty(QLatin1String("Unfinished"), PackageManagerCore::Unfinished); + qinstaller.setProperty(QLatin1String("ForceUpdate"), PackageManagerCore::ForceUpdate); return qinstaller; } diff --git a/src/sdk/installerbasecommons.cpp b/src/sdk/installerbasecommons.cpp index 96da93488..b651b30cd 100644 --- a/src/sdk/installerbasecommons.cpp +++ b/src/sdk/installerbasecommons.cpp @@ -177,7 +177,7 @@ bool IntroductionPageImpl::validatePage() m_allPackagesFetched = core->fetchRemotePackagesTree(); if (!m_allPackagesFetched) { QString error = core->error(); - if (core->isPackageManager()) { + if (core->isPackageManager() && core->status() != PackageManagerCore::ForceUpdate) { // if that fails and we're in maintenance mode, try to fetch local installed tree localPackagesTreeFetched = core->fetchLocalPackagesTree(); if (localPackagesTreeFetched) { |