Skip to content

Commit df80cff

Browse files
committed
feat(workers): Handle MavenCentralMirror in GradleInitGenerator
Extend the `GradleInitGenerator` to generate a global `init.gradle.kts` file configuring repositories using the `MavenCentralMirror` from the `AdminConfig`. The generated script covers all relevant sections including `allProjects`, `buildScript`, and `settingsEvaluated`. Signed-off-by: Onur Demirci <[email protected]>
1 parent 5f9e80b commit df80cff

File tree

2 files changed

+230
-1
lines changed

2 files changed

+230
-1
lines changed

workers/common/src/main/kotlin/common/env/GradleInitGenerator.kt

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919

2020
package org.eclipse.apoapsis.ortserver.workers.common.env
2121

22+
import java.io.PrintWriter
23+
24+
import org.eclipse.apoapsis.ortserver.config.Path
2225
import org.eclipse.apoapsis.ortserver.workers.common.env.definition.GradleDefinition
2326

2427
/**
@@ -30,10 +33,91 @@ class GradleInitGenerator : EnvironmentConfigGenerator<GradleDefinition> {
3033
companion object {
3134
/** The name of the file that is generated by this generator. */
3235
private const val TARGET_NAME = ".gradle/init.gradle.kts"
36+
37+
private fun PrintWriter.printClosure(name: String, indentLevel: Int, body: PrintWriter.() -> Unit) {
38+
printlnIndent("$name {", indentLevel)
39+
body()
40+
printlnIndent("}", indentLevel)
41+
}
42+
43+
private fun PrintWriter.printRepository(repo: GradleRepositoryEntry, indentLevel: Int) {
44+
printClosure("maven", indentLevel) {
45+
printlnIndent("url = uri(\"${repo.url}\")", indentLevel + 1)
46+
repo.username?.let { username ->
47+
repo.password?.let { password ->
48+
printClosure("credentials", indentLevel + 1) {
49+
printlnIndent("username = \"$username\"", indentLevel + 2)
50+
printlnIndent("password = \"$password\"", indentLevel + 2)
51+
}
52+
}
53+
}
54+
}
55+
}
56+
57+
private fun PrintWriter.printlnIndent(line: String, indentLevel: Int) {
58+
println(line.prependIndent(INDENT_4_SPACES.repeat(indentLevel)))
59+
}
3360
}
61+
3462
override val environmentDefinitionType: Class<GradleDefinition> = GradleDefinition::class.java
3563

3664
override suspend fun generate(builder: ConfigFileBuilder, definitions: Collection<GradleDefinition>) {
37-
builder.buildInUserHome(TARGET_NAME) {}
65+
builder.buildInUserHome(TARGET_NAME) {
66+
val repositories = buildList {
67+
builder.adminConfig.mavenCentralMirror?.let { mirror ->
68+
add(
69+
GradleRepositoryEntry(
70+
mirror.url,
71+
mirror.usernameSecret?.let { builder.infraSecretResolverFun(Path(it)) },
72+
mirror.passwordSecret?.let { builder.infraSecretResolverFun(Path(it)) }
73+
)
74+
)
75+
}
76+
}
77+
78+
if (repositories.isNotEmpty()) {
79+
printClosure("allprojects", 0) {
80+
printClosure("repositories", 1) {
81+
repositories.forEach { repo -> printRepository(repo, 2) }
82+
}
83+
84+
println()
85+
86+
printClosure("buildscript", 1) {
87+
printClosure("repositories", 2) {
88+
repositories.forEach { repo -> printRepository(repo, 3) }
89+
}
90+
}
91+
}
92+
93+
println()
94+
95+
printClosure("settingsEvaluated", 0) {
96+
printClosure("settings.pluginManagement", 1) {
97+
printClosure("repositories", 2) {
98+
repositories.forEach { repo -> printRepository(repo, 3) }
99+
printlnIndent("gradlePluginPortal()", 3)
100+
}
101+
}
102+
103+
println()
104+
105+
printClosure("settings.dependencyResolutionManagement", 1) {
106+
printClosure("repositories", 2) {
107+
repositories.forEach { repo -> printRepository(repo, 3) }
108+
}
109+
}
110+
}
111+
}
112+
}
38113
}
39114
}
115+
116+
/**
117+
* A data class representing a Gradle repository entry.
118+
*/
119+
private data class GradleRepositoryEntry(
120+
val url: String,
121+
val username: String?,
122+
val password: String?,
123+
)

workers/common/src/test/kotlin/common/env/GradleInitGeneratorTest.kt

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,14 @@
2020
package org.eclipse.apoapsis.ortserver.workers.common.env
2121

2222
import io.kotest.core.spec.style.WordSpec
23+
import io.kotest.matchers.collections.shouldContainExactly
2324
import io.kotest.matchers.shouldBe
25+
import io.kotest.matchers.string.shouldBeEmpty
2426

27+
import io.mockk.every
28+
29+
import org.eclipse.apoapsis.ortserver.config.Path
30+
import org.eclipse.apoapsis.ortserver.services.config.MavenCentralMirror
2531
import org.eclipse.apoapsis.ortserver.workers.common.env.definition.GradleDefinition
2632

2733
class GradleInitGeneratorTest : WordSpec({
@@ -41,5 +47,144 @@ class GradleInitGeneratorTest : WordSpec({
4147

4248
mockBuilder.homeFileName shouldBe ".gradle/init.gradle.kts"
4349
}
50+
51+
"generate an empty file if MavenCentralMirror is null" {
52+
val mockBuilder = MockConfigFileBuilder()
53+
54+
GradleInitGenerator().generate(mockBuilder.builder, emptyList())
55+
56+
mockBuilder.generatedText().shouldBeEmpty()
57+
}
58+
59+
"generate repositories blocks without credentials if MavenCentralMirror has no credentials" {
60+
val mavenCentralMirror = MavenCentralMirror(
61+
id = "central",
62+
name = "Maven Central",
63+
url = "https://repo.maven.apache.org/maven2",
64+
mirrorOf = "central"
65+
)
66+
67+
val mockBuilder = MockConfigFileBuilder()
68+
every { mockBuilder.adminConfig.mavenCentralMirror } returns mavenCentralMirror
69+
70+
GradleInitGenerator().generate(mockBuilder.builder, emptyList())
71+
72+
val expectedLines = listOf(
73+
"allprojects {",
74+
" repositories {",
75+
" maven {",
76+
" url = uri(\"${mavenCentralMirror.url}\")",
77+
" }",
78+
" }",
79+
"",
80+
" buildscript {",
81+
" repositories {",
82+
" maven {",
83+
" url = uri(\"${mavenCentralMirror.url}\")",
84+
" }",
85+
" }",
86+
" }",
87+
"}",
88+
"",
89+
"settingsEvaluated {",
90+
" settings.pluginManagement {",
91+
" repositories {",
92+
" maven {",
93+
" url = uri(\"${mavenCentralMirror.url}\")",
94+
" }",
95+
" gradlePluginPortal()",
96+
" }",
97+
" }",
98+
"",
99+
" settings.dependencyResolutionManagement {",
100+
" repositories {",
101+
" maven {",
102+
" url = uri(\"${mavenCentralMirror.url}\")",
103+
" }",
104+
" }",
105+
" }",
106+
"}"
107+
)
108+
109+
val lines = mockBuilder.generatedLines()
110+
lines shouldContainExactly expectedLines
111+
}
112+
113+
"generate repositories blocks with credentials if MavenCentralMirror has credentials" {
114+
val username = "test-username"
115+
val infraUsernameSecret = MockConfigFileBuilder.createSecret("infra-secret-username")
116+
val password = "test-password"
117+
val infraPasswordSecret = MockConfigFileBuilder.createSecret("infra-secret-password")
118+
val mavenCentralMirror = MavenCentralMirror(
119+
id = "central",
120+
name = "Maven Central",
121+
url = "https://repo.maven.apache.org/maven2",
122+
mirrorOf = "central",
123+
usernameSecret = infraUsernameSecret.name,
124+
passwordSecret = infraPasswordSecret.name
125+
)
126+
127+
val mockBuilder = MockConfigFileBuilder()
128+
every { mockBuilder.infraSecretResolverFun.invoke(Path(infraUsernameSecret.path)) } returns username
129+
every { mockBuilder.infraSecretResolverFun.invoke(Path(infraPasswordSecret.path)) } returns password
130+
every { mockBuilder.adminConfig.mavenCentralMirror } returns mavenCentralMirror
131+
132+
GradleInitGenerator().generate(mockBuilder.builder, emptyList())
133+
134+
val expectedLines = listOf(
135+
"allprojects {",
136+
" repositories {",
137+
" maven {",
138+
" url = uri(\"${mavenCentralMirror.url}\")",
139+
" credentials {",
140+
" username = \"$username\"",
141+
" password = \"$password\"",
142+
" }",
143+
" }",
144+
" }",
145+
"",
146+
" buildscript {",
147+
" repositories {",
148+
" maven {",
149+
" url = uri(\"${mavenCentralMirror.url}\")",
150+
" credentials {",
151+
" username = \"$username\"",
152+
" password = \"$password\"",
153+
" }",
154+
" }",
155+
" }",
156+
" }",
157+
"}",
158+
"",
159+
"settingsEvaluated {",
160+
" settings.pluginManagement {",
161+
" repositories {",
162+
" maven {",
163+
" url = uri(\"${mavenCentralMirror.url}\")",
164+
" credentials {",
165+
" username = \"$username\"",
166+
" password = \"$password\"",
167+
" }",
168+
" }",
169+
" gradlePluginPortal()",
170+
" }",
171+
" }",
172+
"",
173+
" settings.dependencyResolutionManagement {",
174+
" repositories {",
175+
" maven {",
176+
" url = uri(\"${mavenCentralMirror.url}\")",
177+
" credentials {",
178+
" username = \"$username\"",
179+
" password = \"$password\"",
180+
" }",
181+
" }",
182+
" }",
183+
" }",
184+
"}"
185+
)
186+
val lines = mockBuilder.generatedLines()
187+
lines shouldContainExactly expectedLines
188+
}
44189
}
45190
})

0 commit comments

Comments
 (0)