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
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,13 @@

package publishing

import asf.AsfProject
import java.io.File
import javax.inject.Inject
import org.gradle.api.Project
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.Provider
import org.gradle.internal.extensions.stdlib.capitalized
import org.gradle.kotlin.dsl.property

/**
Expand Down Expand Up @@ -83,3 +86,57 @@ constructor(objectFactory: ObjectFactory, project: Project) {
fun distributionFile(ext: String): File =
distributionDir.get().file("${baseName.get()}.$ext").asFile
}

/**
* Provides the effective values for an ASF project using the ASF project metadata from `AsfProject`
* with overrides from `PublishingHelperExtension`.
*/
class EffectiveAsfProject(
val publishingHelperExtension: PublishingHelperExtension,
val asfProject: AsfProject,
) {
fun githubRepoName(): Provider<String> =
publishingHelperExtension.githubRepositoryName.orElse(asfProject.apacheId)

fun tagPrefix(): Provider<String> =
publishingHelperExtension.overrideTagPrefix.orElse("apache-${asfProject.apacheId}")

fun issueTracker(): Provider<String> {
val issuesUrl: Provider<String> =
codeRepoUrl().map { r -> "$r/issues" }.orElse(asfProject.bugDatabase)
return publishingHelperExtension.overrideIssueManagement.orElse(issuesUrl)
}

fun codeRepoUrl(): Provider<String> =
publishingHelperExtension.overrideScm.orElse(
githubRepoName().map { r -> "https://github.com/apache/$r" }.orElse(asfProject.repository)
)

fun fullName() = publishingHelperExtension.overrideName.orElse("Apache ${asfProject.name}")

fun description() = publishingHelperExtension.overrideDescription.orElse(asfProject.description)

fun projectUrl() = publishingHelperExtension.overrideProjectUrl.orElse(asfProject.website)

fun mailingList(id: String) = MailingList(id, asfProject.apacheId)

companion object {
fun forProject(project: Project): EffectiveAsfProject {
val e = project.extensions.getByType(PublishingHelperExtension::class.java)
val asfProject = AsfProject.memoized(project, e.asfProjectId.get())
return EffectiveAsfProject(e, asfProject)
}
}
}

class MailingList(val id: String, private val prj: String) {
fun name(): String = "${id.capitalized()} Mailing List"

fun subscribe(): String = "$id-subscribe@$prj.apache.org"

fun unsubscribe(): String = "$id-unsubscribe@$prj.apache.org"

fun post(): String = "$id@$prj.apache.org"

fun archive(): String = "https://lists.apache.org/list.html?$id@$prj.apache.org"
}
57 changes: 21 additions & 36 deletions build-logic/src/main/kotlin/publishing/configurePom.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,11 @@

package publishing

import asf.AsfProject
import groovy.util.Node
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.artifacts.component.ModuleComponentSelector
import org.gradle.api.provider.Provider
import org.gradle.api.publish.maven.MavenPublication
import org.gradle.internal.extensions.stdlib.capitalized

/**
* Configures the content of the generated `pom.xml` files.
Expand All @@ -47,8 +44,6 @@ import org.gradle.internal.extensions.stdlib.capitalized
*/
internal fun configurePom(project: Project, mavenPublication: MavenPublication, task: Task) =
mavenPublication.run {
val e = project.extensions.getByType(PublishingHelperExtension::class.java)

pom {
if (project != project.rootProject) {
// Add the license to every pom to make it easier for downstream projects to retrieve the
Expand All @@ -75,8 +70,8 @@ internal fun configurePom(project: Project, mavenPublication: MavenPublication,

task.doFirst {
mavenPom.run {
val asfProject = AsfProject.memoized(project, e.asfProjectId.get())
val asfProjectId = asfProject.apacheId
val prj = EffectiveAsfProject.forProject(project)
val asfProjectId = prj.asfProject.apacheId

organization {
name.set("The Apache Software Foundation")
Expand All @@ -85,51 +80,41 @@ internal fun configurePom(project: Project, mavenPublication: MavenPublication,
licenses {
license {
name.set("Apache-2.0") // SPDX identifier
url.set(asfProject.licenseUrl)
url.set(prj.asfProject.licenseUrl)
}
}
mailingLists {
e.mailingLists.get().forEach { ml ->
mailingList {
name.set("${ml.capitalized()} Mailing List")
subscribe.set("$ml-subscribe@$asfProjectId.apache.org")
unsubscribe.set("$ml-unsubscribe@$asfProjectId.apache.org")
post.set("$ml@$asfProjectId.apache.org")
archive.set("https://lists.apache.org/list.html?$ml@$asfProjectId.apache.org")
prj.publishingHelperExtension.mailingLists
.get()
.map { id -> prj.mailingList(id) }
.forEach { ml ->
mailingList {
name.set(ml.name())
subscribe.set(ml.subscribe())
unsubscribe.set(ml.unsubscribe())
post.set(ml.post())
archive.set(ml.archive())
}
}
}
}

val githubRepoName: Provider<String> = e.githubRepositoryName.orElse(asfProjectId)
val codeRepo: Provider<String> =
e.overrideScm.orElse(
githubRepoName
.map { r -> "https://github.com/apache/$r" }
.orElse(asfProject.repository)
)

scm {
val codeRepoString: String = codeRepo.get()
val codeRepoString: String = prj.codeRepoUrl().get()
connection.set("scm:git:$codeRepoString")
developerConnection.set("scm:git:$codeRepoString")
url.set("$codeRepoString/tree/main")
val version = project.version.toString()
if (!version.endsWith("-SNAPSHOT")) {
val tagPrefix: String =
e.overrideTagPrefix.orElse("apache-${asfProject.apacheId}").get()
val tagPrefix: String = prj.tagPrefix().get()
tag.set("$tagPrefix-$version")
}
}
issueManagement {
val issuesUrl: Provider<String> =
codeRepo.map { r -> "$r/issues" }.orElse(asfProject.bugDatabase)
url.set(e.overrideIssueManagement.orElse(issuesUrl))
}
issueManagement { url.set(prj.issueTracker()) }

name.set(e.overrideName.orElse("Apache ${asfProject.name}"))
description.set(e.overrideDescription.orElse(asfProject.description))
url.set(e.overrideProjectUrl.orElse(asfProject.website))
inceptionYear.set(asfProject.inceptionYear.toString())
name.set(prj.fullName())
description.set(prj.description())
url.set(prj.projectUrl())
inceptionYear.set(prj.asfProject.inceptionYear.toString())

developers { developer { url.set("https://$asfProjectId.apache.org/community/") } }
}
Expand Down