diff --git a/build.gradle.kts b/build.gradle.kts index 094d87371c8..7ae1c3d8c5b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -880,20 +880,36 @@ val zipCompiler by tasks.registering(Zip::class) { } fun Project.secureZipTask(zipTask: TaskProvider): RegisteringDomainObjectDelegateProviderWithAction { - val checkSumTask = tasks.register("${zipTask.name}Checksum", Checksum::class) { + val checkSumTask: TaskProvider = tasks.register("${zipTask.name}Checksum", Checksum::class) { dependsOn(zipTask) inputFiles.setFrom(zipTask.map { it.outputs.files.singleFile }) - outputDirectory.fileProvider(zipTask.map { it.outputs.files.singleFile.parentFile }) + outputDirectory.fileProvider(zipTask.map { it.outputs.files.singleFile.parentFile.resolve("checksums") }) checksumAlgorithm.set(Checksum.Algorithm.SHA256) } + // Don't use Copy task, because it declares the full destination directory as an output + val copyChecksumTask = tasks.register("${zipTask.name}ChecksumCopy") { + dependsOn(checkSumTask) + + val checksumFileName: Provider = zipTask.map { "${it.outputs.files.singleFile.name}.sha256" } + val checksumFile: Provider = checkSumTask.map { it.outputDirectory.file(checksumFileName.get()).get() } + val outputFile: Provider = zipTask.map { it.outputs.files.singleFile.parentFile.resolve(checksumFileName.get()) } + + inputs.file(checksumFile) + outputs.file(outputFile) + + doLast { + checksumFile.get().asFile.copyTo(outputFile.get(), overwrite = true) + } + } + val signTask = tasks.register("${zipTask.name}Sign", Sign::class) { description = "Signs the archive produced by the '" + zipTask.name + "' task." sign(zipTask.get()) } return tasks.registering { - dependsOn(checkSumTask) + dependsOn(copyChecksumTask) dependsOn(signTask) } }