1919
2020package publishing
2121
22+ import java.io.File
2223import java.security.MessageDigest
2324import javax.inject.Inject
2425import org.gradle.api.DefaultTask
26+ import org.gradle.api.Project
2527import org.gradle.api.model.ObjectFactory
2628import org.gradle.api.tasks.Input
27- import org.gradle.api.tasks.InputFile
28- import org.gradle.api.tasks.OutputFile
29+ import org.gradle.api.tasks.InputFiles
30+ import org.gradle.api.tasks.OutputFiles
2931import org.gradle.api.tasks.TaskAction
32+ import org.gradle.api.tasks.TaskProvider
33+ import org.gradle.internal.extensions.stdlib.capitalized
3034import org.gradle.work.DisableCachingByDefault
3135
3236@DisableCachingByDefault
3337abstract class GenerateDigest @Inject constructor(objectFactory : ObjectFactory ) : DefaultTask() {
3438
35- @get:InputFile val file = objectFactory.fileProperty()
39+ @get:InputFiles val files = objectFactory.fileCollection()
40+
3641 @get:Input val algorithm = objectFactory.property(String ::class .java).convention(" SHA-512" )
37- @get:OutputFile
38- val outputFile =
39- objectFactory.fileProperty().convention {
40- val input = file.get().asFile
41- val algo = algorithm.get()
42- input.parentFile.resolve(" ${input.name} .${algo.replace(" -" , " " ).lowercase()} " )
43- }
42+
43+ @Suppress(" unused" , " UnstableApiUsage" )
44+ @get:OutputFiles
45+ val outputFiles =
46+ objectFactory.fileCollection().convention(files.map { file -> digestFileForInput(file) })
4447
4548 @TaskAction
4649 fun generate () {
47- val input = file.get().asFile
48- val digestFile = outputFile.get().asFile
49- val md = MessageDigest .getInstance(algorithm.get())
50+ files.files.forEach { input -> digest(input) }
51+ }
52+
53+ private fun digestFileForInput (input : File ): File {
54+ val algo = algorithm.get()
55+ return input.parentFile.resolve(" ${input.name} .${algo.replace(" -" , " " ).lowercase()} " )
56+ }
57+
58+ private fun digest (input : File ) {
59+ val algo = algorithm.get()
60+ logger.info(" Generating {} digest for '{}'" , algo, input)
61+ val digestFile = digestFileForInput(input)
62+ val md = MessageDigest .getInstance(algo)
5063 input.inputStream().use {
51- val buffered = it.buffered(8192 )
5264 val buf = ByteArray (8192 )
5365 var rd: Int
5466 while (true ) {
55- rd = buffered .read(buf)
67+ rd = it .read(buf)
5668 if (rd == - 1 ) break
5769 md.update(buf, 0 , rd)
5870 }
@@ -64,3 +76,13 @@ abstract class GenerateDigest @Inject constructor(objectFactory: ObjectFactory)
6476 }
6577 }
6678}
79+
80+ fun Project.digestTaskOutputs (task : TaskProvider <* >): TaskProvider <GenerateDigest > {
81+ val digestTask = tasks.register(" digest${task.name.capitalized()} " , GenerateDigest ::class .java)
82+ digestTask.configure {
83+ dependsOn(task)
84+ this .files.from(task.map { t -> t.outputs.files }.get())
85+ }
86+ task.configure { finalizedBy(digestTask) }
87+ return digestTask
88+ }
0 commit comments