|
|
@@ -8,7 +8,6 @@
|
|
|
#include <cmath>
|
|
|
#include <cstdio>
|
|
|
#include <cstdlib>
|
|
|
-#include <iterator>
|
|
|
#include <map>
|
|
|
#include <set>
|
|
|
#include <sstream>
|
|
|
@@ -2945,8 +2944,7 @@ bool HandleArchiveCreateCommand(std::vector<std::string> const& args,
|
|
|
std::string Compression;
|
|
|
std::string MTime;
|
|
|
bool Verbose = false;
|
|
|
- std::vector<std::string> Files;
|
|
|
- std::vector<std::string> Directories;
|
|
|
+ std::vector<std::string> Paths;
|
|
|
};
|
|
|
|
|
|
static auto const parser = cmArgumentParser<Arguments>{}
|
|
|
@@ -2955,8 +2953,7 @@ bool HandleArchiveCreateCommand(std::vector<std::string> const& args,
|
|
|
.Bind("COMPRESSION"_s, &Arguments::Compression)
|
|
|
.Bind("MTIME"_s, &Arguments::MTime)
|
|
|
.Bind("VERBOSE"_s, &Arguments::Verbose)
|
|
|
- .Bind("FILES"_s, &Arguments::Files)
|
|
|
- .Bind("DIRECTORY"_s, &Arguments::Directories);
|
|
|
+ .Bind("PATHS"_s, &Arguments::Paths);
|
|
|
|
|
|
std::vector<std::string> unrecognizedArguments;
|
|
|
std::vector<std::string> keywordsMissingValues;
|
|
|
@@ -2970,9 +2967,9 @@ bool HandleArchiveCreateCommand(std::vector<std::string> const& args,
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- const std::vector<std::string> LIST_ARGS = {
|
|
|
- "OUTPUT", "FORMAT", "COMPRESSION", "MTIME", "FILES", "DIRECTORY",
|
|
|
- };
|
|
|
+ const std::vector<std::string> LIST_ARGS = { "OUTPUT", "FORMAT",
|
|
|
+ "COMPRESSION", "MTIME",
|
|
|
+ "PATHS" };
|
|
|
auto kwbegin = keywordsMissingValues.cbegin();
|
|
|
auto kwend = cmRemoveMatching(keywordsMissingValues, LIST_ARGS);
|
|
|
if (kwend != kwbegin) {
|
|
|
@@ -3010,11 +3007,6 @@ bool HandleArchiveCreateCommand(std::vector<std::string> const& args,
|
|
|
{ "XZ", cmSystemTools::TarCompressXZ },
|
|
|
{ "Zstd", cmSystemTools::TarCompressZstd } };
|
|
|
|
|
|
- std::string const& outFile = parsedArgs.Output;
|
|
|
- std::vector<std::string> files = parsedArgs.Files;
|
|
|
- std::copy(parsedArgs.Directories.begin(), parsedArgs.Directories.end(),
|
|
|
- std::back_inserter(files));
|
|
|
-
|
|
|
cmSystemTools::cmTarCompression compress = cmSystemTools::TarCompressNone;
|
|
|
auto typeIt = compressionTypeMap.find(parsedArgs.Compression);
|
|
|
if (typeIt != compressionTypeMap.end()) {
|
|
|
@@ -3026,14 +3018,16 @@ bool HandleArchiveCreateCommand(std::vector<std::string> const& args,
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- if (files.empty()) {
|
|
|
- status.GetMakefile().IssueMessage(MessageType::AUTHOR_WARNING,
|
|
|
- "No files or directories specified");
|
|
|
+ if (parsedArgs.Paths.empty()) {
|
|
|
+ status.SetError("ARCHIVE_CREATE requires a non-empty list of PATHS");
|
|
|
+ cmSystemTools::SetFatalErrorOccured();
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
- if (!cmSystemTools::CreateTar(outFile, files, compress, parsedArgs.Verbose,
|
|
|
- parsedArgs.MTime, parsedArgs.Format)) {
|
|
|
- status.SetError(cmStrCat("failed to compress: ", outFile));
|
|
|
+ if (!cmSystemTools::CreateTar(parsedArgs.Output, parsedArgs.Paths, compress,
|
|
|
+ parsedArgs.Verbose, parsedArgs.MTime,
|
|
|
+ parsedArgs.Format)) {
|
|
|
+ status.SetError(cmStrCat("failed to compress: ", parsedArgs.Output));
|
|
|
cmSystemTools::SetFatalErrorOccured();
|
|
|
return false;
|
|
|
}
|
|
|
@@ -3050,8 +3044,7 @@ bool HandleArchiveExtractCommand(std::vector<std::string> const& args,
|
|
|
bool Verbose = false;
|
|
|
bool ListOnly = false;
|
|
|
std::string Destination;
|
|
|
- std::vector<std::string> Files;
|
|
|
- std::vector<std::string> Directories;
|
|
|
+ std::vector<std::string> Patterns;
|
|
|
};
|
|
|
|
|
|
static auto const parser = cmArgumentParser<Arguments>{}
|
|
|
@@ -3059,8 +3052,7 @@ bool HandleArchiveExtractCommand(std::vector<std::string> const& args,
|
|
|
.Bind("VERBOSE"_s, &Arguments::Verbose)
|
|
|
.Bind("LIST_ONLY"_s, &Arguments::ListOnly)
|
|
|
.Bind("DESTINATION"_s, &Arguments::Destination)
|
|
|
- .Bind("FILES"_s, &Arguments::Files)
|
|
|
- .Bind("DIRECTORY"_s, &Arguments::Directories);
|
|
|
+ .Bind("PATTERNS"_s, &Arguments::Patterns);
|
|
|
|
|
|
std::vector<std::string> unrecognizedArguments;
|
|
|
std::vector<std::string> keywordsMissingValues;
|
|
|
@@ -3074,12 +3066,8 @@ bool HandleArchiveExtractCommand(std::vector<std::string> const& args,
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- const std::vector<std::string> LIST_ARGS = {
|
|
|
- "INPUT",
|
|
|
- "DESTINATION",
|
|
|
- "FILES",
|
|
|
- "DIRECTORY",
|
|
|
- };
|
|
|
+ const std::vector<std::string> LIST_ARGS = { "INPUT", "DESTINATION",
|
|
|
+ "PATTERNS" };
|
|
|
auto kwbegin = keywordsMissingValues.cbegin();
|
|
|
auto kwend = cmRemoveMatching(keywordsMissingValues, LIST_ARGS);
|
|
|
if (kwend != kwbegin) {
|
|
|
@@ -3090,18 +3078,16 @@ bool HandleArchiveExtractCommand(std::vector<std::string> const& args,
|
|
|
}
|
|
|
|
|
|
std::string inFile = parsedArgs.Input;
|
|
|
- std::vector<std::string> files = parsedArgs.Files;
|
|
|
- std::copy(parsedArgs.Directories.begin(), parsedArgs.Directories.end(),
|
|
|
- std::back_inserter(files));
|
|
|
|
|
|
if (parsedArgs.ListOnly) {
|
|
|
- if (!cmSystemTools::ListTar(inFile, files, parsedArgs.Verbose)) {
|
|
|
+ if (!cmSystemTools::ListTar(inFile, parsedArgs.Patterns,
|
|
|
+ parsedArgs.Verbose)) {
|
|
|
status.SetError(cmStrCat("failed to list: ", inFile));
|
|
|
cmSystemTools::SetFatalErrorOccured();
|
|
|
return false;
|
|
|
}
|
|
|
} else {
|
|
|
- std::string destDir = cmSystemTools::GetCurrentWorkingDirectory();
|
|
|
+ std::string destDir = status.GetMakefile().GetCurrentBinaryDirectory();
|
|
|
if (!parsedArgs.Destination.empty()) {
|
|
|
if (cmSystemTools::FileIsFullPath(parsedArgs.Destination)) {
|
|
|
destDir = parsedArgs.Destination;
|
|
|
@@ -3129,7 +3115,8 @@ bool HandleArchiveExtractCommand(std::vector<std::string> const& args,
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- if (!cmSystemTools::ExtractTar(inFile, files, parsedArgs.Verbose)) {
|
|
|
+ if (!cmSystemTools::ExtractTar(inFile, parsedArgs.Patterns,
|
|
|
+ parsedArgs.Verbose)) {
|
|
|
status.SetError(cmStrCat("failed to extract: ", inFile));
|
|
|
cmSystemTools::SetFatalErrorOccured();
|
|
|
return false;
|