From 347c9e2b582a02878fb08e3933a7a88197046113 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Mon, 29 Aug 2022 13:28:48 -0300 Subject: [PATCH] RCC: fix zlib compression when --no-zstd was specified Since we had code to default to zstd as the default algorithm instead of "Best", we ended up not compressing anything. [ChangeLog][rcc] Fixed a bug that caused rcc not to compress files with any compression algorithm if the --no-zstd option was present. Fixes: QTBUG-106012 Change-Id: Ic6547f8247454b47baa8fffd170fddae429f82d2 Reviewed-by: Kai Koehne (cherry picked from commit f12321288009119552df10df75c77228f6bac0db) Reviewed-by: Qt Cherry-pick Bot --- src/tools/rcc/main.cpp | 12 ++++++++---- src/tools/rcc/rcc.cpp | 12 ++---------- .../io/qresourceengine/tst_qresourceengine.cpp | 12 +++++++++++- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/tools/rcc/main.cpp b/src/tools/rcc/main.cpp index 7323fc9bbbd..2751bc39d6a 100644 --- a/src/tools/rcc/main.cpp +++ b/src/tools/rcc/main.cpp @@ -227,12 +227,16 @@ int runRcc(int argc, char *argv[]) if (parser.isSet(compressionAlgoOption)) library.setCompressionAlgorithm(RCCResourceLibrary::parseCompressionAlgorithm(parser.value(compressionAlgoOption), &errorMsg)); - if (formatVersion < 3 && library.compressionAlgorithm() == RCCResourceLibrary::CompressionAlgorithm::Zstd) - errorMsg = "Zstandard compression requires format version 3 or higher"_L1; - if (parser.isSet(nocompressOption)) - library.setCompressionAlgorithm(RCCResourceLibrary::CompressionAlgorithm::None); if (parser.isSet(noZstdOption)) library.setNoZstd(true); + if (library.compressionAlgorithm() == RCCResourceLibrary::CompressionAlgorithm::Zstd) { + if (formatVersion < 3) + errorMsg = "Zstandard compression requires format version 3 or higher"_L1; + if (library.noZstd()) + errorMsg = "--compression-algo=zstd and --no-zstd both specified."_L1; + } + if (parser.isSet(nocompressOption)) + library.setCompressionAlgorithm(RCCResourceLibrary::CompressionAlgorithm::None); if (parser.isSet(compressOption) && errorMsg.isEmpty()) { int level = library.parseCompressionLevel(library.compressionAlgorithm(), parser.value(compressOption), &errorMsg); library.setCompressLevel(level); diff --git a/src/tools/rcc/rcc.cpp b/src/tools/rcc/rcc.cpp index 1f641dd7e17..bb5043e0a28 100644 --- a/src/tools/rcc/rcc.cpp +++ b/src/tools/rcc/rcc.cpp @@ -35,14 +35,6 @@ enum { CONSTANT_COMPRESSTHRESHOLD_DEFAULT = 70 }; -#if QT_CONFIG(zstd) && QT_VERSION >= QT_VERSION_CHECK(6,0,0) -# define CONSTANT_COMPRESSALGO_DEFAULT RCCResourceLibrary::CompressionAlgorithm::Zstd -#elif !defined(QT_NO_COMPRESS) -# define CONSTANT_COMPRESSALGO_DEFAULT RCCResourceLibrary::CompressionAlgorithm::Zlib -#else -# define CONSTANT_COMPRESSALGO_DEFAULT RCCResourceLibrary::CompressionAlgorithm::None -#endif - void RCCResourceLibrary::write(const char *str, int len) { int n = m_out.size(); @@ -87,7 +79,7 @@ public: QLocale::Language language = QLocale::C, QLocale::Territory territory = QLocale::AnyTerritory, uint flags = NoFlags, - RCCResourceLibrary::CompressionAlgorithm compressAlgo = CONSTANT_COMPRESSALGO_DEFAULT, + RCCResourceLibrary::CompressionAlgorithm compressAlgo = RCCResourceLibrary::CompressionAlgorithm::Best, int compressLevel = CONSTANT_COMPRESSLEVEL_DEFAULT, int compressThreshold = CONSTANT_COMPRESSTHRESHOLD_DEFAULT, bool noZstd = false); @@ -438,7 +430,7 @@ RCCResourceLibrary::RCCResourceLibrary(quint8 formatVersion) : m_root(nullptr), m_format(C_Code), m_verbose(false), - m_compressionAlgo(CONSTANT_COMPRESSALGO_DEFAULT), + m_compressionAlgo(CompressionAlgorithm::Best), m_compressLevel(CONSTANT_COMPRESSLEVEL_DEFAULT), m_compressThreshold(CONSTANT_COMPRESSTHRESHOLD_DEFAULT), m_treeOffset(0), diff --git a/tests/auto/corelib/io/qresourceengine/tst_qresourceengine.cpp b/tests/auto/corelib/io/qresourceengine/tst_qresourceengine.cpp index 13508d953a8..1631222c082 100644 --- a/tests/auto/corelib/io/qresourceengine/tst_qresourceengine.cpp +++ b/tests/auto/corelib/io/qresourceengine/tst_qresourceengine.cpp @@ -37,6 +37,7 @@ private slots: void searchPath_data(); void searchPath(); void doubleSlashInRoot(); + void setLocale_data(); void setLocale(); void lastModified(); void resourcesInStaticPlugins(); @@ -556,13 +557,22 @@ void tst_QResourceEngine::doubleSlashInRoot() QVERIFY(QFile::exists("://secondary_root/runtime_resource/search_file.txt")); } +void tst_QResourceEngine::setLocale_data() +{ + QTest::addColumn("prefix"); + QTest::newRow("built-in") << QString(); + QTest::newRow("runtime") << "/runtime_resource/"; +} + void tst_QResourceEngine::setLocale() { + QFETCH(QString, prefix); QLocale::setDefault(QLocale::c()); // default constructed QResource gets the default locale QResource resource; - resource.setFileName("aliasdir/aliasdir.txt"); + resource.setFileName(prefix + "aliasdir/aliasdir.txt"); + QVERIFY(resource.isValid()); QCOMPARE(resource.compressionAlgorithm(), QResource::NoCompression); // change the default locale and make sure it doesn't affect the resource