mirai/buildSrc/src/main/kotlin/PublishingGpgSign.kt
2021-02-05 17:38:27 +08:00

103 lines
4.0 KiB
Kotlin

/*
* Copyright 2019-2021 Mamoe Technologies and contributors.
*
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
*
* https://github.com/mamoe/mirai/blob/master/LICENSE
*/
import org.gradle.api.Project
import org.gradle.api.internal.tasks.DefaultTaskDependency
import org.gradle.api.internal.tasks.TaskDependencyInternal
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenArtifact
import org.gradle.api.publish.maven.MavenPublication
import org.gradle.api.publish.maven.internal.artifact.AbstractMavenArtifact
import org.gradle.api.publish.maven.internal.publication.DefaultMavenPublication
import java.io.File
open class GPGSignMavenArtifact(
private val delegate: MavenArtifact,
private val tasks: TaskDependencyInternal = TaskDependencyInternal.EMPTY
) : AbstractMavenArtifact() {
override fun getFile(): File {
return File(delegate.file.path + ".asc")
}
override fun shouldBePublished(): Boolean = (delegate as? AbstractMavenArtifact)?.shouldBePublished() ?: true
override fun getDefaultExtension(): String = delegate.extension + ".asc"
override fun getDefaultClassifier(): String = delegate.classifier ?: ""
override fun getDefaultBuildDependencies(): TaskDependencyInternal = tasks
}
class NameCounter(val name: String) {
var counter = 0
val nextName: String
get() = name + if (counter == 0) {
counter = 1; ""
} else {
counter++; counter
}
}
object PublishingAccess {
fun getMetadataArtifacts(publication: MavenPublication): Collection<MavenArtifact> {
if (publication is DefaultMavenPublication) {
return DefaultMavenPublication::class.java.getDeclaredField("metadataArtifacts")
.also { it.isAccessible = true }
.get(publication) as Collection<MavenArtifact>
}
return emptyList()
}
}
fun PublishingExtension.configGpgSign(project: Project) {
if (GpgSigner.signer === GpgSigner.NoopSigner) {
return
}
val tasks = DefaultTaskDependency()
val signArtifactsGPG = NameCounter("signArtifactsGPG")
publications.forEach { publication ->
if (publication is MavenPublication) {
val artifacts0: Collection<Pair<Collection<MavenArtifact>, (MavenArtifact) -> Unit>> = listOf(
publication.artifacts to { publication.artifact(it) }, // main artifacts
PublishingAccess.getMetadataArtifacts(publication).let { artifacts -> // pom files
if (artifacts is MutableCollection<MavenArtifact>) {
artifacts to { artifacts.add(it) }
} else {
artifacts to { publication.artifact(it) }
}
}
)
val allArtifacts = artifacts0.flatMap { it.first }.toList()
if (allArtifacts.isNotEmpty()) {
tasks.add(project.tasks.create(signArtifactsGPG.nextName) {
group = "publishing"
doLast {
allArtifacts.forEach { artifact ->
if ((artifact as? AbstractMavenArtifact)?.shouldBePublished() != false) {
GpgSigner.signer.doSign(artifact.file)
}
}
}
allArtifacts.forEach {
dependsOn(it.buildDependencies)
}
})
artifacts0.forEach { (artifacts, artifactsRegister) ->
artifacts.toList().forEach { artifact ->
logPublishing("gpg sign for artifact ${artifact.smartToString()}")
artifactsRegister(GPGSignMavenArtifact(artifact, tasks))
}
}
}
}
}
}