diff options
author | 2024-10-29 17:44:25 -0700 | |
---|---|---|
committer | 2024-10-29 18:00:49 -0700 | |
commit | c10aa455762e84a3bb51fdb061b85f7712c42f80 (patch) | |
tree | 1de36bf22ef409a1c32d2a2e6a4a5ce416fc005b | |
parent | d0c4ff5d990ffccf89b906d36fd0ab21d562f098 (diff) |
[aapt2] Allow --flag=value command line options
+ fix a wrong return value for a missing argument
Flag: EXEMPT tiny tool feature
Test: unit tests
Change-Id: I845f673081ec3b3c395bbe0355ced07fa45a5586
-rw-r--r-- | tools/aapt2/cmd/Command.cpp | 27 | ||||
-rw-r--r-- | tools/aapt2/cmd/Command_test.cpp | 24 |
2 files changed, 44 insertions, 7 deletions
diff --git a/tools/aapt2/cmd/Command.cpp b/tools/aapt2/cmd/Command.cpp index 514651e92c27..449d93dd8c0b 100644 --- a/tools/aapt2/cmd/Command.cpp +++ b/tools/aapt2/cmd/Command.cpp @@ -213,15 +213,28 @@ int Command::Execute(const std::vector<StringPiece>& args, std::ostream* out_err bool match = false; for (Flag& flag : flags_) { - if (arg == flag.name) { + // Allow both "--arg value" and "--arg=value" syntax. + if (arg.starts_with(flag.name) && + (arg.size() == flag.name.size() || (flag.num_args > 0 && arg[flag.name.size()] == '='))) { if (flag.num_args > 0) { - i++; - if (i >= args.size()) { - *out_error << flag.name << " missing argument.\n\n"; - Usage(out_error); - return false; + if (arg.size() == flag.name.size()) { + i++; + if (i >= args.size()) { + *out_error << flag.name << " missing argument.\n\n"; + Usage(out_error); + return 1; + } + arg = args[i]; + } else { + arg.remove_prefix(flag.name.size() + 1); + // Disallow empty arguments after '='. + if (arg.empty()) { + *out_error << flag.name << " has empty argument.\n\n"; + Usage(out_error); + return 1; + } } - flag.action(args[i]); + flag.action(arg); } else { flag.action({}); } diff --git a/tools/aapt2/cmd/Command_test.cpp b/tools/aapt2/cmd/Command_test.cpp index 7aa1aa017f7b..20d87e0025c3 100644 --- a/tools/aapt2/cmd/Command_test.cpp +++ b/tools/aapt2/cmd/Command_test.cpp @@ -19,6 +19,7 @@ #include "test/Test.h" using ::testing::Eq; +using namespace std::literals; namespace aapt { @@ -94,4 +95,27 @@ TEST(CommandTest, LongFullyQualifiedPathWindows) { } #endif +TEST(CommandTest, OptionsWithValues) { + TestCommand command; + std::string flag; + command.AddRequiredFlag("--flag", "", &flag); + + ASSERT_EQ(0, command.Execute({"--flag"s, "1"s}, &std::cerr)); + EXPECT_STREQ("1", flag.c_str()); + + ASSERT_EQ(0, command.Execute({"--flag=1"s}, &std::cerr)); + EXPECT_STREQ("1", flag.c_str()); + + ASSERT_EQ(0, command.Execute({"--flag"s, "=2"s}, &std::cerr)); + EXPECT_STREQ("=2", flag.c_str()); + + ASSERT_EQ(0, command.Execute({"--flag"s, "--flag"s}, &std::cerr)); + EXPECT_STREQ("--flag", flag.c_str()); + + EXPECT_NE(0, command.Execute({"--flag"s}, &std::cerr)); + EXPECT_NE(0, command.Execute({"--flag="s}, &std::cerr)); + EXPECT_NE(0, command.Execute({"--flag1=2"s}, &std::cerr)); + EXPECT_NE(0, command.Execute({"--flag1"s, "2"s}, &std::cerr)); +} + } // namespace aapt
\ No newline at end of file |