diff options
author | Katja Marttila <katja.marttila@qt.io> | 2020-11-24 06:20:07 +0200 |
---|---|---|
committer | Katja Marttila <katja.marttila@qt.io> | 2020-11-24 06:20:07 +0200 |
commit | 79011733f7a00da988d482dde443418c9df38784 (patch) | |
tree | aae5e8dbdd254cb2538e66e4649b1c86d39191ae /tools | |
parent | d863c8abcf29e971e0adb8dcb2fc12971a4e98f1 (diff) | |
parent | 13c9e1111d89d1a2a06954c00bb3d3c33d4ecfa3 (diff) |
Merge remote-tracking branch 'origin/4.0' into master
Change-Id: If5205ff6ef2c8989520e24d41595c04d5920d207
Diffstat (limited to 'tools')
-rw-r--r-- | tools/common/repositorygen.cpp | 57 | ||||
-rw-r--r-- | tools/common/repositorygen.h | 7 | ||||
-rw-r--r-- | tools/repogen/repogen.cpp | 6 |
3 files changed, 59 insertions, 11 deletions
diff --git a/tools/common/repositorygen.cpp b/tools/common/repositorygen.cpp index 5a6c0bf83..45ea0a541 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; @@ -694,10 +695,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) @@ -709,10 +711,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(); @@ -720,6 +724,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"); @@ -745,12 +769,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")); @@ -758,7 +782,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]; @@ -920,3 +944,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; +} diff --git a/tools/common/repositorygen.h b/tools/common/repositorygen.h index eb2d23275..f5202c1fc 100644 --- a/tools/common/repositorygen.h +++ b/tools/common/repositorygen.h @@ -67,11 +67,11 @@ PackageInfoVector createListOfRepositoryPackages(const QStringList &repositoryDi QHash<QString, QString> buildPathToVersionMapping(const PackageInfoVector &info); -void compressMetaDirectories(const QString &repoDir, const QString &baseDir, +void compressMetaDirectories(const QString &repoDir, const QString &existingUnite7zUrl, const QHash<QString, QString> &versionMapping, bool createSplitMetadata, bool createUnifiedMetadata); -QStringList unifyMetadata(const QStringList &entryList, const QString &repoDir, QDomDocument doc); -void splitMetadata(const QStringList &entryList, const QString &repoDir, QDomDocument doc, const QString &baseDir, +QStringList unifyMetadata(const QString &repoDir, const QString &existingRepoDir, QDomDocument doc); +void splitMetadata(const QStringList &entryList, const QString &repoDir, QDomDocument doc, const QHash<QString, QString> &versionMapping); void copyMetaData(const QString &outDir, const QString &dataDir, const PackageInfoVector &packages, @@ -80,6 +80,7 @@ void copyComponentData(const QStringList &packageDir, const QString &repoDir, Pa void filterNewComponents(const QString &repositoryDir, QInstallerTools::PackageInfoVector &packages); +QString existingUniteMeta7z(const QString &repositoryDir); } // namespace QInstallerTools diff --git a/tools/repogen/repogen.cpp b/tools/repogen/repogen.cpp index 76d4f676a..5c67cbc1c 100644 --- a/tools/repogen/repogen.cpp +++ b/tools/repogen/repogen.cpp @@ -279,7 +279,11 @@ int main(int argc, char** argv) QInstallerTools::copyComponentData(directories, repositoryDir, &packages); QInstallerTools::copyMetaData(tmpMetaDir, repositoryDir, packages, QLatin1String("{AnyApplication}"), QLatin1String(QUOTE(IFW_REPOSITORY_FORMAT_VERSION)), unite7zFiles); - QInstallerTools::compressMetaDirectories(tmpMetaDir, tmpMetaDir, pathToVersionMapping, + + QString existing7z = QInstallerTools::existingUniteMeta7z(repositoryDir); + if (!existing7z.isEmpty()) + existing7z = repositoryDir + QDir::separator() + existing7z; + QInstallerTools::compressMetaDirectories(tmpMetaDir, existing7z, pathToVersionMapping, createComponentMetadata, createUnifiedMetadata); QDirIterator it(repositoryDir, QStringList(QLatin1String("Updates*.xml")) |