diff options
author | Katja Marttila <katja.marttila@qt.io> | 2020-11-09 16:21:48 +0200 |
---|---|---|
committer | Katja Marttila <katja.marttila@qt.io> | 2020-11-10 12:30:03 +0200 |
commit | 24ad54c694ebd93150efb6aab64ea0b63beba452 (patch) | |
tree | b537c4f53768292484d21056139452580f2405af /tools/common/repositorygen.cpp | |
parent | a5025ddb30b6ae6423a41ac2323e1b902ae0dd8f (diff) |
Repogen: Fix unite metadata when --repository switch used
United metadata 7z was missing the component which had no update
available.
Task-number: QTIFW-2018
Change-Id: I069fd852499f157075bf28e3ccfef3e42e5f30a9
Reviewed-by: Iikka Eklund <iikka.eklund@qt.io>
Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
Diffstat (limited to 'tools/common/repositorygen.cpp')
-rw-r--r-- | tools/common/repositorygen.cpp | 57 |
1 files changed, 50 insertions, 7 deletions
diff --git a/tools/common/repositorygen.cpp b/tools/common/repositorygen.cpp index 6f17ad5ac..94d1638eb 100644 --- a/tools/common/repositorygen.cpp +++ b/tools/common/repositorygen.cpp @@ -47,6 +47,7 @@ #include <QtCore/QRegExp> #include <QtXml/QDomDocument> +#include <QTemporaryDir> #include <iostream> @@ -678,7 +679,7 @@ static void writeSHA1ToNodeWithName(QDomDocument &doc, QDomNodeList &list, const } } -void QInstallerTools::compressMetaDirectories(const QString &repoDir, const QString &baseDir, +void QInstallerTools::compressMetaDirectories(const QString &repoDir, const QString &existingUnite7zUrl, const QHash<QString, QString> &versionMapping, bool createSplitMetadata, bool createUnifiedMetadata) { QDomDocument doc; @@ -697,10 +698,11 @@ void QInstallerTools::compressMetaDirectories(const QString &repoDir, const QStr QStringList absPaths; if (createUnifiedMetadata) { - absPaths = unifyMetadata(entryList, repoDir, doc); + absPaths = unifyMetadata(repoDir, existingUnite7zUrl, doc); } + if (createSplitMetadata) { - splitMetadata(entryList, repoDir, doc, baseDir, versionMapping); + splitMetadata(entryList, repoDir, doc, versionMapping); } else { // remove the files that got compressed foreach (const QString path, absPaths) @@ -712,10 +714,12 @@ void QInstallerTools::compressMetaDirectories(const QString &repoDir, const QStr existingUpdatesXml.close(); } -QStringList QInstallerTools::unifyMetadata(const QStringList &entryList, const QString &repoDir, QDomDocument doc) +QStringList QInstallerTools::unifyMetadata(const QString &repoDir, const QString &existingRepoDir, QDomDocument doc) { QStringList absPaths; QDir dir(repoDir); + const QStringList entryList = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot); + foreach (const QString &i, entryList) { dir.cd(i); const QString absPath = dir.absolutePath(); @@ -723,6 +727,26 @@ QStringList QInstallerTools::unifyMetadata(const QStringList &entryList, const Q dir.cdUp(); } + QTemporaryDir existingRepoTempDir; + QString existingRepoTemp = existingRepoTempDir.path(); + if (!existingRepoDir.isEmpty()) { + existingRepoTempDir.setAutoRemove(false); + QFile archiveFile(existingRepoDir); + QInstaller::openForRead(&archiveFile); + Lib7z::extractArchive(&archiveFile, existingRepoTemp); + QDir dir(existingRepoTemp); + QStringList existingRepoEntries = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot); + foreach (const QString existingRepoEntry, existingRepoEntries) { + if (entryList.contains(existingRepoEntry)) { + continue; + } else { + dir.cd(existingRepoEntry); + const QString absPath = dir.absolutePath(); + absPaths.append(absPath); + } + } + } + // Compress all metadata from repository to one single 7z const QString metadataFilename = QDateTime::currentDateTime(). toString(QLatin1String("yyyy-MM-dd-hhmm")) + QLatin1String("_meta.7z"); @@ -749,12 +773,12 @@ QStringList QInstallerTools::unifyMetadata(const QStringList &entryList, const Q else node.replaceChild(newNodeTag, nameTag); } + QInstaller::removeDirectory(existingRepoTemp, true); return absPaths; } void QInstallerTools::splitMetadata(const QStringList &entryList, const QString &repoDir, - QDomDocument doc, const QString &baseDir, - const QHash<QString, QString> &versionMapping) + QDomDocument doc, const QHash<QString, QString> &versionMapping) { QStringList absPaths; QDomNodeList elements = doc.elementsByTagName(QLatin1String("PackageUpdate")); @@ -762,7 +786,7 @@ void QInstallerTools::splitMetadata(const QStringList &entryList, const QString foreach (const QString &i, entryList) { dir.cd(i); const QString absPath = dir.absolutePath(); - const QString path = QString(i).remove(baseDir); + const QString path = QString(i).remove(repoDir); if (path.isNull()) continue; const QString versionPrefix = versionMapping[path]; @@ -924,3 +948,22 @@ void QInstallerTools::filterNewComponents(const QString &repositoryDir, QInstall } } } + +QString QInstallerTools::existingUniteMeta7z(const QString &repositoryDir) +{ + QString uniteMeta7z = QString(); + QFile file(repositoryDir + QLatin1String("/Updates.xml")); + QDomDocument doc; + if (file.open(QFile::ReadOnly) && doc.setContent(&file)) { + QDomNodeList elements = doc.elementsByTagName(QLatin1String("MetadataName")); + if (elements.count() > 0 && elements.at(0).isElement()) { + uniteMeta7z = elements.at(0).toElement().text(); + QFile metaFile(repositoryDir + QDir::separator() + uniteMeta7z); + if (!metaFile.exists()) { + throw QInstaller::Error(QString::fromLatin1("Unite meta7z \"%1\" does not exist in repository \"%2\"") + .arg(QDir::toNativeSeparators(metaFile.fileName()), repositoryDir)); + } + } + } + return uniteMeta7z; +} |