Hello.
I following patch I have added support for multiple source directories into
copy_directory command.
Comments are welcomed.
Best Regards
Bartosz
From 6ff0139ae43d4ac4a503007dd6abac5dcefd1083 Mon Sep 17 00:00:00 2001
From: Bartosz Kosiorek
Date: Sun, 6 Dec 2015 20:30:44 +0100
Subject: [PATCH] Add support for multiple directory for "copy_directory"
command
---
Help/manual/cmake.1.rst| 11 +---
Source/cmcmd.cxx | 30 +-
...ree-source-files-target-is-directory-result.txt | 1 +
...ree-source-files-target-is-directory-stderr.txt | 0
...ry-three-source-files-target-is-file-result.txt | 1 +
...ry-three-source-files-target-is-file-stderr.txt | 3 +++
...ree-source-files-target-is-not-exist-result.txt | 1 +
...ree-source-files-target-is-not-exist-stderr.txt | 0
Tests/RunCMake/CommandLine/RunCMakeTest.cmake | 17
Tests/RunCMake/CommandLine/copy_input/d1/d1.txt| 0
Tests/RunCMake/CommandLine/copy_input/d2/d2.txt| 0
Tests/RunCMake/CommandLine/copy_input/d3/d3.txt| 0
12 files changed, 49 insertions(+), 15 deletions(-)
create mode 100644 Tests/RunCMake/CommandLine/E_copy_directory-three-source-files-target-is-directory-result.txt
create mode 100644 Tests/RunCMake/CommandLine/E_copy_directory-three-source-files-target-is-directory-stderr.txt
create mode 100644 Tests/RunCMake/CommandLine/E_copy_directory-three-source-files-target-is-file-result.txt
create mode 100644 Tests/RunCMake/CommandLine/E_copy_directory-three-source-files-target-is-file-stderr.txt
create mode 100644 Tests/RunCMake/CommandLine/E_copy_directory-three-source-files-target-is-not-exist-result.txt
create mode 100644 Tests/RunCMake/CommandLine/E_copy_directory-three-source-files-target-is-not-exist-stderr.txt
create mode 100644 Tests/RunCMake/CommandLine/copy_input/d1/d1.txt
create mode 100644 Tests/RunCMake/CommandLine/copy_input/d2/d2.txt
create mode 100644 Tests/RunCMake/CommandLine/copy_input/d3/d3.txt
diff --git a/Help/manual/cmake.1.rst b/Help/manual/cmake.1.rst
index 086f259..4156638 100644
--- a/Help/manual/cmake.1.rst
+++ b/Help/manual/cmake.1.rst
@@ -170,13 +170,18 @@ Available commands are:
Check if file1 is same as file2.
``copy ... ``
- Copy files to 'destination' (either file or directory).
+ Copy files to (either file or directory).
+ If multiple files are specified, the must be
+ directory and it must exists.
-``copy_directory ``
- Copy directory 'source' content to directory 'destination'.
+``copy_directory ... ``
+ Copy content of ... directories to directory.
+ If directory is not exist, then it will be created.
``copy_if_different ... ``
Copy files if input has changed. Destination could be file or directory.
+ If multiple files are specified, the must be
+ directory and it must exists.
``echo [...]``
Displays arguments as text.
diff --git a/Source/cmcmd.cxx b/Source/cmcmd.cxx
index 0dc5a9a..6a4234f 100644
--- a/Source/cmcmd.cxx
+++ b/Source/cmcmd.cxx
@@ -54,12 +54,12 @@ void CMakeCommandUsage(const char* program)
errorStream
<< "Usage: " << program << " -E [arguments...]\n"
<< "Available commands: \n"
-<< " chdir dir cmd [args]... - run command in a given directory\n"
+<< " chdir dir cmd [args...] - run command in a given directory\n"
<< " compare_files file1 file2 - check if file1 is same as file2\n"
<< " copy ... destination - copy files to destination "
"(either file or directory)\n"
-<< " copy_directory source destination - copy directory 'source' "
- "content to directory 'destination'\n"
+<< " copy_directory ... destination - copy content of ... "
+ "directories to 'destination' directory\n"
<< " copy_if_different ... destination - copy files if it has "
"changed\n"
<< " echo [...]- displays arguments as text\n"
@@ -197,8 +197,8 @@ int cmcmd::ExecuteCMakeCommand(std::vector& args)
args[args.size() - 1].c_str()))
{
std::cerr << "Error copying file (if different) from \""
- << args[cc] << "\" to \"" << args[args.size() - 1]
- << "\".\n";
+<< args[cc] << "\" to \"" << args[args.size() - 1]
+<< "\".\n";
return_value = 1;
}
}
@@ -206,16 +206,22 @@ int cmcmd::ExecuteCMakeCommand(std::vector& args)
}
// Copy directory content
-if (args[1] == "copy_directory" && args.size() == 4)
+if (args[1] == "copy_directory" && args.size() > 3)
{
- if(!cmSystemTools::CopyADirectory(args[2], args[3]))
+ // If error occurs we want to continue copying next files.
+ bool return_value = 0;
+ for (std::string::size_type cc = 2; cc < args.size() - 1; cc ++)
{
-std::cerr << "Error copying directory from \""
- <<