Skip to content

Commit bc179d6

Browse files
snazyvchag
authored andcommitted
Simplify digest generation (apache#2907)
Similarly to the change to simplify artifact signing, this change simplifies digest generation by introducing a function to digest the output files of any task. That function takes care of setting up the correct task dependencies and task execution. Also removes an unnecessary double buffering during digest generation.
1 parent 69be4e4 commit bc179d6

File tree

3 files changed

+41
-43
lines changed

3 files changed

+41
-43
lines changed

build-logic/src/main/kotlin/publishing/digest-task.kt

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,40 +19,52 @@
1919

2020
package publishing
2121

22+
import java.io.File
2223
import java.security.MessageDigest
2324
import javax.inject.Inject
2425
import org.gradle.api.DefaultTask
26+
import org.gradle.api.Project
2527
import org.gradle.api.model.ObjectFactory
2628
import 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
2931
import org.gradle.api.tasks.TaskAction
32+
import org.gradle.api.tasks.TaskProvider
33+
import org.gradle.internal.extensions.stdlib.capitalized
3034
import org.gradle.work.DisableCachingByDefault
3135

3236
@DisableCachingByDefault
3337
abstract 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+
}

build-logic/src/main/kotlin/publishing/rootProject.kt

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -64,17 +64,7 @@ internal fun configureOnRootProject(project: Project) =
6464
outputs.file(e.sourceTarball)
6565
}
6666

67-
val digestSourceTarball =
68-
tasks.register<GenerateDigest>("digestSourceTarball") {
69-
description = "Generate the source tarball digest"
70-
mustRunAfter(sourceTarball)
71-
file.set {
72-
val e = project.extensions.getByType(PublishingHelperExtension::class.java)
73-
e.sourceTarball.get().asFile
74-
}
75-
}
76-
77-
sourceTarball.configure { finalizedBy(digestSourceTarball) }
67+
digestTaskOutputs(sourceTarball)
7868

7969
signTaskOutputs(sourceTarball)
8070

runtime/distribution/build.gradle.kts

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
* under the License.
1818
*/
1919

20-
import publishing.GenerateDigest
2120
import publishing.PublishingHelperPlugin
21+
import publishing.digestTaskOutputs
2222
import publishing.signTaskOutputs
2323

2424
plugins {
@@ -81,23 +81,9 @@ val distTar = tasks.named<Tar>("distTar") { compression = Compression.GZIP }
8181

8282
val distZip = tasks.named<Zip>("distZip") {}
8383

84-
val digestDistTar =
85-
tasks.register<GenerateDigest>("digestDistTar") {
86-
description = "Generate the distribution tar digest"
87-
dependsOn(distTar)
88-
file.set { distTar.get().archiveFile.get().asFile }
89-
}
90-
91-
val digestDistZip =
92-
tasks.register<GenerateDigest>("digestDistZip") {
93-
description = "Generate the distribution zip digest"
94-
dependsOn(distZip)
95-
file.set { distZip.get().archiveFile.get().asFile }
96-
}
97-
98-
distTar.configure { finalizedBy(digestDistTar) }
84+
digestTaskOutputs(distTar)
9985

100-
distZip.configure { finalizedBy(digestDistZip) }
86+
digestTaskOutputs(distZip)
10187

10288
signTaskOutputs(distTar)
10389

0 commit comments

Comments
 (0)