summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArttu Tarkiainen <arttu.tarkiainen@qt.io>2022-11-11 16:24:47 +0200
committerArttu Tarkiainen <arttu.tarkiainen@qt.io>2022-11-14 15:37:28 +0200
commitc5500a34e21f548533dea60d7c912882c56fe801 (patch)
treee7b46327f2cd6c5d37fc24634a1c00f38b166df0
parent2d001a3d8d4cde6264e9073e8d586d1e9855abd8 (diff)
MetadataJob: split refreshing cached items into its own method
The original method for the moved part was getting quite long. Change-Id: Icc892a7c3623dec3c94215fc553409d060d06aa2 Reviewed-by: Katja Marttila <katja.marttila@qt.io>
-rw-r--r--src/libs/installer/metadatajob.cpp92
-rw-r--r--src/libs/installer/metadatajob.h1
2 files changed, 56 insertions, 37 deletions
diff --git a/src/libs/installer/metadatajob.cpp b/src/libs/installer/metadatajob.cpp
index c28770192..5179896ac 100644
--- a/src/libs/installer/metadatajob.cpp
+++ b/src/libs/installer/metadatajob.cpp
@@ -738,43 +738,14 @@ MetadataJob::Status MetadataJob::parseUpdatesXml(const QList<FileTaskResult> &re
hash.addData(&file);
const QByteArray updatesChecksum = hash.result().toHex();
- Metadata *cachedMetadata = m_metaFromCache.itemByChecksum(updatesChecksum);
- if (cachedMetadata) {
- const Repository repository = item.value(TaskRole::UserRole).value<Repository>();
- if (cachedMetadata->isValid() && !repository.isCompressed()) {
- // Refresh repository information to cache. Same repository may appear in multiple
- // categories and the metadata may be available from default repositories simultaneously.
- cachedMetadata->setRepository(repository);
- if (!repository.categoryname().isEmpty())
- m_fetchedCategorizedRepositories.insert(repository); // For faster lookups
- else
- cachedMetadata->setAvailableFromDefaultRepository(true);
-
- // Refresh also persistent information, the url of the repository may have changed
- // from the last fetch.
- cachedMetadata->setPersistentRepositoryPath(repository.url());
-
- // search for additional repositories that we might need to check
- QDomDocument doc = cachedMetadata->updatesDocument();
- const MetadataJob::Status status
- = parseRepositoryUpdates(doc.documentElement(), result, cachedMetadata);
- if (status == XmlDownloadRetry) {
- // The repository update may have removed or replaced current repositories,
- // clear repository information from cached items and refresh on next fetch run.
- resetCacheRepositories();
- return status;
- }
+ bool refreshed;
+ Status status = refreshCacheItem(result, updatesChecksum, &refreshed);
+ if (status != XmlDownloadSuccess)
+ return status;
+
+ if (refreshed) // Found existing metadata
+ continue;
- continue;
- }
- // Missing or corrupted files, or compressed repository which takes priority
- // over remote repository. We will re-download and uncompress
- // the metadata. Remove broken item from the cache.
- if (!m_metaFromCache.removeItem(updatesChecksum)) {
- qCWarning(lcInstallerInstallLog) << m_metaFromCache.errorString();
- return XmlDownloadFailure;
- }
- }
metadata->setChecksum(updatesChecksum);
file.seek(0);
@@ -849,7 +820,7 @@ MetadataJob::Status MetadataJob::parseUpdatesXml(const QList<FileTaskResult> &re
m_fetchedMetadata.insert(metadataPath, metadata.take());
// search for additional repositories that we might need to check
- const MetadataJob::Status status = parseRepositoryUpdates(root, result, metadataPtr);
+ status = parseRepositoryUpdates(root, result, metadataPtr);
if (status == XmlDownloadRetry) {
// The repository update may have removed or replaced current repositories,
// clear repository information from cached items and refresh on next fetch run.
@@ -864,6 +835,53 @@ MetadataJob::Status MetadataJob::parseUpdatesXml(const QList<FileTaskResult> &re
return XmlDownloadSuccess;
}
+MetadataJob::Status MetadataJob::refreshCacheItem(const FileTaskResult &result,
+ const QByteArray &checksum, bool *refreshed)
+{
+ Q_ASSERT(refreshed);
+ *refreshed = false;
+
+ Metadata *cachedMetadata = m_metaFromCache.itemByChecksum(checksum);
+ if (!cachedMetadata)
+ return XmlDownloadSuccess;
+
+ const FileTaskItem item = result.value(TaskRole::TaskItem).value<FileTaskItem>();
+ const Repository repository = item.value(TaskRole::UserRole).value<Repository>();
+ if (cachedMetadata->isValid() && !repository.isCompressed()) {
+ // Refresh repository information to cache. Same repository may appear in multiple
+ // categories and the metadata may be available from default repositories simultaneously.
+ cachedMetadata->setRepository(repository);
+ if (!repository.categoryname().isEmpty())
+ m_fetchedCategorizedRepositories.insert(repository); // For faster lookups
+ else
+ cachedMetadata->setAvailableFromDefaultRepository(true);
+
+ // Refresh also persistent information, the url of the repository may have changed
+ // from the last fetch.
+ cachedMetadata->setPersistentRepositoryPath(repository.url());
+
+ // search for additional repositories that we might need to check
+ QDomDocument doc = cachedMetadata->updatesDocument();
+ const Status status = parseRepositoryUpdates(doc.documentElement(), result, cachedMetadata);
+ if (status == XmlDownloadRetry) {
+ // The repository update may have removed or replaced current repositories,
+ // clear repository information from cached items and refresh on next fetch run.
+ resetCacheRepositories();
+ return status;
+ }
+ *refreshed = true;
+ return XmlDownloadSuccess;
+ }
+ // Missing or corrupted files, or compressed repository which takes priority
+ // over remote repository. We will re-download and uncompress
+ // the metadata. Remove broken item from the cache.
+ if (!m_metaFromCache.removeItem(checksum)) {
+ qCWarning(lcInstallerInstallLog) << m_metaFromCache.errorString();
+ return XmlDownloadFailure;
+ }
+ return XmlDownloadSuccess;
+}
+
MetadataJob::Status MetadataJob::parseRepositoryUpdates(const QDomElement &root,
const FileTaskResult &result, Metadata *metadata)
{
diff --git a/src/libs/installer/metadatajob.h b/src/libs/installer/metadatajob.h
index 9e8116124..18554ca08 100644
--- a/src/libs/installer/metadatajob.h
+++ b/src/libs/installer/metadatajob.h
@@ -97,6 +97,7 @@ private:
void reset();
void resetCompressedFetch();
Status parseUpdatesXml(const QList<FileTaskResult> &results);
+ Status refreshCacheItem(const FileTaskResult &result, const QByteArray &checksum, bool *refreshed);
Status parseRepositoryUpdates(const QDomElement &root, const FileTaskResult &result, Metadata *metadata);
QSet<Repository> getRepositories();
void addFileTaskItem(const QString &source, const QString &target, Metadata *metadata,