summaryrefslogtreecommitdiffstats
path: root/src/libs/installer
diff options
context:
space:
mode:
authorKatja Marttila <katja.marttila@qt.io>2018-05-14 14:58:25 +0300
committerKatja Marttila <katja.marttila@qt.io>2018-06-04 03:14:49 +0000
commit83cc3b6b88e40353cd0e03e88a6fe1abeba038d5 (patch)
tree867f6909d05f49c3eb0b1825d20002f057b916a0 /src/libs/installer
parent88d85a78949194aafa67340d3afdbc90594f9064 (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.h6
-rw-r--r--src/libs/installer/copyfiletask.cpp2
-rw-r--r--src/libs/installer/downloadfiletask.cpp10
-rw-r--r--src/libs/installer/metadatajob.cpp11
-rw-r--r--src/libs/installer/metadatajob.h2
-rw-r--r--src/libs/installer/packagemanagercore.cpp9
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()) {