Skip to content

Commit 29a06a5

Browse files
GooolerCopilot
andauthored
Support patternSet for license and notice transformers (#1850)
* Expose `patternSet` of `ApacheLicenseResourceTransformer` as `public` * Mark `JvmOverloads` for ctors * Expose `patternSet` of `ApacheNoticeResourceTransformer` as `public` * Restore props back * Test `canTransformByPattern` * Document `Configuring Resource Transformer Filtering by Pattern` * Update docs/configuration/merging/README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update docs/changes/README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Fix doc --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent 6a1ca8b commit 29a06a5

File tree

8 files changed

+92
-28
lines changed

8 files changed

+92
-28
lines changed

api/shadow.api

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -250,19 +250,15 @@ public final class com/github/jengelman/gradle/plugins/shadow/tasks/ShadowJar$Co
250250
public final synthetic fun getShadowJar (Lorg/gradle/api/tasks/TaskContainer;)Lorg/gradle/api/tasks/TaskProvider;
251251
}
252252

253-
public class com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformer : com/github/jengelman/gradle/plugins/shadow/transformers/ResourceTransformer {
253+
public class com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformer : com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer {
254254
public fun <init> ()V
255-
public fun canTransformResource (Lorg/gradle/api/file/FileTreeElement;)Z
256-
public fun getName ()Ljava/lang/String;
257-
public fun getObjectFactory ()Lorg/gradle/api/model/ObjectFactory;
258-
public fun hasTransformedResource ()Z
259-
public fun modifyOutputStream (Lorg/apache/tools/zip/ZipOutputStream;Z)V
260-
public fun transform (Lcom/github/jengelman/gradle/plugins/shadow/transformers/TransformerContext;)V
255+
public fun <init> (Lorg/gradle/api/tasks/util/PatternSet;)V
256+
public synthetic fun <init> (Lorg/gradle/api/tasks/util/PatternSet;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
261257
}
262258

263-
public class com/github/jengelman/gradle/plugins/shadow/transformers/ApacheNoticeResourceTransformer : com/github/jengelman/gradle/plugins/shadow/transformers/ResourceTransformer {
259+
public class com/github/jengelman/gradle/plugins/shadow/transformers/ApacheNoticeResourceTransformer : com/github/jengelman/gradle/plugins/shadow/transformers/PatternFilterableResourceTransformer {
264260
public fun <init> (Lorg/gradle/api/model/ObjectFactory;)V
265-
public fun canTransformResource (Lorg/gradle/api/file/FileTreeElement;)Z
261+
public fun <init> (Lorg/gradle/api/model/ObjectFactory;Lorg/gradle/api/tasks/util/PatternSet;)V
266262
public fun getAddHeader ()Lorg/gradle/api/provider/Property;
267263
public fun getCharsetName ()Lorg/gradle/api/provider/Property;
268264
public fun getCopyright ()Lorg/gradle/api/provider/Property;

docs/changes/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
- Add `PatternFilterableResourceTransformer` to simplify pattern based `ResourceTransformer`s. ([#1849](https://github.com/GradleUp/shadow/pull/1849))
99
- Expose `patternSet` of `ServiceFileTransformer` as `public`. ([#1849](https://github.com/GradleUp/shadow/pull/1849))
10+
- Expose `patternSet` of `ApacheLicenseResourceTransformer` as `public`. ([#1850](https://github.com/GradleUp/shadow/pull/1850))
11+
- Expose `patternSet` of `ApacheNoticeResourceTransformer` as `public`. ([#1850](https://github.com/GradleUp/shadow/pull/1850))
1012

1113
### Changed
1214

docs/configuration/merging/README.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,41 @@ It must be added using the [`transform`][ShadowJar.transform] methods.
546546
}
547547
```
548548

549+
## Configuring Resource Transformer Filtering by Pattern
550+
551+
There are lots of built-in [`ResourceTransformer`][ResourceTransformer]s provided by Shadow. Some of them extend
552+
[`PatternFilterableResourceTransformer`][PatternFilterableResourceTransformer], which extends
553+
[`PatternFilterable`][PatternFilterable] to provide `include`/`exclude` pattern filtering capabilities. e.g.
554+
555+
- [`ApacheLicenseResourceTransformer`][ApacheLicenseResourceTransformer]
556+
- [`ApacheNoticeResourceTransformer`][ApacheNoticeResourceTransformer]
557+
- [`ServiceFileTransformer`][ServiceFileTransformer]
558+
- ...
559+
560+
You can use `include`/`exclude` and more methods to configure the patterns for those
561+
[`ResourceTransformer`][ResourceTransformer]s that support it. For example:
562+
563+
=== "Kotlin"
564+
565+
```kotlin
566+
tasks.shadowJar {
567+
transform<com.github.jengelman.gradle.plugins.shadow.transformers.ApacheLicenseResourceTransformer>() {
568+
include("META-INF/LICENSE.*")
569+
exclude("META-INF/LICENSE.log")
570+
}
571+
}
572+
```
573+
574+
=== "Groovy"
575+
576+
```groovy
577+
tasks.named('shadowJar', com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar) {
578+
transform(com.github.jengelman.gradle.plugins.shadow.transformers.ApacheLicenseResourceTransformer) {
579+
include 'META-INF/LICENSE.*'
580+
exclude 'META-INF/LICENSE.log'
581+
}
582+
}
583+
```
549584

550585

551586
[AbstractCopyTask]: https://docs.gradle.org/current/dsl/org.gradle.api.tasks.AbstractCopyTask.html
@@ -558,8 +593,12 @@ It must be added using the [`transform`][ShadowJar.transform] methods.
558593
[Jar]: https://docs.gradle.org/current/dsl/org.gradle.api.tasks.bundling.Jar.html
559594
[Log4j2PluginsCacheFileTransformer]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.transformers/-log4j2-plugins-cache-file-transformer/index.html
560595
[ResourceTransformer]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.transformers/-resource-transformer/index.html
596+
[ApacheLicenseResourceTransformer]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.transformers/-apache-license-resource-transformer/index.html
597+
[ApacheNoticeResourceTransformer]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.transformers/-apache-notice-resource-transformer/index.html
561598
[ServiceFileTransformer]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.transformers/-service-file-transformer/index.html
562599
[PreserveFirstFoundResourceTransformer]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.transformers/-preserve-first-found-resource-transformer/index.html
600+
[PatternFilterable]: https://docs.gradle.org/current/kotlin-dsl/gradle/org.gradle.api.tasks.util/-pattern-filterable/index.html
601+
[PatternFilterableResourceTransformer]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.transformers/-pattern-filterable-resource-transformer/index.html
563602
[ShadowJar.append]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.tasks/-shadow-jar/append.html
564603
[ShadowJar.failOnDuplicateEntries]: ../../api/shadow/com.github.jengelman.gradle.plugins.shadow.tasks/-shadow-jar/fail-on-duplicate-entries.html
565604
[ShadowJar.from]: https://docs.gradle.org/current/dsl/org.gradle.jvm.tasks.Jar.html#org.gradle.jvm.tasks.Jar:from(java.lang.Object,%20org.gradle.api.Action)

src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformer.kt

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.github.jengelman.gradle.plugins.shadow.transformers
22

3-
import org.gradle.api.file.FileTreeElement
3+
import org.gradle.api.tasks.util.PatternSet
44

55
/**
66
* Prevents duplicate copies of the license.
@@ -10,14 +10,15 @@ import org.gradle.api.file.FileTreeElement
1010
* @author John Engelman
1111
*/
1212
@CacheableTransformer
13-
public open class ApacheLicenseResourceTransformer : ResourceTransformer by ResourceTransformer.Companion {
14-
override fun canTransformResource(element: FileTreeElement): Boolean {
15-
val path = element.path
16-
return LICENSE_PATH.equals(path, ignoreCase = true) ||
17-
LICENSE_TXT_PATH.regionMatches(0, path, 0, LICENSE_TXT_PATH.length, ignoreCase = true) ||
18-
LICENSE_MD_PATH.regionMatches(0, path, 0, LICENSE_MD_PATH.length, ignoreCase = true)
19-
}
20-
13+
public open class ApacheLicenseResourceTransformer @JvmOverloads constructor(
14+
patternSet: PatternSet = PatternSet()
15+
.apply { isCaseSensitive = false }
16+
.include(
17+
LICENSE_PATH,
18+
LICENSE_TXT_PATH,
19+
LICENSE_MD_PATH,
20+
),
21+
) : PatternFilterableResourceTransformer(patternSet = patternSet) {
2122
private companion object {
2223
private const val LICENSE_PATH = "META-INF/LICENSE"
2324
private const val LICENSE_TXT_PATH = "META-INF/LICENSE.txt"

src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheNoticeResourceTransformer.kt

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ import java.util.Locale
99
import java.util.TreeSet
1010
import javax.inject.Inject
1111
import org.apache.tools.zip.ZipOutputStream
12-
import org.gradle.api.file.FileTreeElement
1312
import org.gradle.api.model.ObjectFactory
1413
import org.gradle.api.provider.Property
1514
import org.gradle.api.tasks.Input
15+
import org.gradle.api.tasks.util.PatternSet
1616

1717
/**
1818
* Merges `META-INF/NOTICE.TXT` files.
@@ -22,9 +22,10 @@ import org.gradle.api.tasks.Input
2222
* @author John Engelman
2323
*/
2424
@CacheableTransformer
25-
public open class ApacheNoticeResourceTransformer @Inject constructor(
25+
public open class ApacheNoticeResourceTransformer(
2626
final override val objectFactory: ObjectFactory,
27-
) : ResourceTransformer {
27+
patternSet: PatternSet,
28+
) : PatternFilterableResourceTransformer(patternSet) {
2829
private val entries = mutableSetOf<String>()
2930
private val organizationEntries = mutableMapOf<String, MutableSet<String>>()
3031
private inline val charset get() = Charset.forName(charsetName.get())
@@ -75,12 +76,17 @@ public open class ApacheNoticeResourceTransformer @Inject constructor(
7576
@get:Input
7677
public open val charsetName: Property<String> = objectFactory.property(Charsets.UTF_8.name())
7778

78-
override fun canTransformResource(element: FileTreeElement): Boolean {
79-
val path = element.path
80-
return NOTICE_PATH.equals(path, ignoreCase = true) ||
81-
NOTICE_TXT_PATH.equals(path, ignoreCase = true) ||
82-
NOTICE_MD_PATH.equals(path, ignoreCase = true)
83-
}
79+
@Inject
80+
public constructor(objectFactory: ObjectFactory) : this(
81+
objectFactory,
82+
patternSet = PatternSet()
83+
.apply { isCaseSensitive = false }
84+
.include(
85+
NOTICE_PATH,
86+
NOTICE_TXT_PATH,
87+
NOTICE_MD_PATH,
88+
),
89+
)
8490

8591
override fun transform(context: TransformerContext) {
8692
val projectName = projectName.get()

src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import org.gradle.api.tasks.util.PatternSet
2121
* @author John Engelman
2222
*/
2323
@CacheableTransformer
24-
public open class ServiceFileTransformer(
24+
public open class ServiceFileTransformer @JvmOverloads constructor(
2525
patternSet: PatternSet = PatternSet()
2626
.include(SERVICES_PATTERN)
2727
.exclude(PATH_LEGACY_GROOVY_EXTENSION_MODULE_DESCRIPTOR),

src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformerTest.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,14 @@ class ApacheLicenseResourceTransformerTest : BaseTransformerTest<ApacheLicenseRe
2323
assertThat(transformer.canTransformResource("META-INF/License.md")).isTrue()
2424
assertThat(transformer.canTransformResource("META-INF/MANIFEST.MF")).isFalse()
2525
}
26+
27+
@Test
28+
fun canTransformByPattern() {
29+
assertThat(transformer.canTransformResource("META-INF/LICENSE.txt")).isTrue()
30+
assertThat(transformer.canTransformResource("META-INF/LICENSE.log")).isFalse()
31+
transformer.exclude("META-INF/LICENSE.txt")
32+
transformer.include("META-INF/LICENSE.*")
33+
assertThat(transformer.canTransformResource("META-INF/LICENSE.txt")).isFalse()
34+
assertThat(transformer.canTransformResource("META-INF/LICENSE.log")).isTrue()
35+
}
2636
}

src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheNoticeResourceTransformerTest.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,16 @@ class ApacheNoticeResourceTransformerTest : BaseTransformerTest<ApacheNoticeReso
2929
assertThat(transformer.canTransformResource("META-INF/MANIFEST.MF")).isFalse()
3030
}
3131

32+
@Test
33+
fun canTransformByPattern() {
34+
assertThat(transformer.canTransformResource("META-INF/NOTICE.txt")).isTrue()
35+
assertThat(transformer.canTransformResource("META-INF/NOTICE.log")).isFalse()
36+
transformer.exclude("META-INF/NOTICE.txt")
37+
transformer.include("META-INF/NOTICE.*")
38+
assertThat(transformer.canTransformResource("META-INF/NOTICE.txt")).isFalse()
39+
assertThat(transformer.canTransformResource("META-INF/NOTICE.log")).isTrue()
40+
}
41+
3242
@Test
3343
fun preamble1ShouldHaveATrailingSpace() {
3444
val baos = ByteArrayOutputStream()

0 commit comments

Comments
 (0)