Skip to content

Commit 5b7443a

Browse files
committed
Build: Helper to get effective ASF project metadata
This change "bundles" the information of `AsfProject` and the `PublishingHelperExtensions`, which is what the code in `configurePom.kt` did. Bundling these objects allows other consumers, like CycloneDX SBOM generation, to access that same information without having to query remote systems (whimsey.apache.org) again.
1 parent aedb724 commit 5b7443a

File tree

2 files changed

+78
-36
lines changed

2 files changed

+78
-36
lines changed

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

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,13 @@
1919

2020
package publishing
2121

22+
import asf.AsfProject
2223
import java.io.File
2324
import javax.inject.Inject
2425
import org.gradle.api.Project
2526
import org.gradle.api.model.ObjectFactory
27+
import org.gradle.api.provider.Provider
28+
import org.gradle.internal.extensions.stdlib.capitalized
2629
import org.gradle.kotlin.dsl.property
2730

2831
/**
@@ -83,3 +86,57 @@ constructor(objectFactory: ObjectFactory, project: Project) {
8386
fun distributionFile(ext: String): File =
8487
distributionDir.get().file("${baseName.get()}.$ext").asFile
8588
}
89+
90+
/**
91+
* Provides the effective values for an ASF project using the ASF project metadata from `AsfProject`
92+
* with overrides from `PublishingHelperExtension`.
93+
*/
94+
class EffectiveAsfProject(
95+
val publishingHelperExtension: PublishingHelperExtension,
96+
val asfProject: AsfProject,
97+
) {
98+
fun githubRepoName(): Provider<String> =
99+
publishingHelperExtension.githubRepositoryName.orElse(asfProject.apacheId)
100+
101+
fun tagPrefix(): Provider<String> =
102+
publishingHelperExtension.overrideTagPrefix.orElse("apache-${asfProject.apacheId}")
103+
104+
fun issueTracker(): Provider<String> {
105+
val issuesUrl: Provider<String> =
106+
codeRepoUrl().map { r -> "$r/issues" }.orElse(asfProject.bugDatabase)
107+
return publishingHelperExtension.overrideIssueManagement.orElse(issuesUrl)
108+
}
109+
110+
fun codeRepoUrl(): Provider<String> =
111+
publishingHelperExtension.overrideScm.orElse(
112+
githubRepoName().map { r -> "https://github.com/apache/$r" }.orElse(asfProject.repository)
113+
)
114+
115+
fun fullName() = publishingHelperExtension.overrideName.orElse("Apache ${asfProject.name}")
116+
117+
fun description() = publishingHelperExtension.overrideDescription.orElse(asfProject.description)
118+
119+
fun projectUrl() = publishingHelperExtension.overrideProjectUrl.orElse(asfProject.website)
120+
121+
fun mailingList(id: String) = MailingList(id, asfProject.apacheId)
122+
123+
companion object {
124+
fun forProject(project: Project): EffectiveAsfProject {
125+
val e = project.extensions.getByType(PublishingHelperExtension::class.java)
126+
val asfProject = AsfProject.memoized(project, e.asfProjectId.get())
127+
return EffectiveAsfProject(e, asfProject)
128+
}
129+
}
130+
}
131+
132+
class MailingList(val id: String, private val prj: String) {
133+
fun name(): String = "${id.capitalized()} Mailing List"
134+
135+
fun subscribe(): String = "$id-subscribe@$prj.apache.org"
136+
137+
fun unsubscribe(): String = "$id-unsubscribe@$prj.apache.org"
138+
139+
fun post(): String = "$id@$prj.apache.org"
140+
141+
fun archive(): String = "https://lists.apache.org/list.html?$id@$prj.apache.org"
142+
}

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

Lines changed: 21 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,11 @@
1919

2020
package publishing
2121

22-
import asf.AsfProject
2322
import groovy.util.Node
2423
import org.gradle.api.Project
2524
import org.gradle.api.Task
2625
import org.gradle.api.artifacts.component.ModuleComponentSelector
27-
import org.gradle.api.provider.Provider
2826
import org.gradle.api.publish.maven.MavenPublication
29-
import org.gradle.internal.extensions.stdlib.capitalized
3027

3128
/**
3229
* Configures the content of the generated `pom.xml` files.
@@ -47,8 +44,6 @@ import org.gradle.internal.extensions.stdlib.capitalized
4744
*/
4845
internal fun configurePom(project: Project, mavenPublication: MavenPublication, task: Task) =
4946
mavenPublication.run {
50-
val e = project.extensions.getByType(PublishingHelperExtension::class.java)
51-
5247
pom {
5348
if (project != project.rootProject) {
5449
// Add the license to every pom to make it easier for downstream projects to retrieve the
@@ -75,8 +70,8 @@ internal fun configurePom(project: Project, mavenPublication: MavenPublication,
7570

7671
task.doFirst {
7772
mavenPom.run {
78-
val asfProject = AsfProject.memoized(project, e.asfProjectId.get())
79-
val asfProjectId = asfProject.apacheId
73+
val prj = EffectiveAsfProject.forProject(project)
74+
val asfProjectId = prj.asfProject.apacheId
8075

8176
organization {
8277
name.set("The Apache Software Foundation")
@@ -85,51 +80,41 @@ internal fun configurePom(project: Project, mavenPublication: MavenPublication,
8580
licenses {
8681
license {
8782
name.set("Apache-2.0") // SPDX identifier
88-
url.set(asfProject.licenseUrl)
83+
url.set(prj.asfProject.licenseUrl)
8984
}
9085
}
9186
mailingLists {
92-
e.mailingLists.get().forEach { ml ->
93-
mailingList {
94-
name.set("${ml.capitalized()} Mailing List")
95-
subscribe.set("$ml-subscribe@$asfProjectId.apache.org")
96-
unsubscribe.set("$ml-unsubscribe@$asfProjectId.apache.org")
97-
post.set("$ml@$asfProjectId.apache.org")
98-
archive.set("https://lists.apache.org/list.html?$ml@$asfProjectId.apache.org")
87+
prj.publishingHelperExtension.mailingLists
88+
.get()
89+
.map { id -> prj.mailingList(id) }
90+
.forEach { ml ->
91+
mailingList {
92+
name.set(ml.name())
93+
subscribe.set(ml.subscribe())
94+
unsubscribe.set(ml.unsubscribe())
95+
post.set(ml.post())
96+
archive.set(ml.archive())
97+
}
9998
}
100-
}
10199
}
102100

103-
val githubRepoName: Provider<String> = e.githubRepositoryName.orElse(asfProjectId)
104-
val codeRepo: Provider<String> =
105-
e.overrideScm.orElse(
106-
githubRepoName
107-
.map { r -> "https://github.com/apache/$r" }
108-
.orElse(asfProject.repository)
109-
)
110-
111101
scm {
112-
val codeRepoString: String = codeRepo.get()
102+
val codeRepoString: String = prj.codeRepoUrl().get()
113103
connection.set("scm:git:$codeRepoString")
114104
developerConnection.set("scm:git:$codeRepoString")
115105
url.set("$codeRepoString/tree/main")
116106
val version = project.version.toString()
117107
if (!version.endsWith("-SNAPSHOT")) {
118-
val tagPrefix: String =
119-
e.overrideTagPrefix.orElse("apache-${asfProject.apacheId}").get()
108+
val tagPrefix: String = prj.tagPrefix().get()
120109
tag.set("$tagPrefix-$version")
121110
}
122111
}
123-
issueManagement {
124-
val issuesUrl: Provider<String> =
125-
codeRepo.map { r -> "$r/issues" }.orElse(asfProject.bugDatabase)
126-
url.set(e.overrideIssueManagement.orElse(issuesUrl))
127-
}
112+
issueManagement { url.set(prj.issueTracker()) }
128113

129-
name.set(e.overrideName.orElse("Apache ${asfProject.name}"))
130-
description.set(e.overrideDescription.orElse(asfProject.description))
131-
url.set(e.overrideProjectUrl.orElse(asfProject.website))
132-
inceptionYear.set(asfProject.inceptionYear.toString())
114+
name.set(prj.fullName())
115+
description.set(prj.description())
116+
url.set(prj.projectUrl())
117+
inceptionYear.set(prj.asfProject.inceptionYear.toString())
133118

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

0 commit comments

Comments
 (0)