summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorJohnny Jazeix <jazeix@gmail.com>2020-04-15 18:56:56 (GMT)
committerJohnny Jazeix <jazeix@gmail.com>2020-04-15 18:56:56 (GMT)
commita625f30785130586a7d2a59c13a7526eab8b3086 (patch)
treea4008f2a62052a6f1837d91e39e3825796f61c63 /Source
parentfab932c3cba9423443c7ab25fda3999e4fc4b347 (diff)
downloadCMake-a625f30785130586a7d2a59c13a7526eab8b3086.zip
CMake-a625f30785130586a7d2a59c13a7526eab8b3086.tar.gz
CMake-a625f30785130586a7d2a59c13a7526eab8b3086.tar.bz2
cmake -E: add cat command.
Concatenate files and print on the standard output. FIXES: #20557
Diffstat (limited to 'Source')
-rw-r--r--Source/cmcmd.cxx35
1 files changed, 35 insertions, 0 deletions
diff --git a/Source/cmcmd.cxx b/Source/cmcmd.cxx
index c3bd160..3befb18 100644
--- a/Source/cmcmd.cxx
+++ b/Source/cmcmd.cxx
@@ -90,6 +90,7 @@ void CMakeCommandUsage(const char* program)
<< "Available commands: \n"
<< " capabilities - Report capabilities built into cmake "
"in JSON format\n"
+ << " cat <files>... - concat the files and print them to the standard output\n"
<< " chdir dir cmd [args...] - run command in a given directory\n"
<< " compare_files [--ignore-eol] file1 file2\n"
<< " - check if file1 is same as file2\n"
@@ -180,6 +181,13 @@ static bool cmTarFilesFrom(std::string const& file,
return true;
}
+static void cmCatFile(const std::string& fileToAppend)
+{
+ cmsys::ifstream source(fileToAppend.c_str(),
+ (std::ios::binary | std::ios::in));
+ std::cout << source.rdbuf();
+}
+
static bool cmRemoveDirectory(const std::string& dir, bool recursive = true)
{
if (cmSystemTools::FileIsSymlink(dir)) {
@@ -927,6 +935,33 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string> const& args)
return HashSumFile(args, cmCryptoHash::AlgoSHA512);
}
+ // Command to concat files into one
+ if (args[1] == "cat" && args.size() >= 3) {
+ int return_value = 0;
+ for (auto const& arg : cmMakeRange(args).advance(2)) {
+ if (cmHasLiteralPrefix(arg, "-")) {
+ if (arg != "--") {
+ cmSystemTools::Error(arg + ": option not handled");
+ return_value = 1;
+ }
+ } else if (!cmSystemTools::TestFileAccess(arg,
+ cmsys::TEST_FILE_READ) &&
+ cmSystemTools::TestFileAccess(arg, cmsys::TEST_FILE_OK)) {
+ cmSystemTools::Error(arg + ": permission denied (ignoring)");
+ return_value = 1;
+ } else if (cmSystemTools::FileIsDirectory(arg)) {
+ cmSystemTools::Error(arg + ": is a directory (ignoring)");
+ return_value = 1;
+ } else if (!cmSystemTools::FileExists(arg)) {
+ cmSystemTools::Error(arg + ": no such file or directory (ignoring)");
+ return_value = 1;
+ } else {
+ cmCatFile(arg);
+ }
+ }
+ return return_value;
+ }
+
// Command to change directory and run a program.
if (args[1] == "chdir" && args.size() >= 4) {
std::string const& directory = args[2];