From ed519b1cba24cddb8669a5d29c45ee2e1aa372c9 Mon Sep 17 00:00:00 2001 From: Amir Masoud Abdol Date: Wed, 16 Nov 2022 14:03:02 +0100 Subject: file(ARCHIVE_CREATE): Allow higher compression level for Zstd This allows the Zstd compression-level to be set between 0-19. I've adjusted some of the tests, and error messages to indicates the selected algorithm, and min/max of its compression-level. Fixes: #24160 --- Help/command/file.rst | 3 +++ Source/cmFileCommand.cxx | 23 +++++++++++++++------- ...ument-validation-compression-level-1-stderr.txt | 2 +- ...ument-validation-compression-level-2-stderr.txt | 2 +- .../File_Archive/pax-zstd-compression-level.cmake | 3 +++ 5 files changed, 24 insertions(+), 9 deletions(-) diff --git a/Help/command/file.rst b/Help/command/file.rst index 673125d..2348937 100644 --- a/Help/command/file.rst +++ b/Help/command/file.rst @@ -1214,6 +1214,9 @@ directed to do so with the ``COMPRESSION`` option. Valid values for The ```` should be between 0-9, with the default being 0. The ``COMPRESSION`` option must be present when ``COMPRESSION_LEVEL`` is given. +.. versionadded:: 3.26 + The ```` of the ``Zstd`` algorithm can be set between 0-19. + .. note:: With ``FORMAT`` set to ``raw`` only one file will be compressed with the compression type specified by ``COMPRESSION``. diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index b1d238c..85f528d 100644 --- a/Source/cmFileCommand.cxx +++ b/Source/cmFileCommand.cxx @@ -3404,20 +3404,29 @@ bool HandleArchiveCreateCommand(std::vector const& args, } int compressionLevel = 0; + int minCompressionLevel = 0; + int maxCompressionLevel = 9; + if (compress == cmSystemTools::TarCompressZstd) { + maxCompressionLevel = 19; + } + if (!parsedArgs.CompressionLevel.empty()) { if (parsedArgs.CompressionLevel.size() != 1 && !std::isdigit(parsedArgs.CompressionLevel[0])) { - status.SetError(cmStrCat("compression level ", - parsedArgs.CompressionLevel, - " should be in range 0 to 9")); + status.SetError( + cmStrCat("compression level ", parsedArgs.CompressionLevel, " for ", + parsedArgs.Compression, " should be in range ", + minCompressionLevel, " to ", maxCompressionLevel)); cmSystemTools::SetFatalErrorOccurred(); return false; } compressionLevel = std::stoi(parsedArgs.CompressionLevel); - if (compressionLevel < 0 || compressionLevel > 9) { - status.SetError(cmStrCat("compression level ", - parsedArgs.CompressionLevel, - " should be in range 0 to 9")); + if (compressionLevel < minCompressionLevel || + compressionLevel > maxCompressionLevel) { + status.SetError( + cmStrCat("compression level ", parsedArgs.CompressionLevel, " for ", + parsedArgs.Compression, " should be in range ", + minCompressionLevel, " to ", maxCompressionLevel)); cmSystemTools::SetFatalErrorOccurred(); return false; } diff --git a/Tests/RunCMake/File_Archive/argument-validation-compression-level-1-stderr.txt b/Tests/RunCMake/File_Archive/argument-validation-compression-level-1-stderr.txt index d7bc79a..c2d4071 100644 --- a/Tests/RunCMake/File_Archive/argument-validation-compression-level-1-stderr.txt +++ b/Tests/RunCMake/File_Archive/argument-validation-compression-level-1-stderr.txt @@ -1,5 +1,5 @@ CMake Error at compression-level.cmake:39 \(file\): - file compression level 100 should be in range 0 to 9 + file compression level 100 for GZip should be in range 0 to 9 Call Stack \(most recent call first\): argument-validation-compression-level-1.cmake:8 \(check_compression_level\) CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/File_Archive/argument-validation-compression-level-2-stderr.txt b/Tests/RunCMake/File_Archive/argument-validation-compression-level-2-stderr.txt index 0f7bd9e..d4a4402 100644 --- a/Tests/RunCMake/File_Archive/argument-validation-compression-level-2-stderr.txt +++ b/Tests/RunCMake/File_Archive/argument-validation-compression-level-2-stderr.txt @@ -1,5 +1,5 @@ CMake Error at compression-level.cmake:39 \(file\): - file compression level high should be in range 0 to 9 + file compression level high for GZip should be in range 0 to 9 Call Stack \(most recent call first\): argument-validation-compression-level-2.cmake:8 \(check_compression_level\) CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/File_Archive/pax-zstd-compression-level.cmake b/Tests/RunCMake/File_Archive/pax-zstd-compression-level.cmake index 73fd84d..7002860 100644 --- a/Tests/RunCMake/File_Archive/pax-zstd-compression-level.cmake +++ b/Tests/RunCMake/File_Archive/pax-zstd-compression-level.cmake @@ -8,3 +8,6 @@ include(${CMAKE_CURRENT_LIST_DIR}/compression-level.cmake) check_compression_level("1") check_compression_level("5") check_compression_level("9") +check_compression_level("12") +check_compression_level("15") +check_compression_level("19") -- cgit v0.12