Skip to content

Commit 67cce9d

Browse files
committed
feat: Use resolution strategy to resolve bukkit dependency version and paper group
1 parent cc4205f commit 67cce9d

File tree

10 files changed

+138
-79
lines changed

10 files changed

+138
-79
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@
33
### Added
44

55
- Support setting "api-version" containing a patch version for v1.20.5+
6+
- Add dependency substitution rules fixing paper groupId and substituting bukkit version.
7+
In version catalogs placeholder value `{bukkit.version}` can be used, and it will be replaced with the actual version:
8+
```toml
9+
[libraries]
10+
paperApi = { module = "io.papermc.paper:paper-api", version = "{bukkit.apiVersion}" }
11+
```
612

713
### Changed
814

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,11 +175,12 @@ When adding dependencies, make sure you've added the corresponding repository.
175175
|-------------|------------------------------------------|---------------------|
176176
| `spigot` | `org.spigotmc:spigot:$apiVersion` | `mavenLocal()`* |
177177
| `spigotApi` | `org.spigotmc:spigot-api:$apiVersion` | `spigot()` |
178-
| `bukkitApi` | `org.bukkit:bukkit:$apiVersion` | `spigot()` |
178+
| `bukkitApi` | `org.bukkit:bukkit:$apiVersion` | `mavenLocal()`** |
179179
| `paperApi` | `io.papermc.paper:paper-api:$apiVersion` | `papermc()` |
180180

181181
\* Spigot is available in `mavenLocal()` only if you've built it locally using [Spigot BuildTools][buildtools]. \
182-
\*\* `$apiVersion` - is `${version}-R0.1-SNAPSHOT` (where `$version` is `bukkit.apiVersion`)
182+
\*\* Bukkit should be built locally. However, some versions are available in `spigot()` repository. \
183+
\*\*\* `$apiVersion` - is `${version}-R0.1-SNAPSHOT` (where `$version` is `bukkit.apiVersion`).
183184

184185
If you need more shortcuts, [file an issue][issue].
185186

src/main/kotlin/BukkitExtension.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,29 @@ package ru.endlesscode.bukkitgradle
33
import org.gradle.api.Action
44
import org.gradle.api.model.ObjectFactory
55
import org.gradle.api.provider.Property
6+
import org.gradle.api.provider.ProviderFactory
67
import org.gradle.kotlin.dsl.property
7-
import ru.endlesscode.bukkitgradle.extensions.finalizedOnRead
8+
import ru.endlesscode.bukkitgradle.extensions.finalizeAndGet
89
import ru.endlesscode.bukkitgradle.plugin.plugin
10+
import ru.endlesscode.bukkitgradle.plugin.util.MinecraftVersion
911
import ru.endlesscode.bukkitgradle.server.ServerConstants
1012
import ru.endlesscode.bukkitgradle.server.extension.ServerConfigurationImpl
1113
import xyz.jpenilla.resourcefactory.bukkit.BukkitPluginYaml
1214

1315
public open class BukkitExtension internal constructor(
1416
public final override val server: ServerConfigurationImpl,
1517
objects: ObjectFactory,
18+
providers: ProviderFactory,
1619
) : Bukkit {
1720

1821
override val generatePluginYaml: Property<Boolean> = objects.property<Boolean>()
1922
.convention(true)
2023

2124
public final override val apiVersion: Property<String> = objects.property<String>()
2225
.convention(ServerConstants.DEFAULT_VERSION)
23-
.finalizedOnRead()
26+
27+
internal val finalApiVersion = providers.provider { apiVersion.finalizeAndGet() }
28+
internal val parsedApiVersion = finalApiVersion.map(MinecraftVersion::parse)
2429

2530
public fun server(body: Action<ServerConfigurationImpl>) {
2631
body.execute(server)

src/main/kotlin/BukkitGradlePlugin.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import org.gradle.kotlin.dsl.withType
1212
import ru.endlesscode.bukkitgradle.dependencies.Dependencies.configureDependencyExtensions
1313
import ru.endlesscode.bukkitgradle.extensions.java
1414
import ru.endlesscode.bukkitgradle.plugin.configurePluginYamlFeature
15-
import ru.endlesscode.bukkitgradle.plugin.util.parsedApiVersion
1615
import ru.endlesscode.bukkitgradle.plugin.util.resolveMinimalJavaVersion
1716
import ru.endlesscode.bukkitgradle.server.configureDevServerFeature
1817
import ru.endlesscode.bukkitgradle.server.extension.ServerConfigurationImpl
@@ -37,7 +36,7 @@ public class BukkitGradlePlugin : Plugin<Project> {
3736
configureDependencyExtensions(bukkit)
3837
}
3938

40-
private fun Project.configureJavaCompilation(bukkit: Bukkit) {
39+
private fun Project.configureJavaCompilation(bukkit: BukkitExtension) {
4140
java.toolchain {
4241
languageVersion.convention(bukkit.parsedApiVersion.map(::resolveMinimalJavaVersion))
4342
}

src/main/kotlin/dependencies/Dependencies.kt

Lines changed: 58 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,10 @@ import org.gradle.api.artifacts.dsl.DependencyHandler
77
import org.gradle.api.artifacts.dsl.RepositoryHandler
88
import org.gradle.api.artifacts.repositories.MavenArtifactRepository
99
import org.gradle.api.plugins.ExtraPropertiesExtension
10-
import org.gradle.api.provider.Provider
11-
import org.gradle.kotlin.dsl.KotlinClosure0
1210
import org.gradle.kotlin.dsl.extra
1311
import org.gradle.kotlin.dsl.maven
14-
import ru.endlesscode.bukkitgradle.Bukkit
12+
import ru.endlesscode.bukkitgradle.BukkitExtension
1513
import ru.endlesscode.bukkitgradle.plugin.util.MinecraftVersion
16-
import ru.endlesscode.bukkitgradle.plugin.util.parsedApiVersion
1714

1815
private typealias RepositoryClosure = Closure<MavenArtifactRepository>
1916

@@ -29,42 +26,40 @@ internal object Dependencies {
2926
const val URL_AIKAR = "https://repo.aikar.co/content/groups/aikar/"
3027
const val URL_CODEMC = "https://repo.codemc.org/repository/maven-public/"
3128

32-
private lateinit var apiVersion: Provider<String>
33-
private lateinit var parsedApiVersion: Provider<MinecraftVersion>
29+
const val BUKKIT_VERSION_PLACEHOLDER = "{bukkit.apiVersion}"
30+
const val BUKKIT_VERSION_SUFFIX = "-R0.1-SNAPSHOT"
3431

35-
private lateinit var repoHandler: RepositoryHandler
36-
private lateinit var depHandler: DependencyHandler
32+
const val PAPER_GROUP = "io.papermc.paper"
33+
const val PAPER_OLD_GROUP = "com.destroystokyo.paper"
3734

3835
private val RepositoryHandler.extra: ExtraPropertiesExtension
3936
get() = InvokerHelper.getProperty(this, "ext") as ExtraPropertiesExtension
4037

4138
@JvmStatic
42-
fun Project.configureDependencyExtensions(bukkit: Bukkit) {
43-
apiVersion = bukkit.apiVersion
44-
parsedApiVersion = bukkit.parsedApiVersion
39+
fun Project.configureDependencyExtensions(bukkit: BukkitExtension) {
40+
repositories.addGroovyExtensions()
41+
dependencies.addGroovyExtensions()
4542

46-
repoHandler = repositories
47-
depHandler = dependencies
48-
addGroovyExtensions()
43+
configureResolutionStrategy(bukkit)
4944
}
5045

51-
private fun addGroovyExtensions() {
52-
val repoExtra = repoHandler.extra
53-
repoExtra["spigot"] = repoHandler.repositoryClosure("Spigot", URL_SPIGOT)
54-
repoExtra["sk89q"] = repoHandler.repositoryClosure("sk89q", URL_SK89Q)
55-
repoExtra["papermc"] = repoHandler.repositoryClosure("PaperMC", URL_PAPERMC)
56-
repoExtra["dmulloy2"] = repoHandler.repositoryClosure("dmulloy2", URL_DMULLOY2)
57-
repoExtra["md5"] = repoHandler.repositoryClosure("md5", URL_MD5)
58-
repoExtra["jitpack"] = repoHandler.repositoryClosure("jitpack", URL_JITPACK)
59-
repoExtra["placeholderapi"] = repoHandler.repositoryClosure("PlaceholderAPI", URL_PLACEHOLDERAPI)
60-
repoExtra["aikar"] = repoHandler.repositoryClosure("aikar", URL_AIKAR)
61-
repoExtra["codemc"] = repoHandler.repositoryClosure("codemc", URL_CODEMC)
62-
63-
val depExtra = depHandler.extra
64-
depExtra["spigot"] = depClosureOf { depHandler.api("org.spigotmc", "spigot") }
65-
depExtra["spigotApi"] = depClosureOf { depHandler.api("org.spigotmc", "spigot-api") }
66-
depExtra["bukkitApi"] = depClosureOf { depHandler.api("org.bukkit", "bukkit") }
67-
depExtra["paperApi"] = depClosureOf { depHandler.api(resolvePaperGroupId(), "paper-api") }
46+
private fun RepositoryHandler.addGroovyExtensions() {
47+
extra["spigot"] = repositoryClosure("Spigot", URL_SPIGOT)
48+
extra["sk89q"] = repositoryClosure("sk89q", URL_SK89Q)
49+
extra["papermc"] = repositoryClosure("PaperMC", URL_PAPERMC)
50+
extra["dmulloy2"] = repositoryClosure("dmulloy2", URL_DMULLOY2)
51+
extra["md5"] = repositoryClosure("md5", URL_MD5)
52+
extra["jitpack"] = repositoryClosure("jitpack", URL_JITPACK)
53+
extra["placeholderapi"] = repositoryClosure("PlaceholderAPI", URL_PLACEHOLDERAPI)
54+
extra["aikar"] = repositoryClosure("aikar", URL_AIKAR)
55+
extra["codemc"] = repositoryClosure("codemc", URL_CODEMC)
56+
}
57+
58+
private fun DependencyHandler.addGroovyExtensions() {
59+
extra["spigot"] = withBukkitVersion("org.spigotmc", "spigot")
60+
extra["spigotApi"] = withBukkitVersion("org.spigotmc", "spigot-api")
61+
extra["bukkitApi"] = withBukkitVersion("org.bukkit", "bukkit")
62+
extra["paperApi"] = withBukkitVersion(PAPER_GROUP, "paper-api")
6863
}
6964

7065
private fun RepositoryHandler.repositoryClosure(name: String, url: String): RepositoryClosure =
@@ -84,20 +79,39 @@ internal object Dependencies {
8479
}
8580
}
8681

87-
@Suppress("unused") // Receiver required for scope
88-
fun DependencyHandler.api(groupId: String, artifactId: String): String {
89-
val version = "${apiVersion.get()}-R0.1-SNAPSHOT"
90-
return dep(groupId, artifactId, version)
91-
}
92-
93-
private fun dep(groupId: String, artifactId: String, version: String): String {
94-
return "$groupId:$artifactId:$version"
82+
fun withBukkitVersion(groupId: String, artifactId: String): String {
83+
return "$groupId:$artifactId:$BUKKIT_VERSION_PLACEHOLDER"
9584
}
9685

97-
internal fun resolvePaperGroupId(): String {
98-
val useNewGroup = parsedApiVersion.get() >= MinecraftVersion.V1_17_0
99-
return if (useNewGroup) "io.papermc.paper" else "com.destroystokyo.paper"
86+
private fun Project.configureResolutionStrategy(bukkit: BukkitExtension) {
87+
val bukkitVersion = bukkit.finalApiVersion
88+
.map { "$it$BUKKIT_VERSION_SUFFIX" }
89+
90+
configurations.configureEach {
91+
resolutionStrategy.eachDependency {
92+
val version = if (requested.version == BUKKIT_VERSION_PLACEHOLDER) {
93+
bukkitVersion.get()
94+
} else {
95+
requested.version
96+
}
97+
98+
val shouldUseOldPaperGroup by lazy {
99+
version != null && MinecraftVersion.parse(version) < MinecraftVersion.V1_17_0
100+
}
101+
val group = when (requested.group) {
102+
PAPER_GROUP -> if (shouldUseOldPaperGroup) PAPER_OLD_GROUP else requested.group
103+
PAPER_OLD_GROUP -> if (!shouldUseOldPaperGroup) PAPER_GROUP else requested.group
104+
else -> requested.group
105+
}
106+
107+
if (requested.group != group) {
108+
useTarget("$group:${requested.name}:$version")
109+
because("Fix paper group as it was changed in 1.17")
110+
} else if (requested.version != version && version != null) {
111+
useVersion(version)
112+
because("Substitute bukkit version")
113+
}
114+
}
115+
}
100116
}
101-
102-
private fun depClosureOf(body: () -> String) = KotlinClosure0(body)
103117
}

src/main/kotlin/dependencies/DependenciesExtensions.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
@file:Suppress("SpellCheckingInspection")
1+
@file:Suppress("SpellCheckingInspection", "UnusedReceiverParameter")
22

33
package ru.endlesscode.bukkitgradle.dependencies
44

55
import org.gradle.api.artifacts.dsl.DependencyHandler
66
import org.gradle.api.artifacts.dsl.RepositoryHandler
77
import org.gradle.api.artifacts.repositories.MavenArtifactRepository
8+
import ru.endlesscode.bukkitgradle.dependencies.Dependencies.PAPER_GROUP
89
import ru.endlesscode.bukkitgradle.dependencies.Dependencies.URL_AIKAR
910
import ru.endlesscode.bukkitgradle.dependencies.Dependencies.URL_CODEMC
1011
import ru.endlesscode.bukkitgradle.dependencies.Dependencies.URL_DMULLOY2
@@ -15,8 +16,7 @@ import ru.endlesscode.bukkitgradle.dependencies.Dependencies.URL_PLACEHOLDERAPI
1516
import ru.endlesscode.bukkitgradle.dependencies.Dependencies.URL_SK89Q
1617
import ru.endlesscode.bukkitgradle.dependencies.Dependencies.URL_SPIGOT
1718
import ru.endlesscode.bukkitgradle.dependencies.Dependencies.addRepo
18-
import ru.endlesscode.bukkitgradle.dependencies.Dependencies.api
19-
import ru.endlesscode.bukkitgradle.dependencies.Dependencies.resolvePaperGroupId
19+
import ru.endlesscode.bukkitgradle.dependencies.Dependencies.withBukkitVersion
2020

2121
public fun RepositoryHandler.spigot(configure: MavenArtifactRepository.() -> Unit = {}): MavenArtifactRepository =
2222
addRepo("Spigot", URL_SPIGOT, configure)
@@ -46,13 +46,13 @@ public fun RepositoryHandler.codemc(configure: MavenArtifactRepository.() -> Uni
4646
addRepo("codemc", URL_CODEMC, configure)
4747

4848
public val DependencyHandler.spigot: String
49-
get() = api("org.spigotmc", "spigot")
49+
get() = withBukkitVersion("org.spigotmc", "spigot")
5050

5151
public val DependencyHandler.spigotApi: String
52-
get() = api("org.spigotmc", "spigot-api")
52+
get() = withBukkitVersion("org.spigotmc", "spigot-api")
5353

5454
public val DependencyHandler.bukkitApi: String
55-
get() = api("org.bukkit", "bukkit")
55+
get() = withBukkitVersion("org.bukkit", "bukkit")
5656

5757
public val DependencyHandler.paperApi: String
58-
get() = api(resolvePaperGroupId(), "paper-api")
58+
get() = withBukkitVersion(PAPER_GROUP, "paper-api")

src/main/kotlin/plugin/PluginYamlFeature.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import ru.endlesscode.bukkitgradle.extensions.sourceSets
1515
import ru.endlesscode.bukkitgradle.plugin.task.ParsePluginYaml
1616
import ru.endlesscode.bukkitgradle.plugin.util.MinecraftVersion
1717
import ru.endlesscode.bukkitgradle.plugin.util.StringUtils
18-
import ru.endlesscode.bukkitgradle.plugin.util.parsedApiVersion
1918
import xyz.jpenilla.resourcefactory.ExecuteResourceFactories
2019
import xyz.jpenilla.resourcefactory.ResourceFactoryPlugin
2120
import xyz.jpenilla.resourcefactory.bukkit.BukkitPluginYaml

src/main/kotlin/plugin/util/MinecraftVersion.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package ru.endlesscode.bukkitgradle.plugin.util
22

33
import org.gradle.jvm.toolchain.JavaLanguageVersion
4-
import ru.endlesscode.bukkitgradle.Bukkit
4+
import ru.endlesscode.bukkitgradle.dependencies.Dependencies
55

66
@JvmInline
77
internal value class MinecraftVersion(private val value: Int) : Comparable<MinecraftVersion> {
@@ -16,7 +16,9 @@ internal value class MinecraftVersion(private val value: Int) : Comparable<Minec
1616

1717
companion object {
1818
fun parse(version: String): MinecraftVersion {
19-
val versionParts = version.split('.').mapNotNull { it.toIntOrNull() }
19+
val versionParts = version
20+
.removeSuffix(Dependencies.BUKKIT_VERSION_SUFFIX)
21+
.split('.').mapNotNull { it.toIntOrNull() }
2022
require(versionParts.size in 2..3) { "Unable to parse API version '$version'." }
2123
val (major, minor, patch) = versionParts + 0
2224
return MinecraftVersion(major * 1_00_00 + minor * 1_00 + patch)
@@ -29,8 +31,6 @@ internal value class MinecraftVersion(private val value: Int) : Comparable<Minec
2931
}
3032
}
3133

32-
internal val Bukkit.parsedApiVersion get() = apiVersion.map(MinecraftVersion::parse)
33-
3434
internal fun resolveMinimalJavaVersion(version: String) = resolveMinimalJavaVersion(MinecraftVersion.parse(version))
3535

3636
internal fun resolveMinimalJavaVersion(version: MinecraftVersion): JavaLanguageVersion = when {

src/main/kotlin/server/DevServerFeature.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import org.gradle.api.provider.Provider
66
import org.gradle.api.tasks.TaskProvider
77
import org.gradle.jvm.toolchain.JavaToolchainService
88
import org.gradle.kotlin.dsl.*
9-
import ru.endlesscode.bukkitgradle.Bukkit
9+
import ru.endlesscode.bukkitgradle.BukkitExtension
1010
import ru.endlesscode.bukkitgradle.extensions.java
1111
import ru.endlesscode.bukkitgradle.plugin.util.resolveMinimalJavaVersion
1212
import ru.endlesscode.bukkitgradle.server.extension.ServerConfiguration
@@ -15,13 +15,13 @@ import ru.endlesscode.bukkitgradle.server.task.PrepareServer
1515
import xyz.jpenilla.runpaper.RunPaperPlugin
1616
import xyz.jpenilla.runpaper.task.RunServer
1717

18-
internal fun Project.configureDevServerFeature(bukkit: Bukkit) {
18+
internal fun Project.configureDevServerFeature(bukkit: BukkitExtension) {
1919
apply<RunPaperPlugin>()
2020
val configuredServerDir = resolveConfiguredServerDir()
2121

2222
// Preconfigure the RunServer task
2323
val serverConfiguration = bukkit.server
24-
val serverVersion = provider<String> { serverConfiguration.version }.orElse(bukkit.apiVersion)
24+
val serverVersion = provider<String> { serverConfiguration.version }.orElse(bukkit.finalApiVersion)
2525
val runServer = tasks.named<RunServer>("runServer") {
2626
version.convention(serverVersion)
2727
if (configuredServerDir != null) runDirectory.convention(configuredServerDir)

0 commit comments

Comments
 (0)