From: Alvaro Leiva Geisse Date: Mon, 15 Jan 2018 22:07:55 +0000 (-0800) Subject: allow command to accept "--" separator X-Git-Tag: v2018.01.22.00~34 X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=commitdiff_plain;h=d7b6ad4972b288f90bf57d7597103c44c244decd;hp=cd1bdc912603c0358ba733d379a74ae90ab3a437 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 --- diff --git a/folly/experimental/NestedCommandLineApp.cpp b/folly/experimental/NestedCommandLineApp.cpp index 789a8f43..e694f1f5 100644 --- a/folly/experimental/NestedCommandLineApp.cpp +++ b/folly/experimental/NestedCommandLineApp.cpp @@ -228,7 +228,22 @@ void NestedCommandLineApp::doRun(const std::vector& args) { if (programName_.empty()) { programName_ = guessProgramName(); } - auto parsed = parseNestedCommandLine(args, globalOptions_); + + bool not_clean = false; + std::vector cleanArgs; + std::vector 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::store(parsed.options, vm); if (vm.count("help")) { @@ -258,12 +273,15 @@ void NestedCommandLineApp::doRun(const std::vector& args) { auto cmdOptions = po::command_line_parser(parsed.rest).options(info.options).run(); + po::store(cmdOptions, vm); po::notify(vm); auto cmdArgs = po::collect_unrecognized(cmdOptions.options, po::include_positional); + cmdArgs.insert(cmdArgs.end(), endArgs.begin(), endArgs.end()); + if (initFunction_) { initFunction_(cmd, vm, cmdArgs); } diff --git a/folly/experimental/test/NestedCommandLineAppTest.cpp b/folly/experimental/test/NestedCommandLineAppTest.cpp index 27c698da..3d8e3acf 100644 --- a/folly/experimental/test/NestedCommandLineAppTest.cpp +++ b/folly/experimental/test/NestedCommandLineAppTest.cpp @@ -75,6 +75,7 @@ TEST(ProgramOptionsTest, Help) { callHelper({"--help"}); callHelper({"--help", "foo"}); callHelper({"--help", "bar"}); + callHelper({"--help", "--", "bar"}); callHelper({"help"}); callHelper({"help", "foo"}); callHelper({"help", "bar"}); @@ -82,6 +83,9 @@ TEST(ProgramOptionsTest, Help) { // wrong command name callHelper({"--help", "qux"}, 1); callHelper({"help", "qux"}, 1); + + // anything after -- is parsed as arguments + callHelper({"--", "help", "bar"}, 1); } TEST(ProgramOptionsTest, DevFull) { @@ -89,6 +93,20 @@ TEST(ProgramOptionsTest, DevFull) { 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) { EXPECT_EQ( "running foo\n"