From feb9cebd9058d54dc0c8cb68403dc92b9267b6fa Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 25 Jun 2025 15:16:47 +0800 Subject: [PATCH 1/9] Generate `PropertiesFileTransformerFunctionalTest` --- .../PropertiesFileTransformerTest.kt | 135 ++++++++++++++++++ .../shadow/transformers/TransformersTest.kt | 1 - 2 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt diff --git a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt new file mode 100644 index 000000000..e413a92bb --- /dev/null +++ b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt @@ -0,0 +1,135 @@ +package com.github.jengelman.gradle.plugins.shadow.transformers + +import assertk.assertThat +import assertk.assertions.contains +import assertk.assertions.isEqualTo +import com.github.jengelman.gradle.plugins.shadow.util.getContent +import kotlin.io.path.appendText +import org.junit.jupiter.api.Test +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.ValueSource + +class PropertiesFileTransformerFunctionalTest : BaseTransformerTest() { + + @ParameterizedTest + @ValueSource(strings = ["First", "Latest", "Append"]) + fun `should merge properties files with different strategies`(strategy: String) { + val one = buildJarOne { + insert("META-INF/test.properties", "key1=one\nkey2=one") + } + val two = buildJarTwo { + insert("META-INF/test.properties", "key2=two\nkey3=two") + } + projectScriptPath.appendText( + """ + dependencies { + ${implementationFiles(one, two)} + } + $shadowJar { + transform(com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer) { + mergeStrategy = com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer.MergeStrategy.$strategy + mergeSeparator = ";" + paths = ["META-INF/test.properties"] + } + } + """.trimIndent(), + ) + + run(shadowJarTask) + + val content = outputShadowJar.use { it.getContent("META-INF/test.properties") } + when (strategy) { + "First" -> assertThat(content).contains("key1=one", "key2=one", "key3=two") + "Latest" -> assertThat(content).contains("key1=one", "key2=two", "key3=two") + "Append" -> assertThat(content).contains("key1=one", "key2=one;two", "key3=two") + } + } + + @Test + fun `should merge properties with key transformer`() { + val one = buildJarOne { + insert("META-INF/test.properties", "foo=bar") + } + val two = buildJarTwo { + insert("META-INF/test.properties", "FOO=baz") + } + projectScriptPath.appendText( + """ + dependencies { + ${implementationFiles(one, two)} + } + $shadowJar { + transform(com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer) { + mergeStrategy = com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer.MergeStrategy.Append + keyTransformer = { key -> key.toUpperCase() } + paths = ["META-INF/test.properties"] + } + } + """.trimIndent(), + ) + + run(shadowJarTask) + + val content = outputShadowJar.use { it.getContent("META-INF/test.properties") } + assertThat(content).contains("FOO=bar,baz") + } + + @Test + fun `should merge properties with mappings`() { + val one = buildJarOne { + insert("META-INF/a.properties", "k=1") + insert("META-INF/b.properties", "k=2") + } + val two = buildJarTwo { + insert("META-INF/a.properties", "k=3") + insert("META-INF/b.properties", "k=4") + } + projectScriptPath.appendText( + """ + dependencies { + ${implementationFiles(one, two)} + } + $shadowJar { + transform(com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer) { + mappings = [ + "META-INF/a.properties": ["mergeStrategy": "append", "mergeSeparator": ":"], + "META-INF/b.properties": ["mergeStrategy": "latest"] + ] + } + } + """.trimIndent(), + ) + + run(shadowJarTask) + + assertThat(outputShadowJar).useAll { + getContent("META-INF/a.properties").isEqualTo("k=1:3") + getContent("META-INF/b.properties").isEqualTo("k=4") + } + } + + @Test + fun `should merge properties with specified charset`() { + val one = buildJarOne { + insert("META-INF/utf8.properties", "foo=传傳") + } + projectScriptPath.appendText( + """ + dependencies { + ${implementationFiles(one)} + } + $shadowJar { + transform(com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer) { + charsetName = "utf-8" + paths = ["META-INF/utf8.properties"] + } + } + """.trimIndent(), + ) + + run(shadowJarTask) + + val content = outputShadowJar.use { it.getContent("META-INF/utf8.properties") } + assertThat(content).contains("foo=传傳") + } +} diff --git a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/TransformersTest.kt b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/TransformersTest.kt index 2ed0f9019..6940adad5 100644 --- a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/TransformersTest.kt +++ b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/TransformersTest.kt @@ -195,7 +195,6 @@ class TransformersTest : BaseTransformerTest() { "{ resource.set(\"test.file\"); file.fileValue(file(\"test/some.file\")) }" to IncludeResourceTransformer::class, "" to ManifestAppenderTransformer::class, "" to ManifestResourceTransformer::class, - "{ keyTransformer = { it.toLowerCase() } }" to PropertiesFileTransformer::class, ) } } From caad7f047b9b621d1941ccb19bb1bf8078fd4509 Mon Sep 17 00:00:00 2001 From: Goooler Date: Mon, 30 Jun 2025 18:04:12 +0800 Subject: [PATCH 2/9] Renames --- .../PropertiesFileTransformerTest.kt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt index e413a92bb..365e963b6 100644 --- a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt +++ b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt @@ -9,11 +9,11 @@ import org.junit.jupiter.api.Test import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.ValueSource -class PropertiesFileTransformerFunctionalTest : BaseTransformerTest() { +class PropertiesFileTransformerTest : BaseTransformerTest() { @ParameterizedTest @ValueSource(strings = ["First", "Latest", "Append"]) - fun `should merge properties files with different strategies`(strategy: String) { + fun mergePropertiesWithDifferentStrategies(strategy: String) { val one = buildJarOne { insert("META-INF/test.properties", "key1=one\nkey2=one") } @@ -32,7 +32,7 @@ class PropertiesFileTransformerFunctionalTest : BaseTransformerTest() { paths = ["META-INF/test.properties"] } } - """.trimIndent(), + """.trimIndent(), ) run(shadowJarTask) @@ -46,7 +46,7 @@ class PropertiesFileTransformerFunctionalTest : BaseTransformerTest() { } @Test - fun `should merge properties with key transformer`() { + fun mergePropertiesWithKeyTransformer() { val one = buildJarOne { insert("META-INF/test.properties", "foo=bar") } @@ -65,7 +65,7 @@ class PropertiesFileTransformerFunctionalTest : BaseTransformerTest() { paths = ["META-INF/test.properties"] } } - """.trimIndent(), + """.trimIndent(), ) run(shadowJarTask) @@ -75,7 +75,7 @@ class PropertiesFileTransformerFunctionalTest : BaseTransformerTest() { } @Test - fun `should merge properties with mappings`() { + fun mergePropertiesWithMappings() { val one = buildJarOne { insert("META-INF/a.properties", "k=1") insert("META-INF/b.properties", "k=2") @@ -97,7 +97,7 @@ class PropertiesFileTransformerFunctionalTest : BaseTransformerTest() { ] } } - """.trimIndent(), + """.trimIndent(), ) run(shadowJarTask) @@ -109,7 +109,7 @@ class PropertiesFileTransformerFunctionalTest : BaseTransformerTest() { } @Test - fun `should merge properties with specified charset`() { + fun mergePropertiesWithSpecifiedCharset() { val one = buildJarOne { insert("META-INF/utf8.properties", "foo=传傳") } @@ -124,7 +124,7 @@ class PropertiesFileTransformerFunctionalTest : BaseTransformerTest() { paths = ["META-INF/utf8.properties"] } } - """.trimIndent(), + """.trimIndent(), ) run(shadowJarTask) From d8926f907dd7d802eaeb8cf4fcd953ceacf81596 Mon Sep 17 00:00:00 2001 From: Goooler Date: Mon, 30 Jun 2025 18:07:21 +0800 Subject: [PATCH 3/9] Update `mergePropertiesWithSpecifiedCharset` --- .../transformers/PropertiesFileTransformerTest.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt index 365e963b6..caf436988 100644 --- a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt +++ b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt @@ -111,15 +111,19 @@ class PropertiesFileTransformerTest : BaseTransformerTest() { @Test fun mergePropertiesWithSpecifiedCharset() { val one = buildJarOne { - insert("META-INF/utf8.properties", "foo=传傳") + insert("META-INF/utf8.properties", "foo=第一") + } + val two = buildJarTwo { + insert("META-INF/utf8.properties", "foo=第二") } projectScriptPath.appendText( """ dependencies { - ${implementationFiles(one)} + ${implementationFiles(one, two)} } $shadowJar { transform(com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer) { + mergeStrategy = com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer.MergeStrategy.Append charsetName = "utf-8" paths = ["META-INF/utf8.properties"] } @@ -130,6 +134,6 @@ class PropertiesFileTransformerTest : BaseTransformerTest() { run(shadowJarTask) val content = outputShadowJar.use { it.getContent("META-INF/utf8.properties") } - assertThat(content).contains("foo=传傳") + assertThat(content).contains("foo=第一,第二") } } From 53a46eb4e7b2c8babe893d3a59ed689977081ebe Mon Sep 17 00:00:00 2001 From: Goooler Date: Mon, 30 Jun 2025 18:14:08 +0800 Subject: [PATCH 4/9] Update `mergePropertiesWithDifferentStrategies` --- .../PropertiesFileTransformerTest.kt | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt index caf436988..013af3bd0 100644 --- a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt +++ b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt @@ -3,17 +3,18 @@ package com.github.jengelman.gradle.plugins.shadow.transformers import assertk.assertThat import assertk.assertions.contains import assertk.assertions.isEqualTo +import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer.MergeStrategy import com.github.jengelman.gradle.plugins.shadow.util.getContent import kotlin.io.path.appendText import org.junit.jupiter.api.Test import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.ValueSource +import org.junit.jupiter.params.provider.EnumSource class PropertiesFileTransformerTest : BaseTransformerTest() { @ParameterizedTest - @ValueSource(strings = ["First", "Latest", "Append"]) - fun mergePropertiesWithDifferentStrategies(strategy: String) { + @EnumSource(MergeStrategy::class) + fun mergePropertiesWithDifferentStrategies(strategy: MergeStrategy) { val one = buildJarOne { insert("META-INF/test.properties", "key1=one\nkey2=one") } @@ -37,12 +38,13 @@ class PropertiesFileTransformerTest : BaseTransformerTest() { run(shadowJarTask) - val content = outputShadowJar.use { it.getContent("META-INF/test.properties") } - when (strategy) { - "First" -> assertThat(content).contains("key1=one", "key2=one", "key3=two") - "Latest" -> assertThat(content).contains("key1=one", "key2=two", "key3=two") - "Append" -> assertThat(content).contains("key1=one", "key2=one;two", "key3=two") + val expected = when (strategy) { + MergeStrategy.First -> arrayOf("key1=one", "key2=one", "key3=two") + MergeStrategy.Latest -> arrayOf("key1=one", "key2=two", "key3=two") + MergeStrategy.Append -> arrayOf("key1=one", "key2=one;two", "key3=two") } + val content = outputShadowJar.use { it.getContent("META-INF/test.properties") } + assertThat(content).contains(*expected) } @Test From 28b0c2b829e877b23aa4957b54b36385f0fedfc0 Mon Sep 17 00:00:00 2001 From: Goooler Date: Mon, 30 Jun 2025 18:54:58 +0800 Subject: [PATCH 5/9] Cleanups --- .../PropertiesFileTransformerTest.kt | 115 ++++++++---------- 1 file changed, 51 insertions(+), 64 deletions(-) diff --git a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt index 013af3bd0..6ff869a9d 100644 --- a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt +++ b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt @@ -2,7 +2,6 @@ package com.github.jengelman.gradle.plugins.shadow.transformers import assertk.assertThat import assertk.assertions.contains -import assertk.assertions.isEqualTo import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer.MergeStrategy import com.github.jengelman.gradle.plugins.shadow.util.getContent import kotlin.io.path.appendText @@ -22,18 +21,14 @@ class PropertiesFileTransformerTest : BaseTransformerTest() { insert("META-INF/test.properties", "key2=two\nkey3=two") } projectScriptPath.appendText( - """ - dependencies { - ${implementationFiles(one, two)} - } - $shadowJar { - transform(com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer) { - mergeStrategy = com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer.MergeStrategy.$strategy - mergeSeparator = ";" - paths = ["META-INF/test.properties"] - } - } - """.trimIndent(), + transform( + dependenciesBlock = implementationFiles(one, two), + transformerBlock = """ + mergeStrategy = $mergeStrategyClassName.$strategy + mergeSeparator = ";" + paths = ["META-INF/test.properties"] + """.trimIndent(), + ), ) run(shadowJarTask) @@ -56,18 +51,14 @@ class PropertiesFileTransformerTest : BaseTransformerTest() { insert("META-INF/test.properties", "FOO=baz") } projectScriptPath.appendText( - """ - dependencies { - ${implementationFiles(one, two)} - } - $shadowJar { - transform(com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer) { - mergeStrategy = com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer.MergeStrategy.Append - keyTransformer = { key -> key.toUpperCase() } - paths = ["META-INF/test.properties"] - } - } - """.trimIndent(), + transform( + dependenciesBlock = implementationFiles(one, two), + transformerBlock = """ + mergeStrategy = $mergeStrategyClassName.Append + keyTransformer = { key -> key.toUpperCase() } + paths = ["META-INF/test.properties"] + """.trimIndent(), + ), ) run(shadowJarTask) @@ -77,65 +68,61 @@ class PropertiesFileTransformerTest : BaseTransformerTest() { } @Test - fun mergePropertiesWithMappings() { + fun mergePropertiesWithSpecifiedCharset() { val one = buildJarOne { - insert("META-INF/a.properties", "k=1") - insert("META-INF/b.properties", "k=2") + insert("META-INF/utf8.properties", "foo=第一") } val two = buildJarTwo { - insert("META-INF/a.properties", "k=3") - insert("META-INF/b.properties", "k=4") + insert("META-INF/utf8.properties", "foo=第二") } projectScriptPath.appendText( - """ - dependencies { - ${implementationFiles(one, two)} - } - $shadowJar { - transform(com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer) { - mappings = [ - "META-INF/a.properties": ["mergeStrategy": "append", "mergeSeparator": ":"], - "META-INF/b.properties": ["mergeStrategy": "latest"] - ] - } - } - """.trimIndent(), + transform( + dependenciesBlock = implementationFiles(one, two), + transformerBlock = """ + mergeStrategy = $mergeStrategyClassName.Append + charsetName = "utf-8" + paths = ["META-INF/utf8.properties"] + """.trimIndent(), + ), ) run(shadowJarTask) - assertThat(outputShadowJar).useAll { - getContent("META-INF/a.properties").isEqualTo("k=1:3") - getContent("META-INF/b.properties").isEqualTo("k=4") - } + val content = outputShadowJar.use { it.getContent("META-INF/utf8.properties") } + assertThat(content).contains("foo=第一,第二") } @Test - fun mergePropertiesWithSpecifiedCharset() { + fun mergePropertiesWithMappings() { val one = buildJarOne { - insert("META-INF/utf8.properties", "foo=第一") + insert("META-INF/a.properties", "k=1") + insert("META-INF/b.properties", "k=2") } val two = buildJarTwo { - insert("META-INF/utf8.properties", "foo=第二") + insert("META-INF/a.properties", "k=3") + insert("META-INF/b.properties", "k=4") } projectScriptPath.appendText( - """ - dependencies { - ${implementationFiles(one, two)} - } - $shadowJar { - transform(com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer) { - mergeStrategy = com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer.MergeStrategy.Append - charsetName = "utf-8" - paths = ["META-INF/utf8.properties"] - } - } - """.trimIndent(), + transform( + dependenciesBlock = implementationFiles(one, two), + transformerBlock = """ + mappings = [ + "META-INF/a.properties": ["mergeStrategy": "append", "mergeSeparator": ":"], + "META-INF/b.properties": ["mergeStrategy": "latest"] + ] + """.trimIndent(), + ), ) run(shadowJarTask) - val content = outputShadowJar.use { it.getContent("META-INF/utf8.properties") } - assertThat(content).contains("foo=第一,第二") + assertThat(outputShadowJar).useAll { + getContent("META-INF/a.properties").contains("k=1:3") + getContent("META-INF/b.properties").contains("k=4") + } + } + + private companion object { + val mergeStrategyClassName = requireNotNull(MergeStrategy::class.java.canonicalName) } } From 17e8eb744d1e4c8a7032f76c47a1fd83b7c49d82 Mon Sep 17 00:00:00 2001 From: Goooler Date: Mon, 30 Jun 2025 20:15:32 +0800 Subject: [PATCH 6/9] Use semicolon for not escaping --- .../shadow/transformers/PropertiesFileTransformerTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt index 6ff869a9d..25eb5de70 100644 --- a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt +++ b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt @@ -107,7 +107,7 @@ class PropertiesFileTransformerTest : BaseTransformerTest() { dependenciesBlock = implementationFiles(one, two), transformerBlock = """ mappings = [ - "META-INF/a.properties": ["mergeStrategy": "append", "mergeSeparator": ":"], + "META-INF/a.properties": ["mergeStrategy": "append", "mergeSeparator": ";"], "META-INF/b.properties": ["mergeStrategy": "latest"] ] """.trimIndent(), @@ -117,7 +117,7 @@ class PropertiesFileTransformerTest : BaseTransformerTest() { run(shadowJarTask) assertThat(outputShadowJar).useAll { - getContent("META-INF/a.properties").contains("k=1:3") + getContent("META-INF/a.properties").contains("k=1;3") getContent("META-INF/b.properties").contains("k=4") } } From 2cd98b37846aa365ec2618f844d1a0bd90248566 Mon Sep 17 00:00:00 2001 From: Goooler Date: Mon, 30 Jun 2025 20:19:01 +0800 Subject: [PATCH 7/9] Cleanup `mergePropertiesWithMappings` --- .../PropertiesFileTransformerTest.kt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt index 25eb5de70..938828548 100644 --- a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt +++ b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt @@ -95,20 +95,20 @@ class PropertiesFileTransformerTest : BaseTransformerTest() { @Test fun mergePropertiesWithMappings() { val one = buildJarOne { - insert("META-INF/a.properties", "k=1") - insert("META-INF/b.properties", "k=2") + insert("META-INF/foo.properties", "foo=1") + insert("META-INF/bar.properties", "bar=2") } val two = buildJarTwo { - insert("META-INF/a.properties", "k=3") - insert("META-INF/b.properties", "k=4") + insert("META-INF/foo.properties", "foo=3") + insert("META-INF/bar.properties", "bar=4") } projectScriptPath.appendText( transform( dependenciesBlock = implementationFiles(one, two), transformerBlock = """ mappings = [ - "META-INF/a.properties": ["mergeStrategy": "append", "mergeSeparator": ";"], - "META-INF/b.properties": ["mergeStrategy": "latest"] + "META-INF/foo.properties": ["mergeStrategy": "append", "mergeSeparator": ";"], + "META-INF/bar.properties": ["mergeStrategy": "latest"] ] """.trimIndent(), ), @@ -117,8 +117,8 @@ class PropertiesFileTransformerTest : BaseTransformerTest() { run(shadowJarTask) assertThat(outputShadowJar).useAll { - getContent("META-INF/a.properties").contains("k=1;3") - getContent("META-INF/b.properties").contains("k=4") + getContent("META-INF/foo.properties").contains("foo=1;3") + getContent("META-INF/bar.properties").contains("bar=4") } } From a5054d2fde0917053299867ab410637fbd21e420 Mon Sep 17 00:00:00 2001 From: Goooler Date: Mon, 30 Jun 2025 20:31:04 +0800 Subject: [PATCH 8/9] Note `CleanProperties` --- .../gradle/plugins/shadow/internal/CleanProperties.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/CleanProperties.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/CleanProperties.kt index 13f6730f7..624aa422d 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/CleanProperties.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/CleanProperties.kt @@ -6,6 +6,9 @@ import java.io.Writer import java.util.Date import java.util.Properties +/** + * Introduced in order to remove prepended timestamp when creating output stream. + */ internal class CleanProperties : Properties() { @Throws(IOException::class) override fun store(writer: Writer, comments: String) { From a0ef1e1b89bce3d2751a37b2c859807710ff7f09 Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 1 Jul 2025 15:33:01 +0800 Subject: [PATCH 9/9] Test `mergedPropertiesDontContainDateComment` --- .../PropertiesFileTransformerTest.kt | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt index 938828548..a050dd1f5 100644 --- a/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt +++ b/src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt @@ -2,7 +2,9 @@ package com.github.jengelman.gradle.plugins.shadow.transformers import assertk.assertThat import assertk.assertions.contains +import assertk.assertions.isEqualTo import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer.MergeStrategy +import com.github.jengelman.gradle.plugins.shadow.util.Issue import com.github.jengelman.gradle.plugins.shadow.util.getContent import kotlin.io.path.appendText import org.junit.jupiter.api.Test @@ -122,6 +124,40 @@ class PropertiesFileTransformerTest : BaseTransformerTest() { } } + @Issue( + "https://github.com/GradleUp/shadow/issues/622", + "https://github.com/GradleUp/shadow/issues/856", + ) + @Test + fun mergedPropertiesDontContainDateComment() { + val one = buildJarOne { + insert("META-INF/test.properties", "foo=one") + } + val two = buildJarTwo { + insert("META-INF/test.properties", "foo=two") + } + projectScriptPath.appendText( + transform( + dependenciesBlock = implementationFiles(one, two), + transformerBlock = """ + mergeStrategy = $mergeStrategyClassName.Append + paths = ["META-INF/test.properties"] + """.trimIndent(), + ), + ) + + run(shadowJarTask) + + val content = outputShadowJar.use { it.getContent("META-INF/test.properties") } + assertThat(content.trimIndent()).isEqualTo( + """ + # + + foo=one,two + """.trimIndent(), + ) + } + private companion object { val mergeStrategyClassName = requireNotNull(MergeStrategy::class.java.canonicalName) }