summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorkh1 <karsten.heimrich@digia.com>2013-08-13 13:49:46 +0200
committerKarsten Heimrich <karsten.heimrich@digia.com>2013-08-14 15:14:44 +0200
commit266c8c08935918632907d222fcfced0fb1e1b7cc (patch)
treee4e0b277d09d159bb38057c3e0bb4ba93620ee8e /src
parent39d88655f7f51a8c7edce1ad5497cb542bae372b (diff)
Force updating of Essential components.
Task-number: QTIFW-38 Task-number: QTIFW-155 This is necessary for correct functioning of the Maintenance Tool. Change-Id: I3844760bdd31abf547c660f82dda14a3da38c5da Reviewed-by: Niels Weber <niels.weber@digia.com> Reviewed-by: Leena Miettinen <riitta-leena.miettinen@digia.com> Reviewed-by: Tim Jenssen <tim.jenssen@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/libs/installer/extractarchiveoperation_p.h8
-rw-r--r--src/libs/installer/packagemanagercore.cpp38
-rw-r--r--src/libs/installer/packagemanagercore.h3
-rw-r--r--src/libs/installer/scriptengine.cpp2
-rw-r--r--src/sdk/installerbasecommons.cpp2
5 files changed, 45 insertions, 8 deletions
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) {