diff options
author | Katja Marttila <katja.marttila@qt.io> | 2018-05-14 14:58:25 +0300 |
---|---|---|
committer | Katja Marttila <katja.marttila@qt.io> | 2018-06-04 03:14:49 +0000 |
commit | 83cc3b6b88e40353cd0e03e88a6fe1abeba038d5 (patch) | |
tree | 867f6909d05f49c3eb0b1825d20002f057b916a0 /src/libs/installer | |
parent | 88d85a78949194aafa67340d3afdbc90594f9064 (diff) |
Allow install other components if sha mismatches in metadata
Expanding commit "Add attribute to mark parts of install tree unstable."
This change will allow installing other components if some component
has sha mismatch.
Change-Id: I61202da95dc07ca3f1fe931cfe1fbbb053596f42
Reviewed-by: Iikka Eklund <iikka.eklund@qt.io>
Diffstat (limited to 'src/libs/installer')
-rw-r--r-- | src/libs/installer/abstractfiletask.h | 6 | ||||
-rw-r--r-- | src/libs/installer/copyfiletask.cpp | 2 | ||||
-rw-r--r-- | src/libs/installer/downloadfiletask.cpp | 10 | ||||
-rw-r--r-- | src/libs/installer/metadatajob.cpp | 11 | ||||
-rw-r--r-- | src/libs/installer/metadatajob.h | 2 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore.cpp | 9 |
6 files changed, 33 insertions, 7 deletions
diff --git a/src/libs/installer/abstractfiletask.h b/src/libs/installer/abstractfiletask.h index d008ee4ea..c80d0c708 100644 --- a/src/libs/installer/abstractfiletask.h +++ b/src/libs/installer/abstractfiletask.h @@ -44,6 +44,8 @@ enum TaskRole TaskItem, SourceFile, TargetFile, + Name, + ChecksumMismatch, UserRole = 1000 }; } @@ -70,16 +72,18 @@ class FileTaskResult : public AbstractTaskData { public: FileTaskResult() {} - FileTaskResult(const QString &t, const QByteArray &c, const FileTaskItem &i) + FileTaskResult(const QString &t, const QByteArray &c, const FileTaskItem &i, bool checksumMismatch) { insert(TaskRole::Checksum, c); insert(TaskRole::TargetFile, t); insert(TaskRole::TaskItem, QVariant::fromValue(i)); + insert(TaskRole::ChecksumMismatch, checksumMismatch); } QString target() const { return value(TaskRole::TargetFile).toString(); } QByteArray checkSum() const { return value(TaskRole::Checksum).toByteArray(); } FileTaskItem taskItem() const { return value(TaskRole::TaskItem).value<FileTaskItem>(); } + bool checksumMismatch() const { return value(TaskRole::ChecksumMismatch).toBool(); } }; class INSTALLER_EXPORT AbstractFileTask : public AbstractTask<FileTaskResult> diff --git a/src/libs/installer/copyfiletask.cpp b/src/libs/installer/copyfiletask.cpp index b3cd61aa2..fdde9b15d 100644 --- a/src/libs/installer/copyfiletask.cpp +++ b/src/libs/installer/copyfiletask.cpp @@ -111,7 +111,7 @@ void CopyFileTask::doTask(QFutureInterface<FileTaskResult> &fi) fi.setProgressValueAndText(observer.progressValue(), observer.progressText()); } - fi.reportResult(FileTaskResult(file->fileName(), observer.checkSum(), item), 0); + fi.reportResult(FileTaskResult(file->fileName(), observer.checkSum(), item, false), 0); fi.reportFinished(); } diff --git a/src/libs/installer/downloadfiletask.cpp b/src/libs/installer/downloadfiletask.cpp index 2c99e04e1..a5d47ad3b 100644 --- a/src/libs/installer/downloadfiletask.cpp +++ b/src/libs/installer/downloadfiletask.cpp @@ -225,13 +225,13 @@ void Downloader::onFinished(QNetworkReply *reply) } const QByteArray expectedCheckSum = data.taskItem.value(TaskRole::Checksum).toByteArray(); + bool checksumMismatch = false; if (!expectedCheckSum.isEmpty()) { - if (expectedCheckSum != data.observer->checkSum().toHex()) { - m_futureInterface->reportException(TaskException(tr("Checksum mismatch detected for \"%1\".") - .arg(reply->url().toString()))); - } + if (expectedCheckSum != data.observer->checkSum().toHex()) + checksumMismatch = true; } - m_futureInterface->reportResult(FileTaskResult(filename, data.observer->checkSum(), data.taskItem)); + m_futureInterface->reportResult(FileTaskResult(filename, data.observer->checkSum(), data.taskItem, + checksumMismatch)); m_downloads.erase(reply); m_redirects.remove(reply); diff --git a/src/libs/installer/metadatajob.cpp b/src/libs/installer/metadatajob.cpp index bd577fecf..e14032640 100644 --- a/src/libs/installer/metadatajob.cpp +++ b/src/libs/installer/metadatajob.cpp @@ -383,6 +383,16 @@ void MetadataJob::metadataTaskFinished() emit infoMessage(this, tr("Extracting meta information...")); foreach (const FileTaskResult &result, m_metadataResult) { const FileTaskItem item = result.value(TaskRole::TaskItem).value<FileTaskItem>(); + if (result.value(TaskRole::ChecksumMismatch).toBool()) { + QString mismatchMessage = tr("Checksum mismatch detected for \"%1\".") + .arg(item.value(TaskRole::SourceFile).toString()); + if (m_core->settings().allowUnstableComponents()) { + m_shaMissmatchPackages.append(item.value(TaskRole::Name).toString()); + qWarning() << mismatchMessage; + } else { + throw QInstaller::TaskException(mismatchMessage); + } + } UnzipArchiveTask *task = new UnzipArchiveTask(result.target(), item.value(TaskRole::UserRole).toString()); @@ -555,6 +565,7 @@ MetadataJob::Status MetadataJob::parseUpdatesXml(const QList<FileTaskResult> &re item.insert(TaskRole::UserRole, metadata.directory); item.insert(TaskRole::Checksum, packageHash.toLatin1()); item.insert(TaskRole::Authenticator, QVariant::fromValue(authenticator)); + item.insert(TaskRole::Name, packageName); m_packages.append(item); } } diff --git a/src/libs/installer/metadatajob.h b/src/libs/installer/metadatajob.h index f3f480f6c..e3f5aceea 100644 --- a/src/libs/installer/metadatajob.h +++ b/src/libs/installer/metadatajob.h @@ -65,6 +65,7 @@ public: Repository repositoryForDirectory(const QString &directory) const; void setPackageManagerCore(PackageManagerCore *core) { m_core = core; } void addCompressedPackages(bool addCompressPackage) { m_addCompressedPackages = addCompressPackage;} + QStringList shaMismatchPackages() const { return m_shaMissmatchPackages; } private slots: void doStart(); @@ -101,6 +102,7 @@ private: int m_downloadableChunkSize; int m_taskNumber; int m_totalTaskCount; + QStringList m_shaMissmatchPackages; }; } // namespace QInstaller diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp index 07559b486..e42b6e6b4 100644 --- a/src/libs/installer/packagemanagercore.cpp +++ b/src/libs/installer/packagemanagercore.cpp @@ -2573,6 +2573,15 @@ bool PackageManagerCore::updateComponentData(struct Data &data, Component *compo return false; } + if (settings().allowUnstableComponents()) { + // Check if there are sha checksum mismatch. Component will still show in install tree + // but is unselectable. + foreach (const QString packageName, d->m_metadataJob.shaMismatchPackages()) { + if (packageName == component->name()) + component->setUnstable(); + } + } + component->setUninstalled(); const QString localPath = component->localTempPath(); if (isVerbose()) { |