diff options
author | Brad King <brad.king@kitware.com> | 2022-06-29 21:08:03 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2022-06-29 21:43:41 (GMT) |
commit | 7c83265e594247013f4cba9b45c252a9425ad657 (patch) | |
tree | 9d20dbf3172ca45b8e60f30cc02a90dd178286c6 /Source | |
parent | dfff470d156b70b71a2349b51dee4da4275a75bd (diff) | |
download | CMake-7c83265e594247013f4cba9b45c252a9425ad657.zip CMake-7c83265e594247013f4cba9b45c252a9425ad657.tar.gz CMake-7c83265e594247013f4cba9b45c252a9425ad657.tar.bz2 |
file(ARCHIVE*): Simplify acceptance of empty list arguments
In `cmArgumentParser`, a keyword bound to a `std::vector<std::string>`
value is reported in the list of keywords with missing values if the
keyword appears followed by an empty list. For cases where we want to
tolerate empty lists, clients need to filter out such keywords
themselves before producing an error message. This may be improved in
the future, but that is out of scope here.
In commit c7e1198a23 (file: Add ARCHIVE_{CREATE|EXTRACT} subcommands,
2020-03-13, v3.18.0-rc1~530^2), a pattern for filtering out keywords
that accept empty lists was copied from commit c998c8d560
(file(GET_RUNTIME_DEPENDENCIES): Tolerate empty list arguments,
2020-01-22, v3.17.0-rc1~111^2~1) incorrectly in two ways:
* Keywords were included in the filter that do not accept empty lists.
* Keywords were not in sorted order, breaking the filter operation.
Those two bugs mostly canceled each other out, and the resulting
behavior was to correctly report keywords with missing values.
However, the `MTIME` keyword was accidentally accepted with no value
by pretending the keyword was not given at all.
Simplify the logic by removing keywords from the filters that should not
be there. Leave `MTIME` in the filter for compatibility.
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmFileCommand.cxx | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index 7d05347..1cfe29c 100644 --- a/Source/cmFileCommand.cxx +++ b/Source/cmFileCommand.cxx @@ -3113,6 +3113,7 @@ bool HandleGetRuntimeDependenciesCommand(std::vector<std::string> const& args, return false; } + // Arguments that are allowed to be empty lists. Keep entries sorted! const std::vector<std::string> LIST_ARGS = { "DIRECTORIES", "EXECUTABLES", @@ -3402,8 +3403,13 @@ bool HandleArchiveCreateCommand(std::vector<std::string> const& args, return false; } + // Arguments that are allowed to be empty lists. Keep entries sorted! const std::vector<std::string> LIST_ARGS = { - "OUTPUT", "FORMAT", "COMPRESSION", "COMPRESSION_LEVEL", "MTIME", "PATHS" + "MTIME", // "MTIME" should not be in this list because it requires one + // value, but it has long been accidentally accepted without + // one and treated as if an empty value were given. + // Fixing this would require a policy. + "PATHS", // "PATHS" is here only so we can issue a custom error below. }; auto kwbegin = keywordsMissingValues.cbegin(); auto kwend = cmRemoveMatching(keywordsMissingValues, LIST_ARGS); @@ -3530,8 +3536,8 @@ bool HandleArchiveExtractCommand(std::vector<std::string> const& args, return false; } - const std::vector<std::string> LIST_ARGS = { "INPUT", "DESTINATION", - "PATTERNS" }; + // Arguments that are allowed to be empty lists. Keep entries sorted! + const std::vector<std::string> LIST_ARGS = { "PATTERNS" }; auto kwbegin = keywordsMissingValues.cbegin(); auto kwend = cmRemoveMatching(keywordsMissingValues, LIST_ARGS); if (kwend != kwbegin) { |