diff options
author | Arttu Tarkiainen <arttu.tarkiainen@qt.io> | 2021-08-27 11:34:44 +0300 |
---|---|---|
committer | Arttu Tarkiainen <arttu.tarkiainen@qt.io> | 2021-09-14 15:04:30 +0300 |
commit | 14b4bdde43a6e400a2212b155c75b67c2913998a (patch) | |
tree | 3b3a6e7fe4f5ca66aae00d4e608c2ced4ccee797 | |
parent | 7be4b9c71af4d4668deab355db73beb7feaf35c1 (diff) |
repogen: add support for setting compression level for data archives
Task-number: QTIFW-1587
Change-Id: I86c4b08eb43e3cafbab83e04961c51d6bdbc98ba
Reviewed-by: Katja Marttila <katja.marttila@qt.io>
-rw-r--r-- | doc/installerfw.qdoc | 13 | ||||
-rw-r--r-- | src/libs/ifwtools/repositorygen.cpp | 14 | ||||
-rw-r--r-- | src/libs/ifwtools/repositorygen.h | 11 | ||||
-rw-r--r-- | tools/repogen/repogen.cpp | 22 |
4 files changed, 50 insertions, 10 deletions
diff --git a/doc/installerfw.qdoc b/doc/installerfw.qdoc index 161e1a191..58a870eed 100644 --- a/doc/installerfw.qdoc +++ b/doc/installerfw.qdoc @@ -1261,6 +1261,19 @@ you omit this option, the 7z format will be used as a default. \note If the Installer Framework tools were built without libarchive support, only \c{7z} format is supported. + \row + \li --ac, --compression <5> + \li Defaults to 5 (Normal compression). \note Some formats do not support + all the possible values, for example bzip2 compression only supports + values from 1 to 9. + \list + \li 0 (No compression) + \li 1 (Fastest compressing) + \li 3 (Fast compressing) + \li 5 (Normal compressing) + \li 7 (Maximum compressing) + \li 9 (Ultra compressing) + \endlist \endtable \note We recommend that you use the \c {--update-new-packages} parameter to update an existing repository, especially if you have a content delivery diff --git a/src/libs/ifwtools/repositorygen.cpp b/src/libs/ifwtools/repositorygen.cpp index 6d87caef4..98cd66768 100644 --- a/src/libs/ifwtools/repositorygen.cpp +++ b/src/libs/ifwtools/repositorygen.cpp @@ -759,13 +759,14 @@ static void writeSHA1ToNodeWithName(QDomDocument &doc, QDomNodeList &list, const } } -void QInstallerTools::createArchive(const QString &filename, const QStringList &data) +void QInstallerTools::createArchive(const QString &filename, const QStringList &data, Compression compression) { QScopedPointer<AbstractArchive> targetArchive(ArchiveFactory::instance().create(filename)); if (!targetArchive) { throw QInstaller::Error(QString::fromLatin1("Could not create handler " "object for archive \"%1\": \"%2\".").arg(filename, QLatin1String(Q_FUNC_INFO))); } + targetArchive->setCompressionLevel(compression); if (!(targetArchive->open(QIODevice::WriteOnly) && targetArchive->create(data))) { throw Error(QString::fromLatin1("Could not create archive \"%1\": %2").arg( QDir::toNativeSeparators(filename), targetArchive->errorString())); @@ -906,7 +907,7 @@ void QInstallerTools::splitMetadata(const QStringList &entryList, const QString } void QInstallerTools::copyComponentData(const QStringList &packageDirs, const QString &repoDir, - PackageInfoVector *const infos, const QString &archiveSuffix) + PackageInfoVector *const infos, const QString &archiveSuffix, Compression compression) { for (int i = 0; i < infos->count(); ++i) { const PackageInfo info = infos->at(i); @@ -945,7 +946,7 @@ void QInstallerTools::copyComponentData(const QStringList &packageDirs, const QS } else if (fileInfo.isDir()) { qDebug() << "Compressing data directory" << entry; QString target = QString::fromLatin1("%1/%3%2.%4").arg(namedRepoDir, entry, info.version, archiveSuffix); - createArchive(target, QStringList() << dataDir.absoluteFilePath(entry)); + createArchive(target, QStringList() << dataDir.absoluteFilePath(entry), compression); compressedFiles.append(target); } else if (fileInfo.isSymLink()) { filesToCompress.append(dataDir.absoluteFilePath(entry)); @@ -956,7 +957,7 @@ void QInstallerTools::copyComponentData(const QStringList &packageDirs, const QS if (!filesToCompress.isEmpty()) { qDebug() << "Compressing files found in data directory:" << filesToCompress; QString target = QString::fromLatin1("%1/%2content.%3").arg(namedRepoDir, info.version, archiveSuffix); - createArchive(target, filesToCompress); + createArchive(target, filesToCompress, compression); compressedFiles.append(target); } @@ -1089,7 +1090,8 @@ PackageInfoVector QInstallerTools::collectPackages(RepositoryInfo info, QStringL } void QInstallerTools::createRepository(RepositoryInfo info, PackageInfoVector *packages, - const QString &tmpMetaDir, bool createComponentMetadata, bool createUnifiedMetadata, const QString &archiveSuffix) + const QString &tmpMetaDir, bool createComponentMetadata, bool createUnifiedMetadata, + const QString &archiveSuffix, Compression compression) { QHash<QString, QString> pathToVersionMapping = QInstallerTools::buildPathToVersionMapping(*packages); @@ -1105,7 +1107,7 @@ void QInstallerTools::createRepository(RepositoryInfo info, PackageInfoVector *p unite7zFiles.append(it.fileInfo().absoluteFilePath()); } } - QInstallerTools::copyComponentData(directories, info.repositoryDir, packages, archiveSuffix); + QInstallerTools::copyComponentData(directories, info.repositoryDir, packages, archiveSuffix, compression); QInstallerTools::copyMetaData(tmpMetaDir, info.repositoryDir, *packages, QLatin1String("{AnyApplication}"), QLatin1String(QUOTE(IFW_REPOSITORY_FORMAT_VERSION)), unite7zFiles); diff --git a/src/libs/ifwtools/repositorygen.h b/src/libs/ifwtools/repositorygen.h index 5f67b8220..054c023f4 100644 --- a/src/libs/ifwtools/repositorygen.h +++ b/src/libs/ifwtools/repositorygen.h @@ -31,6 +31,8 @@ #include "ifwtools_global.h" +#include <abstractarchive.h> + #include <QHash> #include <QString> #include <QStringList> @@ -52,6 +54,7 @@ struct IFWTOOLS_EXPORT PackageInfo bool createContentSha1Node; }; typedef QVector<PackageInfo> PackageInfoVector; +typedef QInstaller::AbstractArchive::CompressionLevel Compression; enum IFWTOOLS_EXPORT FilterType { Include, @@ -77,7 +80,7 @@ PackageInfoVector IFWTOOLS_EXPORT createListOfRepositoryPackages(const QStringLi QHash<QString, QString> IFWTOOLS_EXPORT buildPathToVersionMapping(const PackageInfoVector &info); -void IFWTOOLS_EXPORT createArchive(const QString &filename, const QStringList &data); +void IFWTOOLS_EXPORT createArchive(const QString &filename, const QStringList &data, Compression compression = Compression::Normal); void IFWTOOLS_EXPORT compressMetaDirectories(const QString &repoDir, const QString &existingUnite7zUrl, const QHash<QString, QString> &versionMapping, bool createSplitMetadata, bool createUnifiedMetadata); @@ -89,14 +92,16 @@ void splitMetadata(const QStringList &entryList, const QString &repoDir, QDomDoc void IFWTOOLS_EXPORT copyMetaData(const QString &outDir, const QString &dataDir, const PackageInfoVector &packages, const QString &appName, const QString& appVersion, const QStringList &uniteMetadatas); void IFWTOOLS_EXPORT copyComponentData(const QStringList &packageDir, const QString &repoDir, - PackageInfoVector *const infos, const QString &archiveSuffix); + PackageInfoVector *const infos, const QString &archiveSuffix, + Compression compression = Compression::Normal); void IFWTOOLS_EXPORT filterNewComponents(const QString &repositoryDir, QInstallerTools::PackageInfoVector &packages); QString IFWTOOLS_EXPORT existingUniteMeta7z(const QString &repositoryDir); PackageInfoVector IFWTOOLS_EXPORT collectPackages(RepositoryInfo info, QStringList *filteredPackages, FilterType filterType, bool updateNewComponents, QStringList packagesUpdatedWithSha); void IFWTOOLS_EXPORT createRepository(RepositoryInfo info, PackageInfoVector *packages, const QString &tmpMetaDir, - bool createComponentMetadata, bool createUnifiedMetadata, const QString &archiveSuffix); + bool createComponentMetadata, bool createUnifiedMetadata, const QString &archiveSuffix, + Compression compression = Compression::Normal); } // namespace QInstallerTools #endif // REPOSITORYGEN_H diff --git a/tools/repogen/repogen.cpp b/tools/repogen/repogen.cpp index a709899c6..13c763866 100644 --- a/tools/repogen/repogen.cpp +++ b/tools/repogen/repogen.cpp @@ -35,12 +35,14 @@ #include <utils.h> #include <loggingutils.h> #include <archivefactory.h> +#include <abstractarchive.h> #include <QDomDocument> #include <QtCore/QDir> #include <QtCore/QDirIterator> #include <QtCore/QFileInfo> #include <QTemporaryDir> +#include <QMetaEnum> #include <iostream> @@ -76,6 +78,8 @@ static void printUsage() std::cout << " --af|--archive-format " << archiveFormats << std::endl; std::cout << " Set the format used when packaging new component data archives. If" << std::endl; std::cout << " you omit this option the 7z format will be used as a default." << std::endl; + std::cout << " --ac|--compression 0,1,3,5,7,9" << std::endl; + std::cout << " Sets the compression level used when packaging new data archives." << std::endl; std::cout << std::endl; std::cout << "Example:" << std::endl; @@ -111,6 +115,7 @@ int main(int argc, char** argv) bool createUnifiedMetadata = true; bool createComponentMetadata = true; QString archiveSuffix = QLatin1String("7z"); + AbstractArchive::CompressionLevel compression = AbstractArchive::Normal; //TODO: use a for loop without removing values from args like it is in binarycreator.cpp //for (QStringList::const_iterator it = args.begin(); it != args.end(); ++it) { @@ -212,6 +217,21 @@ int main(int argc, char** argv) // TODO: do we need early check for supported formats? archiveSuffix = args.first(); args.removeFirst(); + } else if (args.first() == QLatin1String("--ac") || args.first() == QLatin1String("--compression")) { + args.removeFirst(); + if (args.isEmpty()) { + return printErrorAndUsageAndExit(QCoreApplication::translate("QInstaller", + "Error: Compression parameter missing argument")); + } + bool ok = false; + QMetaEnum levels = QMetaEnum::fromType<AbstractArchive::CompressionLevel>(); + const int value = args.first().toInt(&ok); + if (!ok || !levels.valueToKey(value)) { + return printErrorAndUsageAndExit(QCoreApplication::translate("QInstaller", + "Error: Unknown compression level \"%1\".").arg(value)); + } + compression = static_cast<AbstractArchive::CompressionLevel>(value); + args.removeFirst(); } else { printUsage(); return 1; @@ -263,7 +283,7 @@ int main(int argc, char** argv) tmp.setAutoRemove(false); tmpMetaDir = tmp.path(); QInstallerTools::createRepository(repoInfo, &packages, tmpMetaDir, - createComponentMetadata, createUnifiedMetadata, archiveSuffix); + createComponentMetadata, createUnifiedMetadata, archiveSuffix, compression); exitCode = EXIT_SUCCESS; } catch (const QInstaller::Error &e) { |