From 195d14e7818244789638fffd2087b8b2d0952622 Mon Sep 17 00:00:00 2001 From: Asit Dhal Date: Thu, 17 Sep 2020 19:29:31 +0200 Subject: file(ARCHIVE_CREATE): Add option to control compression level Fixes: #21125 --- Source/cmFileCommand.cxx | 52 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 11 deletions(-) (limited to 'Source/cmFileCommand.cxx') diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index 84639a78ad..be91846299 100644 --- a/Source/cmFileCommand.cxx +++ b/Source/cmFileCommand.cxx @@ -3023,18 +3023,21 @@ bool HandleArchiveCreateCommand(std::vector const& args, std::string Output; std::string Format; std::string Compression; + std::string CompressionLevel; std::string MTime; bool Verbose = false; std::vector Paths; }; - static auto const parser = cmArgumentParser{} - .Bind("OUTPUT"_s, &Arguments::Output) - .Bind("FORMAT"_s, &Arguments::Format) - .Bind("COMPRESSION"_s, &Arguments::Compression) - .Bind("MTIME"_s, &Arguments::MTime) - .Bind("VERBOSE"_s, &Arguments::Verbose) - .Bind("PATHS"_s, &Arguments::Paths); + static auto const parser = + cmArgumentParser{} + .Bind("OUTPUT"_s, &Arguments::Output) + .Bind("FORMAT"_s, &Arguments::Format) + .Bind("COMPRESSION"_s, &Arguments::Compression) + .Bind("COMPRESSION_LEVEL"_s, &Arguments::CompressionLevel) + .Bind("MTIME"_s, &Arguments::MTime) + .Bind("VERBOSE"_s, &Arguments::Verbose) + .Bind("PATHS"_s, &Arguments::Paths); std::vector unrecognizedArguments; std::vector keywordsMissingValues; @@ -3048,9 +3051,9 @@ bool HandleArchiveCreateCommand(std::vector const& args, return false; } - const std::vector LIST_ARGS = { "OUTPUT", "FORMAT", - "COMPRESSION", "MTIME", - "PATHS" }; + const std::vector LIST_ARGS = { + "OUTPUT", "FORMAT", "COMPRESSION", "COMPRESSION_LEVEL", "MTIME", "PATHS" + }; auto kwbegin = keywordsMissingValues.cbegin(); auto kwend = cmRemoveMatching(keywordsMissingValues, LIST_ARGS); if (kwend != kwbegin) { @@ -3099,6 +3102,33 @@ bool HandleArchiveCreateCommand(std::vector const& args, return false; } + int compressionLevel = 0; + 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")); + cmSystemTools::SetFatalErrorOccured(); + 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")); + cmSystemTools::SetFatalErrorOccured(); + return false; + } + if (compress == cmSystemTools::TarCompressNone) { + status.SetError(cmStrCat("compression level is not supported for " + "compression \"None\"", + parsedArgs.Compression)); + cmSystemTools::SetFatalErrorOccured(); + return false; + } + } + if (parsedArgs.Paths.empty()) { status.SetError("ARCHIVE_CREATE requires a non-empty list of PATHS"); cmSystemTools::SetFatalErrorOccured(); @@ -3107,7 +3137,7 @@ bool HandleArchiveCreateCommand(std::vector const& args, if (!cmSystemTools::CreateTar(parsedArgs.Output, parsedArgs.Paths, compress, parsedArgs.Verbose, parsedArgs.MTime, - parsedArgs.Format)) { + parsedArgs.Format, compressionLevel)) { status.SetError(cmStrCat("failed to compress: ", parsedArgs.Output)); cmSystemTools::SetFatalErrorOccured(); return false; -- cgit v1.2.1