Add a `--multi_release` option to singlejar PiperOrigin-RevId: 437129108
diff --git a/src/tools/singlejar/combiners.cc b/src/tools/singlejar/combiners.cc index e4da589..a6c8d59 100644 --- a/src/tools/singlejar/combiners.cc +++ b/src/tools/singlejar/combiners.cc
@@ -188,6 +188,8 @@ static const char *MULTI_RELEASE_PREFIX = "Multi-Release: "; static const size_t MULTI_RELEASE_PREFIX_LENGTH = strlen(MULTI_RELEASE_PREFIX); +void ManifestCombiner::EnableMultiRelease() { multi_release_ = true; } + void ManifestCombiner::AppendLine(const std::string &line) { if (line.find(MULTI_RELEASE_PREFIX, 0, MULTI_RELEASE_PREFIX_LENGTH) != std::string::npos) {
diff --git a/src/tools/singlejar/combiners.h b/src/tools/singlejar/combiners.h index a8e372e..b484140 100644 --- a/src/tools/singlejar/combiners.h +++ b/src/tools/singlejar/combiners.h
@@ -145,6 +145,8 @@ } ~ManifestCombiner() override; + void EnableMultiRelease(); + void AppendLine(const std::string &line); bool Merge(const CDH *cdh, const LH *lh) override;
diff --git a/src/tools/singlejar/options.cc b/src/tools/singlejar/options.cc index f6673c7..633fd97 100644 --- a/src/tools/singlejar/options.cc +++ b/src/tools/singlejar/options.cc
@@ -53,7 +53,8 @@ tokens->MatchAndSet("--warn_duplicate_resources", &warn_duplicate_resources) || tokens->MatchAndSet("--nocompress_suffixes", &nocompress_suffixes) || - tokens->MatchAndSet("--check_desugar_deps", &check_desugar_deps)) { + tokens->MatchAndSet("--check_desugar_deps", &check_desugar_deps) || + tokens->MatchAndSet("--multi_release", &multi_release)) { return true; } else if (tokens->MatchAndSet("--build_info_file", &optarg)) { build_info_files.push_back(optarg);
diff --git a/src/tools/singlejar/options.h b/src/tools/singlejar/options.h index 0c3c960..977e5de 100644 --- a/src/tools/singlejar/options.h +++ b/src/tools/singlejar/options.h
@@ -33,7 +33,8 @@ preserve_compression(false), verbose(false), warn_duplicate_resources(false), - check_desugar_deps(false) {} + check_desugar_deps(false), + multi_release(false) {} virtual ~Options() {} @@ -62,6 +63,7 @@ bool verbose; bool warn_duplicate_resources; bool check_desugar_deps; + bool multi_release; protected: /*
diff --git a/src/tools/singlejar/options_test.cc b/src/tools/singlejar/options_test.cc index e9e591b..9da883d 100644 --- a/src/tools/singlejar/options_test.cc +++ b/src/tools/singlejar/options_test.cc
@@ -36,6 +36,7 @@ EXPECT_FALSE(options.verbose); EXPECT_FALSE(options.warn_duplicate_resources); EXPECT_FALSE(options.check_desugar_deps); + EXPECT_FALSE(options.multi_release); EXPECT_EQ("output_jar", options.output_jar); } @@ -44,7 +45,9 @@ "--verbose", "--warn_duplicate_resources", "--check_desugar_deps", - "--output", "output_jar"}; + "--output", + "output_jar", + "--multi_release"}; Options options; options.ParseCommandLine(arraysize(args), args); @@ -56,6 +59,7 @@ ASSERT_TRUE(options.verbose); ASSERT_TRUE(options.warn_duplicate_resources); ASSERT_TRUE(options.check_desugar_deps); + ASSERT_TRUE(options.multi_release); } TEST(OptionsTest, SingleOptargs) {
diff --git a/src/tools/singlejar/output_jar.cc b/src/tools/singlejar/output_jar.cc index 2b03d736..d6b2081 100644 --- a/src/tools/singlejar/output_jar.cc +++ b/src/tools/singlejar/output_jar.cc
@@ -134,6 +134,9 @@ AppendCDSArchive(options->cds_archive); } + if (options_->multi_release) { + manifest_.EnableMultiRelease(); + } for (auto &manifest_line : options_->manifest_lines) { if (!manifest_line.empty()) { manifest_.AppendLine(manifest_line);
diff --git a/src/tools/singlejar/output_jar_simple_test.cc b/src/tools/singlejar/output_jar_simple_test.cc index 7b427c8..d1a6645 100644 --- a/src/tools/singlejar/output_jar_simple_test.cc +++ b/src/tools/singlejar/output_jar_simple_test.cc
@@ -889,4 +889,30 @@ input_jar.Close(); } +// --multi_release option. +TEST_F(OutputJarSimpleTest, MultiRelease) { + string out_path = OutputFilePath("out.jar"); + CreateOutput(out_path, {"--multi_release"}); + string manifest = GetEntryContents(out_path, "META-INF/MANIFEST.MF"); + EXPECT_EQ( + "Manifest-Version: 1.0\r\n" + "Created-By: singlejar\r\n" + "Multi-Release: true\r\n" + "\r\n", + manifest); +} + +// --multi_release option doesn't override --deploy_manifest_lines. +TEST_F(OutputJarSimpleTest, MultiReleaseManifestLines) { + string out_path = OutputFilePath("out.jar"); + CreateOutput(out_path, {"--multi_release", "--deploy_manifest_lines", + "Multi-Release: false"}); + string manifest = GetEntryContents(out_path, "META-INF/MANIFEST.MF"); + EXPECT_EQ( + "Manifest-Version: 1.0\r\n" + "Created-By: singlejar\r\n" + "\r\n", + manifest); +} + } // namespace