Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8c4d4ea3 authored by Mark Punzalan's avatar Mark Punzalan
Browse files

[aapt2] Allow multi-line argument files

Previously, aapt2 would read arguments from files but they all have to
be in one line, separated by spaces. Now they can be spread over
multiple lines in the file.

Bug: 297373084
Bug: 315329624
Test: Called `aapt2 link ... --feature_flags @args.txt` with args.txt
containing flag values over multiple lines. Verified the resulting APK
has the expected output.

Change-Id: I91be6c7a869f63eafd88c04de69401d248f05545
parent 4b564ded
Loading
Loading
Loading
Loading
+12 −6
Original line number Diff line number Diff line
@@ -251,10 +251,13 @@ bool AppendArgsFromFile(StringPiece path, std::vector<std::string>* out_arglist,
    return false;
  }

  for (StringPiece line : util::Tokenize(contents, ' ')) {
  for (StringPiece line : util::Tokenize(contents, '\n')) {
    line = util::TrimWhitespace(line);
    if (!line.empty()) {
      out_arglist->emplace_back(line);
    for (StringPiece arg : util::Tokenize(line, ' ')) {
      arg = util::TrimWhitespace(arg);
      if (!arg.empty()) {
        out_arglist->emplace_back(arg);
      }
    }
  }
  return true;
@@ -270,10 +273,13 @@ bool AppendSetArgsFromFile(StringPiece path, std::unordered_set<std::string>* ou
    return false;
  }

  for (StringPiece line : util::Tokenize(contents, ' ')) {
  for (StringPiece line : util::Tokenize(contents, '\n')) {
    line = util::TrimWhitespace(line);
    if (!line.empty()) {
      out_argset->emplace(line);
    for (StringPiece arg : util::Tokenize(line, ' ')) {
      arg = util::TrimWhitespace(arg);
      if (!arg.empty()) {
        out_argset->emplace(arg);
      }
    }
  }
  return true;
+42 −1
Original line number Diff line number Diff line
@@ -25,6 +25,9 @@

using ::android::base::StringPrintf;

using ::testing::ElementsAre;
using ::testing::UnorderedElementsAre;

namespace aapt {
namespace file {

@@ -34,9 +37,11 @@ constexpr const char sTestDirSep = '\\';
constexpr const char sTestDirSep = '/';
#endif

class FilesTest : public ::testing::Test {
class FilesTest : public TestDirectoryFixture {
 public:
  void SetUp() override {
    TestDirectoryFixture::SetUp();

    std::stringstream builder;
    builder << "hello" << sDirSep << "there";
    expected_path_ = builder.str();
@@ -66,6 +71,42 @@ TEST_F(FilesTest, AppendPathWithLeadingOrTrailingSeparators) {
  EXPECT_EQ(expected_path_, base);
}

TEST_F(FilesTest, AppendArgsFromFile) {
  const std::string args_file = GetTestPath("args.txt");
  WriteFile(args_file,
            "  \n"
            "arg1 arg2   arg3  \n"
            "   arg4 arg5");
  std::vector<std::string> args;
  std::string error;
  ASSERT_TRUE(AppendArgsFromFile(args_file, &args, &error));
  EXPECT_THAT(args, ElementsAre("arg1", "arg2", "arg3", "arg4", "arg5"));
}

TEST_F(FilesTest, AppendArgsFromFile_InvalidFile) {
  std::vector<std::string> args;
  std::string error;
  ASSERT_FALSE(AppendArgsFromFile(GetTestPath("not_found.txt"), &args, &error));
}

TEST_F(FilesTest, AppendSetArgsFromFile) {
  const std::string args_file = GetTestPath("args.txt");
  WriteFile(args_file,
            "  \n"
            "arg2 arg4   arg1  \n"
            "   arg5 arg3");
  std::unordered_set<std::string> args;
  std::string error;
  ASSERT_TRUE(AppendSetArgsFromFile(args_file, &args, &error));
  EXPECT_THAT(args, UnorderedElementsAre("arg1", "arg2", "arg3", "arg4", "arg5"));
}

TEST_F(FilesTest, AppendSetArgsFromFile_InvalidFile) {
  std::unordered_set<std::string> args;
  std::string error;
  ASSERT_FALSE(AppendSetArgsFromFile(GetTestPath("not_found.txt"), &args, &error));
}

#ifdef _WIN32
TEST_F(FilesTest, WindowsMkdirsLongPath) {
  // Creating directory paths longer than the Windows maximum path length (260 charatcers) should