From cd867c756a3b14d2123617e4bd730a9b547bb10a Mon Sep 17 00:00:00 2001 From: Atrius Date: Sun, 17 May 2026 01:42:56 -0400 Subject: [PATCH 1/5] build: Add version catalog and convert settings to Kotlin DSL --- gradle/libs.versions.toml | 43 ++++++++++++++++++++++++++ settings.gradle => settings.gradle.kts | 6 +--- 2 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 gradle/libs.versions.toml rename settings.gradle => settings.gradle.kts (51%) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..284f83a --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,43 @@ +[versions] +kotlin = "2.3.0" +koin = "4.2.1" +arrow = "2.1.2" +flyway = "11.10.5" +sqlite = "3.50.3.0" +mysql = "9.4.0" +bstats = "3.1.0" +detekt = "2.0.0-alpha.2" +shadow = "9.4.1" +minecraft-server = "4.0.2" +koin-compiler = "1.0.0-RC1" +hangar = "0.1.3" +modrinth = "2.8.7" +buildconfig = "5.6.7" +mockk = "1.14.2" +kotest = "5.9.1" + +[libraries] +paper-api = { module = "io.papermc.paper:paper-api", version = "26.1.2.build.+" } +kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" } +koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" } +koin-annotations = { module = "io.insert-koin:koin-annotations", version.ref = "koin" } +bstats-bukkit = { module = "org.bstats:bstats-bukkit", version.ref = "bstats" } +arrow-core = { module = "io.arrow-kt:arrow-core", version.ref = "arrow" } +flyway-core = { module = "org.flywaydb:flyway-core", version.ref = "flyway" } +flyway-mysql = { module = "org.flywaydb:flyway-mysql", version.ref = "flyway" } +sqlite-jdbc = { module = "org.xerial:sqlite-jdbc", version.ref = "sqlite" } +mysql-connector = { module = "com.mysql:mysql-connector-j", version.ref = "mysql" } +detekt-ktlint = { module = "dev.detekt:detekt-rules-ktlint-wrapper", version.ref = "detekt" } +mockk = { module = "io.mockk:mockk", version.ref = "mockk" } +kotest-runner = { module = "io.kotest:kotest-runner-junit5", version.ref = "kotest" } + +[plugins] +kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } +shadow = { id = "com.gradleup.shadow", version.ref = "shadow" } +minecraft-server = { id = "dev.s7a.gradle.minecraft.server", version.ref = "minecraft-server" } +koin-compiler = { id = "io.insert-koin.compiler.plugin", version.ref = "koin-compiler" } +detekt = { id = "dev.detekt", version.ref = "detekt" } +hangar = { id = "io.papermc.hangar-publish-plugin", version.ref = "hangar" } +modrinth = { id = "com.modrinth.minotaur", version.ref = "modrinth" } +flyway = { id = "org.flywaydb.flyway", version.ref = "flyway" } +buildconfig = { id = "com.github.gmazzo.buildconfig", version.ref = "buildconfig" } diff --git a/settings.gradle b/settings.gradle.kts similarity index 51% rename from settings.gradle rename to settings.gradle.kts index f1c0c62..4b97a9b 100644 --- a/settings.gradle +++ b/settings.gradle.kts @@ -1,7 +1,3 @@ -/* - * This file was generated by the Gradle 'init' task. - */ - pluginManagement { repositories { mavenCentral() @@ -9,4 +5,4 @@ pluginManagement { } } -rootProject.name = 'waystones' +rootProject.name = "waystones" From 9f5c71bec88bf57e36878a4114daa6456ea3cebc Mon Sep 17 00:00:00 2001 From: Atrius Date: Sun, 17 May 2026 01:43:04 -0400 Subject: [PATCH 2/5] build: Create buildSrc with shared catalog and convention plugins --- buildSrc/build.gradle.kts | 20 +++++ buildSrc/settings.gradle.kts | 14 ++++ .../src/main/kotlin/waystones.base.gradle.kts | 22 ++++++ .../kotlin/waystones.build-config.gradle.kts | 22 ++++++ .../main/kotlin/waystones.detekt.gradle.kts | 14 ++++ .../main/kotlin/waystones.flyway.gradle.kts | 21 +++++ .../waystones.hangar-publish.gradle.kts | 77 +++++++++++++++++++ .../waystones.minecraft-server.gradle.kts | 39 ++++++++++ .../waystones.modrinth-publish.gradle.kts | 67 ++++++++++++++++ .../waystones.resource-processing.gradle.kts | 21 +++++ .../main/kotlin/waystones.shadow.gradle.kts | 20 +++++ 11 files changed, 337 insertions(+) create mode 100644 buildSrc/build.gradle.kts create mode 100644 buildSrc/settings.gradle.kts create mode 100644 buildSrc/src/main/kotlin/waystones.base.gradle.kts create mode 100644 buildSrc/src/main/kotlin/waystones.build-config.gradle.kts create mode 100644 buildSrc/src/main/kotlin/waystones.detekt.gradle.kts create mode 100644 buildSrc/src/main/kotlin/waystones.flyway.gradle.kts create mode 100644 buildSrc/src/main/kotlin/waystones.hangar-publish.gradle.kts create mode 100644 buildSrc/src/main/kotlin/waystones.minecraft-server.gradle.kts create mode 100644 buildSrc/src/main/kotlin/waystones.modrinth-publish.gradle.kts create mode 100644 buildSrc/src/main/kotlin/waystones.resource-processing.gradle.kts create mode 100644 buildSrc/src/main/kotlin/waystones.shadow.gradle.kts diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 0000000..a4acb44 --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,20 @@ +plugins { + `kotlin-dsl` +} + +fun DependencyHandlerScope.plugin(plugin: Provider) = + plugin.map { "${it.pluginId}:${it.pluginId}.gradle.plugin:${it.version.requiredVersion}" } + +dependencies { + implementation(plugin(libs.plugins.kotlin.jvm)) + implementation(plugin(libs.plugins.koin.compiler)) + implementation(plugin(libs.plugins.shadow)) + implementation(plugin(libs.plugins.minecraft.server)) + implementation(plugin(libs.plugins.detekt)) + implementation(plugin(libs.plugins.hangar)) + implementation(plugin(libs.plugins.modrinth)) + implementation(plugin(libs.plugins.flyway)) + implementation(plugin(libs.plugins.buildconfig)) + + implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location)) +} diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts new file mode 100644 index 0000000..e6cf7b7 --- /dev/null +++ b/buildSrc/settings.gradle.kts @@ -0,0 +1,14 @@ +dependencyResolutionManagement { + repositories { + mavenCentral() + maven("https://repo.papermc.io/repository/maven-public/") + maven("https://plugins.gradle.org/m2/") + } + versionCatalogs { + create("libs") { + from(files("../gradle/libs.versions.toml")) + } + } +} + +rootProject.name = "buildSrc" diff --git a/buildSrc/src/main/kotlin/waystones.base.gradle.kts b/buildSrc/src/main/kotlin/waystones.base.gradle.kts new file mode 100644 index 0000000..e1415f6 --- /dev/null +++ b/buildSrc/src/main/kotlin/waystones.base.gradle.kts @@ -0,0 +1,22 @@ +plugins { + java + idea + id("org.jetbrains.kotlin.jvm") + id("io.insert-koin.compiler.plugin") +} + +group = "xyz.atrius" +description = "Waystones" + +java { + toolchain.languageVersion.set(JavaLanguageVersion.of(25)) +} + +kotlin { + jvmToolchain(25) +} + +repositories { + mavenCentral() + maven("https://repo.papermc.io/repository/maven-public/") +} diff --git a/buildSrc/src/main/kotlin/waystones.build-config.gradle.kts b/buildSrc/src/main/kotlin/waystones.build-config.gradle.kts new file mode 100644 index 0000000..ba999b0 --- /dev/null +++ b/buildSrc/src/main/kotlin/waystones.build-config.gradle.kts @@ -0,0 +1,22 @@ +import org.gradle.accessors.dm.LibrariesForLibs + +plugins { + id("waystones.base") + id("com.github.gmazzo.buildconfig") +} + +val libs = the() + +buildConfig { + generateAtSync = true + documentation.set("Generated by BuildConfig plugin, do not edit") + packageName("xyz.atrius.waystones.autogenerated") + className("WaystoneDependencyVersions") + useKotlinOutput() + buildConfigField("kotlinVersion", libs.kotlin.stdlib.get().version) + buildConfigField("koinVersion", libs.koin.core.get().version) + buildConfigField("arrowVersion", libs.arrow.core.get().version) + buildConfigField("flywayVersion", libs.flyway.core.get().version) + buildConfigField("sqliteVersion", libs.sqlite.jdbc.get().version) + buildConfigField("mysqlVersion", libs.mysql.connector.get().version) +} diff --git a/buildSrc/src/main/kotlin/waystones.detekt.gradle.kts b/buildSrc/src/main/kotlin/waystones.detekt.gradle.kts new file mode 100644 index 0000000..6bc19ca --- /dev/null +++ b/buildSrc/src/main/kotlin/waystones.detekt.gradle.kts @@ -0,0 +1,14 @@ +plugins { + id("waystones.base") + id("dev.detekt") +} + +dependencies { + detektPlugins("dev.detekt:detekt-rules-ktlint-wrapper:2.0.0-alpha.2") +} + +detekt { + autoCorrect = true + buildUponDefaultConfig = true + config.setFrom("$projectDir/config/detekt.yml") +} diff --git a/buildSrc/src/main/kotlin/waystones.flyway.gradle.kts b/buildSrc/src/main/kotlin/waystones.flyway.gradle.kts new file mode 100644 index 0000000..1a1ae22 --- /dev/null +++ b/buildSrc/src/main/kotlin/waystones.flyway.gradle.kts @@ -0,0 +1,21 @@ +plugins { + id("waystones.base") + id("org.flywaydb.flyway") +} + +flyway { + url = System.getenv("DB_URL") + user = System.getenv("DB_USER") + password = System.getenv("DB_USER_PASSWORD") + locations = arrayOf( + "filesystem:$projectDir/src/main/resources/db/migration/common/**", + "filesystem:$projectDir/src/main/resources/db/migration/${System.getenv("DB_TYPE")}/**", + ) + cleanDisabled = false +} + +listOf("flywayClean", "flywayValidate", "flywayMigrate").forEach { taskName -> + tasks.named(taskName) { + notCompatibleWithConfigurationCache("Plugin does not handle configuration cache well") + } +} diff --git a/buildSrc/src/main/kotlin/waystones.hangar-publish.gradle.kts b/buildSrc/src/main/kotlin/waystones.hangar-publish.gradle.kts new file mode 100644 index 0000000..8a4791c --- /dev/null +++ b/buildSrc/src/main/kotlin/waystones.hangar-publish.gradle.kts @@ -0,0 +1,77 @@ +import io.papermc.hangarpublishplugin.HangarPublishTask + +plugins { + id("waystones.base") + id("waystones.shadow") + id("io.papermc.hangar-publish-plugin") +} + +fun String.capitalized(): String = + replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() } + +fun extractChangelog(content: String): String { + val lines = content.split("\n") + var skip = true + if (lines.size == 1) return content + for (i in lines.indices) { + if (!lines[i].startsWith("## ")) continue + if (skip) { skip = false; continue } + return lines.subList(0, i).joinToString("\n").trim() + } + return content +} + +val buildPaperVersion: String by project +val paperVersions: String by project +val pluginVersion = "${project.version}-$buildPaperVersion" + +val gitHash: String by lazy { + providers + .exec { commandLine("git", "rev-parse", "--short", "HEAD") } + .standardOutput + .asText + .map { it.trim() } + .get() +} + +val supported = paperVersions + .split(",") + .map { it.trim() } + +tasks.withType { + notCompatibleWithConfigurationCache("Do not cache artifacts") +} + +hangarPublish { + publications.register("WaystonesRelease") { + version = pluginVersion + id = "waystones" + channel = "Release" + changelog = file("CHANGELOG.md") + .readText() + .let(::extractChangelog) + apiKey = System.getenv("HANGAR_API_TOKEN") + + platforms { + paper { + jar = tasks.shadowJar.flatMap { it.archiveFile } + platformVersions = supported + } + } + } + + publications.register("WaystonesSnapshot") { + version = "$pluginVersion-SNAPSHOT+$gitHash" + id = "waystones" + channel = "Snapshot" + changelog = "${project.name.capitalized()} Dev Snapshot [$gitHash]" + apiKey = System.getenv("HANGAR_API_TOKEN") + + platforms { + paper { + jar = tasks.shadowJar.flatMap { it.archiveFile } + platformVersions = supported + } + } + } +} diff --git a/buildSrc/src/main/kotlin/waystones.minecraft-server.gradle.kts b/buildSrc/src/main/kotlin/waystones.minecraft-server.gradle.kts new file mode 100644 index 0000000..e8cb43d --- /dev/null +++ b/buildSrc/src/main/kotlin/waystones.minecraft-server.gradle.kts @@ -0,0 +1,39 @@ +import dev.s7a.gradle.minecraft.server.tasks.LaunchMinecraftServerTask + +plugins { + id("waystones.base") + id("waystones.shadow") + id("dev.s7a.gradle.minecraft.server") +} + +val buildPaperVersion: String by project +val pluginVersion = "${project.version}-$buildPaperVersion" +val outputProjectName = "${project.name}-$pluginVersion" + +tasks.build { + delete( + "build/MinecraftServer/plugins/waystones", + "build/MinecraftServer/plugins/$outputProjectName.jar", + "build/libs" + ) +} + +tasks.register("buildPlugin") { + notCompatibleWithConfigurationCache("Do not cache artifacts") + dependsOn("shadowJar") + + doFirst { + copy { + from(rootDir.resolve("build/libs")) + .include("$outputProjectName.jar") + into(rootDir.resolve("build/MinecraftServer/plugins")) + } + } +} + +tasks.register("testPlugin") { + notCompatibleWithConfigurationCache("Do not cache artifacts") + dependsOn("buildPlugin") + jarUrl.set(LaunchMinecraftServerTask.JarUrl.Paper(buildPaperVersion)) + agreeEula.set(true) +} diff --git a/buildSrc/src/main/kotlin/waystones.modrinth-publish.gradle.kts b/buildSrc/src/main/kotlin/waystones.modrinth-publish.gradle.kts new file mode 100644 index 0000000..a92dfa2 --- /dev/null +++ b/buildSrc/src/main/kotlin/waystones.modrinth-publish.gradle.kts @@ -0,0 +1,67 @@ +plugins { + id("waystones.base") + id("waystones.shadow") + id("com.modrinth.minotaur") +} + +fun String.capitalized(): String = + replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() } + +fun extractChangelog(content: String): String { + val lines = content.split("\n") + var skip = true + if (lines.size == 1) return content + for (i in lines.indices) { + if (!lines[i].startsWith("## ")) continue + if (skip) { skip = false; continue } + return lines.subList(0, i).joinToString("\n").trim() + } + return content +} + +val buildPaperVersion: String by project +val paperVersions: String by project +val pluginVersion = "${project.version}-$buildPaperVersion" + +val gitHash: String by lazy { + providers + .exec { commandLine("git", "rev-parse", "--short", "HEAD") } + .standardOutput + .asText + .map { it.trim() } + .get() +} + +val supported = paperVersions + .split(",") + .map { it.trim() } + +val channel = System + .getenv("MODRINTH_PUBLISH_CHANNEL") + ?: "alpha" + +modrinth { + when (channel) { + "release" -> { + versionNumber = pluginVersion + changelog = file("CHANGELOG.md") + .readText() + .let(::extractChangelog) + } + else -> { + versionNumber = "$pluginVersion-SNAPSHOT+$gitHash" + changelog = "${project.name.capitalized()} Dev Snapshot [$gitHash]" + } + } + token = System.getenv("MODRINTH_TOKEN") + projectId = "atri-waystones" + versionName = "${project.name.capitalized()} $pluginVersion" + uploadFile.set(tasks.shadowJar) + gameVersions = supported + loaders = listOf("paper") + versionType = channel +} + +tasks.modrinth { + notCompatibleWithConfigurationCache("Do not cache artifacts") +} diff --git a/buildSrc/src/main/kotlin/waystones.resource-processing.gradle.kts b/buildSrc/src/main/kotlin/waystones.resource-processing.gradle.kts new file mode 100644 index 0000000..416c46b --- /dev/null +++ b/buildSrc/src/main/kotlin/waystones.resource-processing.gradle.kts @@ -0,0 +1,21 @@ +plugins { + id("waystones.base") +} + +tasks.processResources { + val version = providers.gradleProperty("version") + val buildPaperVersionProp = providers.gradleProperty("buildPaperVersion") + val pluginApiVersion = providers.gradleProperty("pluginApiVersion") + val paperVersionsProp = providers.gradleProperty("paperVersions") + val pluginWebsite = providers.gradleProperty("pluginWebsite") + + filesMatching("paper-plugin.yml") { + expand( + "version" to version.get(), + "buildPaperVersion" to buildPaperVersionProp.get(), + "pluginApiVersion" to pluginApiVersion.get(), + "paperVersions" to paperVersionsProp.get(), + "pluginWebsite" to pluginWebsite.get(), + ) + } +} diff --git a/buildSrc/src/main/kotlin/waystones.shadow.gradle.kts b/buildSrc/src/main/kotlin/waystones.shadow.gradle.kts new file mode 100644 index 0000000..057c1b3 --- /dev/null +++ b/buildSrc/src/main/kotlin/waystones.shadow.gradle.kts @@ -0,0 +1,20 @@ +plugins { + id("waystones.base") + id("com.gradleup.shadow") +} + +val buildPaperVersion: String by project + +val pluginVersion = "${project.version}-$buildPaperVersion" + +tasks.shadowJar { + minimize { + exclude(dependency("org.flywaydb:flyway-mysql:.*")) + } + mergeServiceFiles() + archiveClassifier.set("") + archiveVersion.set(pluginVersion) + val location = project.group.toString() + relocate("kotlin", location) + relocate("org.bstats", location) +} From 74b40a54ff4747def2bd8f72a9df0aab743bf9e8 Mon Sep 17 00:00:00 2001 From: Atrius Date: Sun, 17 May 2026 01:43:13 -0400 Subject: [PATCH 3/5] build: Organize root build.gradle.kts and clean gradle.properties --- build.gradle.kts | 304 ++++------------------------------------------ gradle.properties | 9 +- 2 files changed, 23 insertions(+), 290 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 007754d..cb3b83d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,287 +1,27 @@ -import dev.s7a.gradle.minecraft.server.tasks.LaunchMinecraftServerTask -import io.papermc.hangarpublishplugin.HangarPublishTask -import io.papermc.hangarpublishplugin.internal.util.capitalized - plugins { - id("java") - id("idea") - id("org.jetbrains.kotlin.jvm") version "2.3.0" - id("com.gradleup.shadow") version "9.4.1" - id("dev.s7a.gradle.minecraft.server") version "4.0.2" - id("io.insert-koin.compiler.plugin") version "1.0.0-RC1" - id("dev.detekt") version "2.0.0-alpha.2" - id("io.papermc.hangar-publish-plugin") version "0.1.3" - id("com.modrinth.minotaur") version "2.8.7" - id("org.flywaydb.flyway") version "11.10.5" - id("com.github.gmazzo.buildconfig") version "5.6.7" -} - -val buildPaperVersion: String by project -val paperVersions: String by project - -repositories { - mavenCentral() - maven { - url = uri("https://repo.papermc.io/repository/maven-public/") - } -} - -java { - toolchain.languageVersion.set(JavaLanguageVersion.of(25)) -} - -kotlin { - jvmToolchain(25) -} - -val kotlinVersion: String by project -val koinVersion: String by project -val bstatsVersion: String by project -val arrowVersion: String by project -val flywayVersion: String by project -val sqliteVersion: String by project -val mysqlVersion: String by project - -buildscript { - dependencies { - classpath("org.flywaydb:flyway-mysql:11.10.5") - } + id("waystones.base") + id("waystones.build-config") + id("waystones.detekt") + id("waystones.shadow") + id("waystones.flyway") + id("waystones.minecraft-server") + id("waystones.hangar-publish") + id("waystones.modrinth-publish") + id("waystones.resource-processing") } dependencies { - compileOnly("io.papermc.paper:paper-api:$buildPaperVersion.build.+") - implementation("org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion") - implementation("io.insert-koin:koin-core:$koinVersion") - implementation("io.insert-koin:koin-annotations:$koinVersion") - - implementation("org.bstats:bstats-bukkit:$bstatsVersion") - shadow("io.arrow-kt:arrow-core:$arrowVersion") - // Database dependencies - shadow("org.flywaydb:flyway-core:$flywayVersion") - shadow("org.xerial:sqlite-jdbc:$sqliteVersion") - shadow("com.mysql:mysql-connector-j:$mysqlVersion") - - - detektPlugins("dev.detekt:detekt-rules-ktlint-wrapper:2.0.0-alpha.2") - - testImplementation("io.mockk:mockk:1.14.2") - testImplementation("io.kotest:kotest-runner-junit5:5.9.1") -} - -buildConfig { - generateAtSync = true - documentation.set("Generated by BuildConfig plugin, do not edit") - packageName("xyz.atrius.waystones.autogenerated") - className("WaystoneDependencyVersions") - useKotlinOutput() - buildConfigField("kotlinVersion", kotlinVersion) - buildConfigField("koinVersion", koinVersion) - buildConfigField("arrowVersion", arrowVersion) - buildConfigField("flywayVersion", flywayVersion) - buildConfigField("sqliteVersion", sqliteVersion) - buildConfigField("mysqlVersion", mysqlVersion) + compileOnly("io.papermc.paper:paper-api:${project.properties["buildPaperVersion"]}.build.+") + implementation(libs.kotlin.stdlib) + implementation(libs.koin.core) + implementation(libs.koin.annotations) + implementation(libs.bstats.bukkit) + implementation(libs.arrow.core) + implementation(libs.flyway.core) + implementation(libs.flyway.mysql) + implementation(libs.sqlite.jdbc) + implementation(libs.mysql.connector) + detektPlugins(libs.detekt.ktlint) + testImplementation(libs.mockk) + testImplementation(libs.kotest.runner) } - -flyway { - url = System.getenv("DB_URL") - user = System.getenv("DB_USER") - password = System.getenv("DB_USER_PASSWORD") - locations = arrayOf( - "filesystem:$projectDir/src/main/resources/db/migration/common/**", - "filesystem:$projectDir/src/main/resources/db/migration/${System.getenv("DB_TYPE")}/**", - ) - cleanDisabled = false -} - -tasks.flywayClean { - notCompatibleWithConfigurationCache("Plugin does not handle this well currently") -} - -tasks.flywayValidate { - notCompatibleWithConfigurationCache("Plugin does not handle this well currently") -} - -tasks.flywayMigrate { - notCompatibleWithConfigurationCache("Plugin does not handle this well currently") -} - -group = "xyz.atrius" -description = "Waystones" - -val pluginVersion = "$version-$buildPaperVersion" -val outputProjectName = "${project.name}-$pluginVersion" - -tasks.shadowJar { - minimize() - archiveClassifier.set("") - archiveVersion.set(pluginVersion) - val location = project.group.toString() - relocate("kotlin", location) - relocate("org.bstats", location) -} - -tasks.withType().configureEach { - useJUnitPlatform() -} - -fun buildProviders(vararg properties: String): Map> = properties - .associateWith { providers.provider { project.properties[it] } } - -tasks.processResources { - val providers = buildProviders( - "version", - "buildPaperVersion", - "pluginApiVersion", - "paperVersions", - "pluginWebsite", - ) - -// doLast { - filesMatching("paper-plugin.yml") { - expand(providers.mapValues { it.value.get() }) - } -// } -} - -tasks.build { - delete( - "build/MinecraftServer/plugins/waystones", - "build/MinecraftServer/plugins/$outputProjectName.jar", - "build/libs" - ) -} - -tasks.register("buildPlugin") { - notCompatibleWithConfigurationCache("Do not cache artifacts") - dependsOn("shadowJar") - - doFirst { - copy { - from(rootDir.resolve("build/libs")) - .include("$outputProjectName.jar") - into(rootDir.resolve("build/MinecraftServer/plugins")) - } - } -} - -detekt { - autoCorrect = true - buildUponDefaultConfig = true - config.setFrom("$projectDir/config/detekt.yml") -} - -tasks.register("testPlugin") { - notCompatibleWithConfigurationCache("Do not cache artifacts") - dependsOn("buildPlugin") - jarUrl.set(LaunchMinecraftServerTask.JarUrl.Paper(buildPaperVersion)) - agreeEula.set(true) -} - -val gitHash: String by lazy { - providers - .exec { commandLine("git", "rev-parse", "--short", "HEAD") } - .standardOutput - .asText - .map { it.trim() } - .get() -} -val supported = paperVersions - .split(",") - .map { it.trim() } - -tasks.withType { - notCompatibleWithConfigurationCache("Do not cache artifacts") -} - -private fun extractChangelog(content: String): String { - val lines = content.split("\n") - var skip = true - - if (lines.size == 1) { - return content - } - - for (i in lines.indices) { - if (!lines[i].startsWith("## ")) { - continue - } - - if (skip) { - skip = false - continue - } - - return lines - .subList(0, i) - .joinToString("\n") - .trim() - } - - return content -} - -hangarPublish { - publications.register("WaystonesRelease") { - version = pluginVersion - id = "waystones" - channel = "Release" - changelog = file("CHANGELOG.md") - .readText() - .let(::extractChangelog) - apiKey = System.getenv("HANGAR_API_TOKEN") - - platforms { - paper { - jar = tasks.shadowJar.flatMap { it.archiveFile } - platformVersions = supported - } - } - } - - publications.register("WaystonesSnapshot") { - version = "$pluginVersion-SNAPSHOT+$gitHash" - id = "waystones" - channel = "Snapshot" - changelog = "${project.name.capitalized()} Dev Snapshot [$gitHash]" - apiKey = System.getenv("HANGAR_API_TOKEN") - - platforms { - paper { - jar = tasks.shadowJar.flatMap { it.archiveFile } - platformVersions = supported - } - } - } -} - -tasks.modrinth { - notCompatibleWithConfigurationCache("Do not cache artifacts") -} - -modrinth { - val channel = System - .getenv("MODRINTH_PUBLISH_CHANNEL") - ?: "alpha" - - when (channel) { - "release" -> { - versionNumber = pluginVersion - changelog = file("CHANGELOG.md") - .readText() - .let(::extractChangelog) - } - - else -> { - versionNumber = "$pluginVersion-SNAPSHOT+$gitHash" - changelog = "${project.name.capitalized()} Dev Snapshot [$gitHash]" - } - } - // Common values - token = System.getenv("MODRINTH_TOKEN") - projectId = "atri-waystones" - versionName = "${project.name.capitalized()} $pluginVersion" - uploadFile.set(tasks.shadowJar) - gameVersions = supported - loaders = listOf("paper") - versionType = channel -} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 8a3dec5..996cb52 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,14 +4,7 @@ org.gradle.jvmargs=-Xmx4098m version=2.2.0 # x-release-please-end -bstatsVersion=3.1.0 buildPaperVersion=26.1.2 pluginApiVersion=26.1 paperVersions=26.1 -pluginWebsite=https://github.com/AtriusX/Waystones -kotlinVersion=2.3.0 -koinVersion=4.2.1 -arrowVersion=2.1.2 -flywayVersion=11.10.5 -sqliteVersion=3.50.3.0 -mysqlVersion=9.4.0 \ No newline at end of file +pluginWebsite=https://github.com/AtriusX/Waystones \ No newline at end of file From 676f9ad461819b969c7a62547e6ed44a4dcacded Mon Sep 17 00:00:00 2001 From: Atrius Date: Sun, 17 May 2026 02:40:59 -0400 Subject: [PATCH 4/5] build: Extract shared utilities and simplify convention plugins --- build.gradle.kts | 2 +- buildSrc/src/main/kotlin/BuildUtils.kt | 69 +++++++++++++++++++ .../kotlin/waystones.build-config.gradle.kts | 2 +- .../main/kotlin/waystones.detekt.gradle.kts | 6 +- .../main/kotlin/waystones.flyway.gradle.kts | 6 +- .../waystones.hangar-publish.gradle.kts | 38 +--------- .../waystones.minecraft-server.gradle.kts | 4 -- .../waystones.modrinth-publish.gradle.kts | 40 +---------- .../waystones.resource-processing.gradle.kts | 16 ++--- .../main/kotlin/waystones.shadow.gradle.kts | 4 -- 10 files changed, 88 insertions(+), 99 deletions(-) create mode 100644 buildSrc/src/main/kotlin/BuildUtils.kt diff --git a/build.gradle.kts b/build.gradle.kts index cb3b83d..65f9511 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ plugins { } dependencies { - compileOnly("io.papermc.paper:paper-api:${project.properties["buildPaperVersion"]}.build.+") + compileOnly("io.papermc.paper:paper-api:$buildPaperVersion.build.+") implementation(libs.kotlin.stdlib) implementation(libs.koin.core) implementation(libs.koin.annotations) diff --git a/buildSrc/src/main/kotlin/BuildUtils.kt b/buildSrc/src/main/kotlin/BuildUtils.kt new file mode 100644 index 0000000..931bbd4 --- /dev/null +++ b/buildSrc/src/main/kotlin/BuildUtils.kt @@ -0,0 +1,69 @@ +import org.gradle.api.Project +import org.gradle.api.provider.Provider +import org.gradle.api.tasks.TaskContainer + +fun String.capitalized(): String = replaceFirstChar { + when (it.isLowerCase()) { + true -> it.titlecase() + else -> it.toString() + } +} + +fun extractChangelog(content: String): String { + val lines = content.split("\n") + var skip = true + + if (lines.size == 1) { + return content + } + + for (i in lines.indices) { + if (!lines[i].startsWith("## ")) { + continue + } + + if (skip) { + skip = false; + continue + } + + return lines + .subList(0, i) + .joinToString("\n") + .trim() + } + + return content +} + +val Project.buildPaperVersion: String + get() = project.properties["buildPaperVersion"] as String + +val Project.paperVersions: String + get() = project.properties["paperVersions"] as String + +val Project.pluginVersion: String + get() = "${project.version}-$buildPaperVersion" + +val Project.outputProjectName: String + get() = "${project.name}-$pluginVersion" + +val Project.supportedVersions: List + get() = paperVersions + .split(",") + .map { it.trim() } + +val Project.gitHash: Provider + get() = providers + .exec { commandLine("git", "rev-parse", "--short", "HEAD") } + .standardOutput + .asText + .map { it.trim() } + +fun TaskContainer.disableConfigurationCache(vararg taskNames: String) { + taskNames.forEach { name -> + named(name) { + notCompatibleWithConfigurationCache("Plugin does not handle configuration cache well") + } + } +} diff --git a/buildSrc/src/main/kotlin/waystones.build-config.gradle.kts b/buildSrc/src/main/kotlin/waystones.build-config.gradle.kts index ba999b0..5fb2b38 100644 --- a/buildSrc/src/main/kotlin/waystones.build-config.gradle.kts +++ b/buildSrc/src/main/kotlin/waystones.build-config.gradle.kts @@ -5,7 +5,7 @@ plugins { id("com.github.gmazzo.buildconfig") } -val libs = the() +val libs = extensions.getByName("libs") buildConfig { generateAtSync = true diff --git a/buildSrc/src/main/kotlin/waystones.detekt.gradle.kts b/buildSrc/src/main/kotlin/waystones.detekt.gradle.kts index 6bc19ca..1605254 100644 --- a/buildSrc/src/main/kotlin/waystones.detekt.gradle.kts +++ b/buildSrc/src/main/kotlin/waystones.detekt.gradle.kts @@ -1,10 +1,14 @@ +import org.gradle.accessors.dm.LibrariesForLibs + plugins { id("waystones.base") id("dev.detekt") } +val libs = the() + dependencies { - detektPlugins("dev.detekt:detekt-rules-ktlint-wrapper:2.0.0-alpha.2") + detektPlugins(libs.detekt.ktlint) } detekt { diff --git a/buildSrc/src/main/kotlin/waystones.flyway.gradle.kts b/buildSrc/src/main/kotlin/waystones.flyway.gradle.kts index 1a1ae22..d0325af 100644 --- a/buildSrc/src/main/kotlin/waystones.flyway.gradle.kts +++ b/buildSrc/src/main/kotlin/waystones.flyway.gradle.kts @@ -14,8 +14,4 @@ flyway { cleanDisabled = false } -listOf("flywayClean", "flywayValidate", "flywayMigrate").forEach { taskName -> - tasks.named(taskName) { - notCompatibleWithConfigurationCache("Plugin does not handle configuration cache well") - } -} +tasks.disableConfigurationCache("flywayClean", "flywayValidate", "flywayMigrate") diff --git a/buildSrc/src/main/kotlin/waystones.hangar-publish.gradle.kts b/buildSrc/src/main/kotlin/waystones.hangar-publish.gradle.kts index 8a4791c..d38fa00 100644 --- a/buildSrc/src/main/kotlin/waystones.hangar-publish.gradle.kts +++ b/buildSrc/src/main/kotlin/waystones.hangar-publish.gradle.kts @@ -6,38 +6,6 @@ plugins { id("io.papermc.hangar-publish-plugin") } -fun String.capitalized(): String = - replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() } - -fun extractChangelog(content: String): String { - val lines = content.split("\n") - var skip = true - if (lines.size == 1) return content - for (i in lines.indices) { - if (!lines[i].startsWith("## ")) continue - if (skip) { skip = false; continue } - return lines.subList(0, i).joinToString("\n").trim() - } - return content -} - -val buildPaperVersion: String by project -val paperVersions: String by project -val pluginVersion = "${project.version}-$buildPaperVersion" - -val gitHash: String by lazy { - providers - .exec { commandLine("git", "rev-parse", "--short", "HEAD") } - .standardOutput - .asText - .map { it.trim() } - .get() -} - -val supported = paperVersions - .split(",") - .map { it.trim() } - tasks.withType { notCompatibleWithConfigurationCache("Do not cache artifacts") } @@ -55,7 +23,7 @@ hangarPublish { platforms { paper { jar = tasks.shadowJar.flatMap { it.archiveFile } - platformVersions = supported + platformVersions = supportedVersions } } } @@ -64,13 +32,13 @@ hangarPublish { version = "$pluginVersion-SNAPSHOT+$gitHash" id = "waystones" channel = "Snapshot" - changelog = "${project.name.capitalized()} Dev Snapshot [$gitHash]" + changelog = "${project.name.capitalized()} Dev Snapshot [$gitHash.get()]" apiKey = System.getenv("HANGAR_API_TOKEN") platforms { paper { jar = tasks.shadowJar.flatMap { it.archiveFile } - platformVersions = supported + platformVersions = supportedVersions } } } diff --git a/buildSrc/src/main/kotlin/waystones.minecraft-server.gradle.kts b/buildSrc/src/main/kotlin/waystones.minecraft-server.gradle.kts index e8cb43d..b991a2d 100644 --- a/buildSrc/src/main/kotlin/waystones.minecraft-server.gradle.kts +++ b/buildSrc/src/main/kotlin/waystones.minecraft-server.gradle.kts @@ -6,10 +6,6 @@ plugins { id("dev.s7a.gradle.minecraft.server") } -val buildPaperVersion: String by project -val pluginVersion = "${project.version}-$buildPaperVersion" -val outputProjectName = "${project.name}-$pluginVersion" - tasks.build { delete( "build/MinecraftServer/plugins/waystones", diff --git a/buildSrc/src/main/kotlin/waystones.modrinth-publish.gradle.kts b/buildSrc/src/main/kotlin/waystones.modrinth-publish.gradle.kts index a92dfa2..f10e20e 100644 --- a/buildSrc/src/main/kotlin/waystones.modrinth-publish.gradle.kts +++ b/buildSrc/src/main/kotlin/waystones.modrinth-publish.gradle.kts @@ -4,41 +4,7 @@ plugins { id("com.modrinth.minotaur") } -fun String.capitalized(): String = - replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() } - -fun extractChangelog(content: String): String { - val lines = content.split("\n") - var skip = true - if (lines.size == 1) return content - for (i in lines.indices) { - if (!lines[i].startsWith("## ")) continue - if (skip) { skip = false; continue } - return lines.subList(0, i).joinToString("\n").trim() - } - return content -} - -val buildPaperVersion: String by project -val paperVersions: String by project -val pluginVersion = "${project.version}-$buildPaperVersion" - -val gitHash: String by lazy { - providers - .exec { commandLine("git", "rev-parse", "--short", "HEAD") } - .standardOutput - .asText - .map { it.trim() } - .get() -} - -val supported = paperVersions - .split(",") - .map { it.trim() } - -val channel = System - .getenv("MODRINTH_PUBLISH_CHANNEL") - ?: "alpha" +val channel = System.getenv("MODRINTH_PUBLISH_CHANNEL") ?: "alpha" modrinth { when (channel) { @@ -50,14 +16,14 @@ modrinth { } else -> { versionNumber = "$pluginVersion-SNAPSHOT+$gitHash" - changelog = "${project.name.capitalized()} Dev Snapshot [$gitHash]" + changelog = "${project.name.capitalized()} Dev Snapshot [$gitHash.get()]" } } token = System.getenv("MODRINTH_TOKEN") projectId = "atri-waystones" versionName = "${project.name.capitalized()} $pluginVersion" uploadFile.set(tasks.shadowJar) - gameVersions = supported + gameVersions = supportedVersions loaders = listOf("paper") versionType = channel } diff --git a/buildSrc/src/main/kotlin/waystones.resource-processing.gradle.kts b/buildSrc/src/main/kotlin/waystones.resource-processing.gradle.kts index 416c46b..0829aaa 100644 --- a/buildSrc/src/main/kotlin/waystones.resource-processing.gradle.kts +++ b/buildSrc/src/main/kotlin/waystones.resource-processing.gradle.kts @@ -3,19 +3,13 @@ plugins { } tasks.processResources { - val version = providers.gradleProperty("version") - val buildPaperVersionProp = providers.gradleProperty("buildPaperVersion") - val pluginApiVersion = providers.gradleProperty("pluginApiVersion") - val paperVersionsProp = providers.gradleProperty("paperVersions") - val pluginWebsite = providers.gradleProperty("pluginWebsite") - filesMatching("paper-plugin.yml") { expand( - "version" to version.get(), - "buildPaperVersion" to buildPaperVersionProp.get(), - "pluginApiVersion" to pluginApiVersion.get(), - "paperVersions" to paperVersionsProp.get(), - "pluginWebsite" to pluginWebsite.get(), + "version" to providers.gradleProperty("version").get(), + "buildPaperVersion" to providers.gradleProperty("buildPaperVersion").get(), + "pluginApiVersion" to providers.gradleProperty("pluginApiVersion").get(), + "paperVersions" to providers.gradleProperty("paperVersions").get(), + "pluginWebsite" to providers.gradleProperty("pluginWebsite").get(), ) } } diff --git a/buildSrc/src/main/kotlin/waystones.shadow.gradle.kts b/buildSrc/src/main/kotlin/waystones.shadow.gradle.kts index 057c1b3..f415977 100644 --- a/buildSrc/src/main/kotlin/waystones.shadow.gradle.kts +++ b/buildSrc/src/main/kotlin/waystones.shadow.gradle.kts @@ -3,10 +3,6 @@ plugins { id("com.gradleup.shadow") } -val buildPaperVersion: String by project - -val pluginVersion = "${project.version}-$buildPaperVersion" - tasks.shadowJar { minimize { exclude(dependency("org.flywaydb:flyway-mysql:.*")) From 2358b73770c28f17c3c8811761e0437a3a6041e7 Mon Sep 17 00:00:00 2001 From: Atrius Date: Sun, 17 May 2026 04:02:59 -0400 Subject: [PATCH 5/5] build: Fix configuration cache issue in resource processing --- .../waystones.resource-processing.gradle.kts | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/buildSrc/src/main/kotlin/waystones.resource-processing.gradle.kts b/buildSrc/src/main/kotlin/waystones.resource-processing.gradle.kts index 0829aaa..19ca926 100644 --- a/buildSrc/src/main/kotlin/waystones.resource-processing.gradle.kts +++ b/buildSrc/src/main/kotlin/waystones.resource-processing.gradle.kts @@ -2,14 +2,26 @@ plugins { id("waystones.base") } +val versionProp = providers.gradleProperty("version") +val buildPaperVersionProp = providers.gradleProperty("buildPaperVersion") +val pluginApiVersionProp = providers.gradleProperty("pluginApiVersion") +val paperVersionsProp = providers.gradleProperty("paperVersions") +val pluginWebsiteProp = providers.gradleProperty("pluginWebsite") + tasks.processResources { + val version = versionProp.get() + val buildPaperVersion = buildPaperVersionProp.get() + val pluginApiVersion = pluginApiVersionProp.get() + val paperVersions = paperVersionsProp.get() + val pluginWebsite = pluginWebsiteProp.get() + filesMatching("paper-plugin.yml") { expand( - "version" to providers.gradleProperty("version").get(), - "buildPaperVersion" to providers.gradleProperty("buildPaperVersion").get(), - "pluginApiVersion" to providers.gradleProperty("pluginApiVersion").get(), - "paperVersions" to providers.gradleProperty("paperVersions").get(), - "pluginWebsite" to providers.gradleProperty("pluginWebsite").get(), + "version" to version, + "buildPaperVersion" to buildPaperVersion, + "pluginApiVersion" to pluginApiVersion, + "paperVersions" to paperVersions, + "pluginWebsite" to pluginWebsite, ) } }