diff options
-rw-r--r-- | src/libs/installer/metadatajob.cpp | 46 | ||||
-rw-r--r-- | tests/auto/installer/metadatajob/data/repository7zInvalidMetaSha1/repository7zInvalidMetaSha1.7z | bin | 0 -> 1057 bytes | |||
-rw-r--r-- | tests/auto/installer/metadatajob/data/repositoryZipped/repositoryZipped.7z | bin | 0 -> 931 bytes | |||
-rw-r--r-- | tests/auto/installer/metadatajob/settings.qrc | 2 | ||||
-rw-r--r-- | tests/auto/installer/metadatajob/tst_metadatajob.cpp | 45 |
5 files changed, 75 insertions, 18 deletions
diff --git a/src/libs/installer/metadatajob.cpp b/src/libs/installer/metadatajob.cpp index a62a23256..ff15d7b0d 100644 --- a/src/libs/installer/metadatajob.cpp +++ b/src/libs/installer/metadatajob.cpp @@ -279,7 +279,14 @@ void MetadataJob::doStart() return; } - FileTaskItem item(url); + QTemporaryDir tmp(QDir::tempPath() + QLatin1String("/remoterepo-XXXXXX")); + if (!tmp.isValid()) { + qCWarning(QInstaller::lcInstallerInstallLog) << "Cannot create unique temporary directory."; + continue; + } + tmp.setAutoRemove(false); + m_tempDirDeleter.add(tmp.path()); + FileTaskItem item(url, tmp.path() + QLatin1String("/Updates.xml")); item.insert(TaskRole::UserRole, QVariant::fromValue(repo)); item.insert(TaskRole::Authenticator, QVariant::fromValue(authenticator)); items.append(item); @@ -414,7 +421,15 @@ void MetadataJob::unzipRepositoryTaskFinished() error = testJob.error(); errorString = testJob.errorString(); if (error == Job::NoError) { - FileTaskItem item(url); + QTemporaryDir tmp(QDir::tempPath() + QLatin1String("/remoterepo-XXXXXX")); + if (!tmp.isValid()) { + qCWarning(QInstaller::lcInstallerInstallLog) << "Cannot create unique temporary directory."; + continue; + } + tmp.setAutoRemove(false); + m_tempDirDeleter.add(tmp.path()); + FileTaskItem item(url, tmp.path() + QLatin1String("/Updates.xml")); + item.insert(TaskRole::UserRole, QVariant::fromValue(repo)); m_unzipRepositoryitems.append(item); } else { @@ -604,6 +619,13 @@ void MetadataJob::metadataTaskFinished() } else { throw QInstaller::TaskException(mismatchMessage); } + QFileInfo fi(result.target()); + QString targetPath = fi.absolutePath(); + if (m_fetchedMetadata.contains(targetPath)) { + delete m_fetchedMetadata.value(targetPath); + m_fetchedMetadata.remove(targetPath); + } + continue; } UnzipArchiveTask *task = new UnzipArchiveTask(result.target(), item.value(TaskRole::UserRole).toString()); @@ -614,6 +636,9 @@ void MetadataJob::metadataTaskFinished() connect(watcher, &QFutureWatcherBase::finished, this, &MetadataJob::unzipTaskFinished); watcher->setFuture(QtConcurrent::run(&UnzipArchiveTask::doTask, task)); } + if (m_unzipTasks.isEmpty()) + startUpdateCacheTask(); + } else { startUpdateCacheTask(); } @@ -735,23 +760,10 @@ MetadataJob::Status MetadataJob::parseUpdatesXml(const QList<FileTaskResult> &re if (result.target().isEmpty()) { continue; } - QTemporaryDir tmp(QDir::tempPath() + QLatin1String("/remoterepo-XXXXXX")); - if (!tmp.isValid()) { - qCWarning(QInstaller::lcInstallerInstallLog) << "Cannot create unique temporary directory."; - return XmlDownloadFailure; - } - - tmp.setAutoRemove(false); - QScopedPointer<Metadata> metadata(new Metadata(tmp.path())); - m_tempDirDeleter.add(metadata->path()); + QFileInfo fileInfo(result.target()); + QScopedPointer<Metadata> metadata(new Metadata(fileInfo.absolutePath())); QFile file(result.target()); - if (!file.rename(metadata->path() + QLatin1String("/Updates.xml"))) { - qCWarning(QInstaller::lcInstallerInstallLog) << "Cannot rename target to Updates.xml:" - << file.errorString(); - return XmlDownloadFailure; - } - if (!file.open(QIODevice::ReadOnly)) { qCWarning(QInstaller::lcInstallerInstallLog) << "Cannot open Updates.xml for reading:" << file.errorString(); diff --git a/tests/auto/installer/metadatajob/data/repository7zInvalidMetaSha1/repository7zInvalidMetaSha1.7z b/tests/auto/installer/metadatajob/data/repository7zInvalidMetaSha1/repository7zInvalidMetaSha1.7z Binary files differnew file mode 100644 index 000000000..df1f72b51 --- /dev/null +++ b/tests/auto/installer/metadatajob/data/repository7zInvalidMetaSha1/repository7zInvalidMetaSha1.7z diff --git a/tests/auto/installer/metadatajob/data/repositoryZipped/repositoryZipped.7z b/tests/auto/installer/metadatajob/data/repositoryZipped/repositoryZipped.7z Binary files differnew file mode 100644 index 000000000..6afaae497 --- /dev/null +++ b/tests/auto/installer/metadatajob/data/repositoryZipped/repositoryZipped.7z diff --git a/tests/auto/installer/metadatajob/settings.qrc b/tests/auto/installer/metadatajob/settings.qrc index 6e56a7854..5df3befd9 100644 --- a/tests/auto/installer/metadatajob/settings.qrc +++ b/tests/auto/installer/metadatajob/settings.qrc @@ -3,5 +3,7 @@ <file>data/repository/Updates.xml</file> <file>data/repositoryActionAdd/Updates.xml</file> <file>data/repositoryActionRemove/Updates.xml</file> + <file>data/repositoryZipped/repositoryZipped.7z</file> + <file>data/repository7zInvalidMetaSha1/repository7zInvalidMetaSha1.7z</file> </qresource> </RCC> diff --git a/tests/auto/installer/metadatajob/tst_metadatajob.cpp b/tests/auto/installer/metadatajob/tst_metadatajob.cpp index 54609ab95..cb974e7ad 100644 --- a/tests/auto/installer/metadatajob/tst_metadatajob.cpp +++ b/tests/auto/installer/metadatajob/tst_metadatajob.cpp @@ -1,6 +1,6 @@ /************************************************************************** ** -** Copyright (C) 2021 The Qt Company Ltd. +** Copyright (C) 2023 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Installer Framework. @@ -97,6 +97,49 @@ private slots: metadata.waitForFinished(); QCOMPARE(metadata.metadata().count(), 1); } + + void testZippedRepository_data() + { + QTest::addColumn<QStringList>("repositories"); + QTest::addColumn<int>("metacount"); + QTest::addColumn<bool>("allowUnstable"); + + QStringList repositories; + repositories << ":///data/repositoryZipped/repositoryZipped.7z"; + QTest::newRow("7z repository") << repositories << 1 << true; + + repositories.clear(); + repositories << ":///data/repository7zInvalidMetaSha1/repository7zInvalidMetaSha1.7z"; + QTest::newRow("7z with invalid meta sha1") << repositories << 0 << true; + + repositories.clear(); + repositories << ":///data/repositoryZipped/repositoryZipped.7z" << ":///data/repository7zInvalidMetaSha1/repository7zInvalidMetaSha1.7z"; + QTest::newRow("7z with one valid repository") << repositories << 1 << true; + + repositories.clear(); + repositories << ":///data/repository7zInvalidMetaSha1/repository7zInvalidMetaSha1.7z" << ":///data/repositoryZipped/repositoryZipped.7z"; + QTest::newRow("7z with one valid repository") << repositories << 0 << false; + } + + void testZippedRepository() + { + QFETCH(QStringList, repositories); + QFETCH(int, metacount); + QFETCH(bool, allowUnstable); + + PackageManagerCore core; + core.setInstaller(); + core.setTemporaryRepositories(repositories, false, true); + core.settings().setAllowUnstableComponents(allowUnstable); + + MetadataJob metadata; + metadata.setPackageManagerCore(&core); + metadata.addDownloadType(DownloadType::CompressedPackage); + metadata.setAutoDelete(true); + metadata.start(); + metadata.waitForFinished(); + QCOMPARE(metadata.metadata().count(), metacount); + } }; |