file(ARCHIVE_CREATE): Add option to control compression level

Fixes: #21125
This commit is contained in:
Asit Dhal
2020-09-17 19:29:31 +02:00
committed by Brad King
parent 4fc07cd369
commit 195d14e781
23 changed files with 284 additions and 16 deletions
+41 -11
View File
@@ -3023,18 +3023,21 @@ bool HandleArchiveCreateCommand(std::vector<std::string> const& args,
std::string Output;
std::string Format;
std::string Compression;
std::string CompressionLevel;
std::string MTime;
bool Verbose = false;
std::vector<std::string> Paths;
};
static auto const parser = cmArgumentParser<Arguments>{}
.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<Arguments>{}
.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<std::string> unrecognizedArguments;
std::vector<std::string> keywordsMissingValues;
@@ -3048,9 +3051,9 @@ bool HandleArchiveCreateCommand(std::vector<std::string> const& args,
return false;
}
const std::vector<std::string> LIST_ARGS = { "OUTPUT", "FORMAT",
"COMPRESSION", "MTIME",
"PATHS" };
const std::vector<std::string> 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<std::string> 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<std::string> 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;