Commit d7b6ad49 authored by Alvaro Leiva Geisse's avatar Alvaro Leiva Geisse Committed by Facebook Github Bot

allow command to accept "--" separator

Summary:
Currently NestedCommandLineApp does not support `--` to indicate that the following arguments should be parsed as arguments, not nested commands or options.
This diff fix that by whitelisting any argument given after "--"

Reviewed By: yfeldblum

Differential Revision: D6721144

fbshipit-source-id: 38a850b6ea803dc758c5fe65a21575e5faeac35b
parent cd1bdc91
...@@ -228,7 +228,22 @@ void NestedCommandLineApp::doRun(const std::vector<std::string>& args) { ...@@ -228,7 +228,22 @@ void NestedCommandLineApp::doRun(const std::vector<std::string>& args) {
if (programName_.empty()) { if (programName_.empty()) {
programName_ = guessProgramName(); programName_ = guessProgramName();
} }
auto parsed = parseNestedCommandLine(args, globalOptions_);
bool not_clean = false;
std::vector<std::string> cleanArgs;
std::vector<std::string> endArgs;
for (auto& na : args) {
if (na == "--") {
not_clean = true;
} else if (not_clean) {
endArgs.push_back(na);
} else {
cleanArgs.push_back(na);
}
}
auto parsed = parseNestedCommandLine(cleanArgs, globalOptions_);
po::variables_map vm; po::variables_map vm;
po::store(parsed.options, vm); po::store(parsed.options, vm);
if (vm.count("help")) { if (vm.count("help")) {
...@@ -258,12 +273,15 @@ void NestedCommandLineApp::doRun(const std::vector<std::string>& args) { ...@@ -258,12 +273,15 @@ void NestedCommandLineApp::doRun(const std::vector<std::string>& args) {
auto cmdOptions = auto cmdOptions =
po::command_line_parser(parsed.rest).options(info.options).run(); po::command_line_parser(parsed.rest).options(info.options).run();
po::store(cmdOptions, vm); po::store(cmdOptions, vm);
po::notify(vm); po::notify(vm);
auto cmdArgs = po::collect_unrecognized(cmdOptions.options, auto cmdArgs = po::collect_unrecognized(cmdOptions.options,
po::include_positional); po::include_positional);
cmdArgs.insert(cmdArgs.end(), endArgs.begin(), endArgs.end());
if (initFunction_) { if (initFunction_) {
initFunction_(cmd, vm, cmdArgs); initFunction_(cmd, vm, cmdArgs);
} }
......
...@@ -75,6 +75,7 @@ TEST(ProgramOptionsTest, Help) { ...@@ -75,6 +75,7 @@ TEST(ProgramOptionsTest, Help) {
callHelper({"--help"}); callHelper({"--help"});
callHelper({"--help", "foo"}); callHelper({"--help", "foo"});
callHelper({"--help", "bar"}); callHelper({"--help", "bar"});
callHelper({"--help", "--", "bar"});
callHelper({"help"}); callHelper({"help"});
callHelper({"help", "foo"}); callHelper({"help", "foo"});
callHelper({"help", "bar"}); callHelper({"help", "bar"});
...@@ -82,6 +83,9 @@ TEST(ProgramOptionsTest, Help) { ...@@ -82,6 +83,9 @@ TEST(ProgramOptionsTest, Help) {
// wrong command name // wrong command name
callHelper({"--help", "qux"}, 1); callHelper({"--help", "qux"}, 1);
callHelper({"help", "qux"}, 1); callHelper({"help", "qux"}, 1);
// anything after -- is parsed as arguments
callHelper({"--", "help", "bar"}, 1);
} }
TEST(ProgramOptionsTest, DevFull) { TEST(ProgramOptionsTest, DevFull) {
...@@ -89,6 +93,20 @@ TEST(ProgramOptionsTest, DevFull) { ...@@ -89,6 +93,20 @@ TEST(ProgramOptionsTest, DevFull) {
callHelper({"--help"}, 1, full.fd()); callHelper({"--help"}, 1, full.fd());
} }
TEST(ProgramOptionsTest, CutArguments) {
// anything after -- is parsed as arguments
EXPECT_EQ(
"running foo\n"
"foo global-foo 43\n"
"foo local-foo 42\n"
"foo arg b\n"
"foo arg --local-foo\n"
"foo arg 44\n"
"foo arg a\n",
callHelper(
{"foo", "--global-foo", "43", "--", "b", "--local-foo", "44", "a"}));
}
TEST(ProgramOptionsTest, Success) { TEST(ProgramOptionsTest, Success) {
EXPECT_EQ( EXPECT_EQ(
"running foo\n" "running foo\n"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment