summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArttu Tarkiainen <arttu.tarkiainen@qt.io>2021-08-27 11:34:44 +0300
committerArttu Tarkiainen <arttu.tarkiainen@qt.io>2021-09-14 15:04:30 +0300
commit14b4bdde43a6e400a2212b155c75b67c2913998a (patch)
tree3b3a6e7fe4f5ca66aae00d4e608c2ced4ccee797
parent7be4b9c71af4d4668deab355db73beb7feaf35c1 (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.qdoc13
-rw-r--r--src/libs/ifwtools/repositorygen.cpp14
-rw-r--r--src/libs/ifwtools/repositorygen.h11
-rw-r--r--tools/repogen/repogen.cpp22
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) {