file(): TOUCH, TOUCH_NOCREATE and MAKE_DIRECTORY accept empty lists

Projects may be generating a list of files or directories to pass as arguments
to file(TOUCH), file(TOUCH_NOCREATE), or file(MAKE_DIRECTORY). Those
lists might end up being empty, so rather than requiring at least one item,
allow an empty list.

Fixes: #24897
This commit is contained in:
Craig Scott
2024-05-31 21:20:30 +10:00
parent 140766867b
commit 7c516f7e28
7 changed files with 29 additions and 21 deletions
+17 -8
View File
@@ -73,6 +73,11 @@ namespace {
bool HandleWriteImpl(std::vector<std::string> const& args, bool append,
cmExecutionStatus& status)
{
if (args.size() < 2) {
status.SetError(cmStrCat(
args[0], " must be called with at least one additional argument."));
return false;
}
auto i = args.begin();
i++; // Get rid of subcommand
@@ -658,8 +663,11 @@ bool HandleStringsCommand(std::vector<std::string> const& args,
bool HandleGlobImpl(std::vector<std::string> const& args, bool recurse,
cmExecutionStatus& status)
{
// File commands has at least one argument
assert(args.size() > 1);
if (args.size() < 2) {
status.SetError(cmStrCat(
args[0], " must be called with at least one additional argument."));
return false;
}
auto i = args.begin();
@@ -869,8 +877,8 @@ bool HandleGlobRecurseCommand(std::vector<std::string> const& args,
bool HandleMakeDirectoryCommand(std::vector<std::string> const& args,
cmExecutionStatus& status)
{
// File command has at least one argument
assert(args.size() > 1);
// Projects might pass a dynamically generated list of directories, and it
// could be an empty list. We should not assume there is at least one.
std::string expr;
for (std::string const& arg :
@@ -903,8 +911,8 @@ bool HandleMakeDirectoryCommand(std::vector<std::string> const& args,
bool HandleTouchImpl(std::vector<std::string> const& args, bool create,
cmExecutionStatus& status)
{
// File command has at least one argument
assert(args.size() > 1);
// Projects might pass a dynamically generated list of files, and it
// could be an empty list. We should not assume there is at least one.
for (std::string const& arg :
cmMakeRange(args).advance(1)) // Get rid of subcommand
@@ -3918,8 +3926,9 @@ bool HandleChmodRecurseCommand(std::vector<std::string> const& args,
bool cmFileCommand(std::vector<std::string> const& args,
cmExecutionStatus& status)
{
if (args.size() < 2) {
status.SetError("must be called with at least two arguments.");
if (args.empty()) {
status.SetError(
"given no arguments, but it requires at least a sub-command.");
return false;
}