diff options
author | Johnny Jazeix <jazeix@gmail.com> | 2020-04-15 18:56:56 (GMT) |
---|---|---|
committer | Johnny Jazeix <jazeix@gmail.com> | 2020-04-15 18:56:56 (GMT) |
commit | a625f30785130586a7d2a59c13a7526eab8b3086 (patch) | |
tree | a4008f2a62052a6f1837d91e39e3825796f61c63 /Source | |
parent | fab932c3cba9423443c7ab25fda3999e4fc4b347 (diff) | |
download | CMake-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.cxx | 35 |
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]; |