Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 37 additions & 15 deletions build-logic/src/main/kotlin/publishing/digest-task.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,40 +19,52 @@

package publishing

import java.io.File
import java.security.MessageDigest
import javax.inject.Inject
import org.gradle.api.DefaultTask
import org.gradle.api.Project
import org.gradle.api.model.ObjectFactory
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputFile
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.OutputFiles
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.TaskProvider
import org.gradle.internal.extensions.stdlib.capitalized
import org.gradle.work.DisableCachingByDefault

@DisableCachingByDefault
abstract class GenerateDigest @Inject constructor(objectFactory: ObjectFactory) : DefaultTask() {

@get:InputFile val file = objectFactory.fileProperty()
@get:InputFiles val files = objectFactory.fileCollection()

@get:Input val algorithm = objectFactory.property(String::class.java).convention("SHA-512")
@get:OutputFile
val outputFile =
objectFactory.fileProperty().convention {
val input = file.get().asFile
val algo = algorithm.get()
input.parentFile.resolve("${input.name}.${algo.replace("-", "").lowercase()}")
}

@Suppress("unused", "UnstableApiUsage")
@get:OutputFiles
val outputFiles =
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this val used for?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

objectFactory.fileCollection().convention(files.map { file -> digestFileForInput(file) })

@TaskAction
fun generate() {
val input = file.get().asFile
val digestFile = outputFile.get().asFile
val md = MessageDigest.getInstance(algorithm.get())
files.files.forEach { input -> digest(input) }
}

private fun digestFileForInput(input: File): File {
val algo = algorithm.get()
return input.parentFile.resolve("${input.name}.${algo.replace("-", "").lowercase()}")
}

private fun digest(input: File) {
val algo = algorithm.get()
logger.info("Generating {} digest for '{}'", algo, input)
val digestFile = digestFileForInput(input)
val md = MessageDigest.getInstance(algo)
input.inputStream().use {
val buffered = it.buffered(8192)
val buf = ByteArray(8192)
var rd: Int
while (true) {
rd = buffered.read(buf)
rd = it.read(buf)
if (rd == -1) break
md.update(buf, 0, rd)
}
Expand All @@ -64,3 +76,13 @@ abstract class GenerateDigest @Inject constructor(objectFactory: ObjectFactory)
}
}
}

fun Project.digestTaskOutputs(task: TaskProvider<*>): TaskProvider<GenerateDigest> {
val digestTask = tasks.register("digest${task.name.capitalized()}", GenerateDigest::class.java)
digestTask.configure {
dependsOn(task)
this.files.from(task.map { t -> t.outputs.files }.get())
}
task.configure { finalizedBy(digestTask) }
return digestTask
}
12 changes: 1 addition & 11 deletions build-logic/src/main/kotlin/publishing/rootProject.kt
Original file line number Diff line number Diff line change
Expand Up @@ -64,17 +64,7 @@ internal fun configureOnRootProject(project: Project) =
outputs.file(e.sourceTarball)
}

val digestSourceTarball =
tasks.register<GenerateDigest>("digestSourceTarball") {
description = "Generate the source tarball digest"
mustRunAfter(sourceTarball)
file.set {
val e = project.extensions.getByType(PublishingHelperExtension::class.java)
e.sourceTarball.get().asFile
}
}

sourceTarball.configure { finalizedBy(digestSourceTarball) }
digestTaskOutputs(sourceTarball)

signTaskOutputs(sourceTarball)

Expand Down
20 changes: 3 additions & 17 deletions runtime/distribution/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@
* under the License.
*/

import publishing.GenerateDigest
import publishing.PublishingHelperPlugin
import publishing.digestTaskOutputs
import publishing.signTaskOutputs

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

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

val digestDistTar =
tasks.register<GenerateDigest>("digestDistTar") {
description = "Generate the distribution tar digest"
dependsOn(distTar)
file.set { distTar.get().archiveFile.get().asFile }
}

val digestDistZip =
tasks.register<GenerateDigest>("digestDistZip") {
description = "Generate the distribution zip digest"
dependsOn(distZip)
file.set { distZip.get().archiveFile.get().asFile }
}

distTar.configure { finalizedBy(digestDistTar) }
digestTaskOutputs(distTar)

distZip.configure { finalizedBy(digestDistZip) }
digestTaskOutputs(distZip)

signTaskOutputs(distTar)

Expand Down