Skip to content

Commit 83b62d2

Browse files
Apply repositories only if PREFER_PROJECT
1 parent aca73d2 commit 83b62d2

2 files changed

Lines changed: 109 additions & 5 deletions

File tree

gradle-root-plugin/src/main/kotlin/io/spine/tools/gradle/root/RootPlugin.kt

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2525
*/
2626

27+
@file:Suppress("UnstableApiUsage") // We need to use unstable settings API.
28+
2729
package io.spine.tools.gradle.root
2830

2931
import io.spine.tools.gradle.DslSpec
@@ -32,6 +34,9 @@ import io.spine.tools.gradle.project.ProjectPlugin
3234
import io.spine.tools.gradle.root.RootExtension.Companion.NAME
3335
import org.gradle.api.Project
3436
import org.gradle.api.file.Directory
37+
import org.gradle.api.initialization.resolve.RepositoriesMode
38+
import org.gradle.api.internal.GradleInternal
39+
import org.gradle.api.internal.SettingsInternal
3540
import org.gradle.api.plugins.ExtensionAware
3641

3742
/**
@@ -40,7 +45,9 @@ import org.gradle.api.plugins.ExtensionAware
4045
* The extension is used by Gradle plugins of libraries that extend
4146
* the [root extension][RootExtension] with custom configuration DSL.
4247
*
43-
* The plugin also applies repositories [standard for Spine SDK][applyStandard] to the project.
48+
* The plugin also applies repositories [standard for Spine SDK][applyStandard]
49+
* to the project IFF `dependencyResolutionManagement.repositoriesMode` property set
50+
* in `settings.gradle.kts` to [RepositoriesMode.PREFER_PROJECT] or assumed such.
4451
*/
4552
public class RootPlugin :
4653
ProjectPlugin<RootExtension>(DslSpec(NAME, RootExtension::class)) {
@@ -61,14 +68,12 @@ public class RootPlugin :
6168
}
6269

6370
/**
64-
* Applies the plugin to the given [project] by forcing creation of the [extension].
65-
*
66-
* Also applies repositories [standard for Spine SDK][applyStandard].
71+
* Applies the plugin to the given [project].
6772
*/
6873
override fun apply(project: Project) {
6974
super.apply(project)
7075
createExtension()
71-
project.repositories.applyStandard()
76+
project.tryApplyStandardRepositories()
7277
check(extension != null) {
7378
"The extension of the `${this::class.simpleName}` has not been created."
7479
}
@@ -82,3 +87,30 @@ public class RootPlugin :
8287
public const val ID: String = "io.spine.root"
8388
}
8489
}
90+
91+
/**
92+
* Attempts to apply repositories [standard for Spine SDK][applyStandard] to the project
93+
* by inspecting the `dependencyResolutionManagement.repositoriesMode` value set
94+
* in `settings.gradle.kts`.
95+
*
96+
* If the value set explicitly or assumed as [RepositoriesMode.PREFER_PROJECT],
97+
* the repositories are applied.
98+
*/
99+
private fun Project.tryApplyStandardRepositories() {
100+
val settings = project.settings
101+
if (settings == null) {
102+
repositories.applyStandard()
103+
return
104+
}
105+
val mode = settings.dependencyResolutionManagement.repositoriesMode.get()
106+
if (mode == RepositoriesMode.PREFER_PROJECT) {
107+
repositories.applyStandard()
108+
}
109+
}
110+
111+
private val Project.settings: SettingsInternal?
112+
get() = try {
113+
(project.gradle as GradleInternal).settings
114+
} catch (_: IllegalStateException) {
115+
null
116+
}

gradle-root-plugin/src/test/kotlin/io/spine/tools/gradle/root/RootPluginSpec.kt

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import io.kotest.matchers.collections.shouldContain
3030
import io.kotest.matchers.shouldBe
3131
import io.kotest.matchers.shouldNotBe
3232
import io.kotest.matchers.string.shouldContain
33+
import io.kotest.matchers.string.shouldNotContain
3334
import io.spine.tools.gradle.task.BaseTaskName
3435
import io.spine.tools.gradle.testing.Gradle
3536
import io.spine.tools.gradle.testing.Gradle.BUILD_SUCCESSFUL
@@ -93,6 +94,77 @@ internal class RootPluginSpec {
9394
urls shouldContain "https://europe-maven.pkg.dev/spine-event-engine/snapshots"
9495
}
9596

97+
@Test
98+
fun `apply repositories if 'repositoriesMode' is 'PREFER_PROJECT'`(
99+
@TempDir projectDir: File
100+
) {
101+
Gradle.settingsFile.under(projectDir).writeText(
102+
"""
103+
dependencyResolutionManagement {
104+
repositoriesMode.set(RepositoriesMode.PREFER_PROJECT)
105+
}
106+
""".trimIndent()
107+
)
108+
Gradle.buildFile.under(projectDir).writeText(
109+
"""
110+
plugins {
111+
id("io.spine.root")
112+
}
113+
114+
tasks.register("checkRepos") {
115+
doLast {
116+
if (project.repositories.isEmpty()) {
117+
println("NO_REPOS")
118+
} else {
119+
project.repositories.forEach {
120+
println("REPO: " + it.name)
121+
}
122+
}
123+
}
124+
}
125+
""".trimIndent()
126+
)
127+
128+
val result = runGradleBuild(projectDir, listOf("checkRepos"))
129+
result.output shouldContain "REPO: MavenLocal"
130+
}
131+
132+
@Test
133+
fun `not apply repositories if 'repositoriesMode' is other than 'PREFER_PROJECT'`(
134+
@TempDir projectDir: File
135+
) {
136+
Gradle.settingsFile.under(projectDir).writeText(
137+
"""
138+
dependencyResolutionManagement {
139+
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
140+
}
141+
""".trimIndent()
142+
)
143+
Gradle.buildFile.under(projectDir).writeText(
144+
"""
145+
plugins {
146+
id("io.spine.root")
147+
}
148+
149+
tasks.register("checkRepos") {
150+
doLast {
151+
if (project.repositories.isEmpty()) {
152+
println("NO_REPOS")
153+
} else {
154+
project.repositories.forEach {
155+
println("REPO: " + it.name)
156+
}
157+
}
158+
}
159+
}
160+
""".trimIndent()
161+
)
162+
163+
val result = runGradleBuild(projectDir, listOf("checkRepos"))
164+
result.output shouldContain "NO_REPOS"
165+
result.output shouldNotContain "REPO: MavenLocal"
166+
}
167+
96168
@Test
97169
fun `be applied via its ID`(@TempDir projectDir: File) {
98170
Gradle.buildFile.under(projectDir).writeText(

0 commit comments

Comments
 (0)