]> nmode's Git Repositories - signal-cli/blob - buildSrc/src/main/kotlin/ExcludeFileFromJar.kt
Exclude libsignal-client testing libraries
[signal-cli] / buildSrc / src / main / kotlin / ExcludeFileFromJar.kt
1 import org.gradle.api.artifacts.transform.*
2 import org.gradle.api.file.FileSystemLocation
3 import org.gradle.api.provider.Provider
4 import org.gradle.api.tasks.Input
5 import org.gradle.api.tasks.PathSensitive
6 import org.gradle.api.tasks.PathSensitivity
7 import java.io.File
8 import java.io.FileInputStream
9 import java.io.FileOutputStream
10 import java.util.zip.ZipInputStream
11 import java.util.zip.ZipOutputStream
12
13 @CacheableTransform
14 abstract class JarFileExcluder : TransformAction<JarFileExcluder.Parameters> {
15 interface Parameters : TransformParameters {
16 @get:Input
17 var excludeFilesByArtifact: Map<String, Set<String>>
18 }
19
20 @get:PathSensitive(PathSensitivity.NAME_ONLY)
21 @get:InputArtifact
22 abstract val inputArtifact: Provider<FileSystemLocation>
23
24 override
25 fun transform(outputs: TransformOutputs) {
26 val fileName = inputArtifact.get().asFile.name
27 for (entry in parameters.excludeFilesByArtifact) {
28 if (fileName.startsWith(entry.key)) {
29 val nameWithoutExtension = fileName.substring(0, fileName.lastIndexOf("."))
30 excludeFiles(inputArtifact.get().asFile, entry.value, outputs.file("${nameWithoutExtension}.jar"))
31 return
32 }
33 }
34 outputs.file(inputArtifact)
35 }
36
37 private fun excludeFiles(artifact: File, excludeFiles: Set<String>, jarFile: File) {
38 ZipInputStream(FileInputStream(artifact)).use { input ->
39 ZipOutputStream(FileOutputStream(jarFile)).use { output ->
40 var entry = input.nextEntry
41 while (entry != null) {
42 if (!excludeFiles.contains(entry.name)) {
43 output.putNextEntry(entry)
44 input.copyTo(output)
45 output.closeEntry()
46 }
47
48 entry = input.nextEntry
49 }
50 }
51 }
52 }
53 }