From fd609a976b353377062fb3afdee57bcb2cfeee58 Mon Sep 17 00:00:00 2001 From: Roman Makeev Date: Sat, 28 Mar 2026 13:42:36 +0300 Subject: [PATCH 1/3] add build-convention --- .gitignore | 1 + api/build.gradle.kts | 30 +++---- build-logic/convention/build.gradle.kts | 40 +++++++++ .../plugin/CheckstyleConfigurationPlugin.kt | 21 +++++ .../gradle/plugin/JavaVersionPlugin.kt | 20 +++++ .../plugin/LicenceConfigurationPlugin.kt | 41 +++++++++ .../gradle/plugin/ModuleInfoPlugin.kt | 11 +++ .../plugin/SpotBugsConfigurationPlugin.kt | 30 +++++++ .../CurrentRevisionExtensionProvider.kt | 21 +++++ .../plugin/revision/CurrentRevisionPlugin.kt | 14 +++ .../src/main/kotlin/versionCatalog.kt | 9 ++ build-logic/gradle/wrapper | 1 + build-logic/settings.gradle.kts | 25 ++++++ build.gradle.kts | 59 ++----------- gradle/libs.versions.toml | 2 + plugin/build.gradle | 87 ++++++++++++------- settings.gradle.kts | 6 +- 17 files changed, 314 insertions(+), 104 deletions(-) create mode 100644 build-logic/convention/build.gradle.kts create mode 100644 build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/CheckstyleConfigurationPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/JavaVersionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/LicenceConfigurationPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/ModuleInfoPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/SpotBugsConfigurationPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/revision/CurrentRevisionExtensionProvider.kt create mode 100644 build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/revision/CurrentRevisionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/versionCatalog.kt create mode 120000 build-logic/gradle/wrapper create mode 100644 build-logic/settings.gradle.kts diff --git a/.gitignore b/.gitignore index a8e27a8a..3e9afaf4 100644 --- a/.gitignore +++ b/.gitignore @@ -85,6 +85,7 @@ $RECYCLE.BIN/ # Gradle .gradle +.kotlin build/ # Gradle Patch diff --git a/api/build.gradle.kts b/api/build.gradle.kts index 3fa5e45f..20621a60 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -7,11 +7,14 @@ import org.gradle.kotlin.dsl.closureOf plugins { `java-library` `maven-publish` -} - -tasks.withType { - options.release.set(21) - options.encoding = "UTF-8" + alias(libs.plugins.gradle.spotbugs) + alias(libs.plugins.gradle.licenser) + id("net.elytrium.java.version") + id("net.elytrium.module.info") + id("net.elytrium.revision") + id("net.elytrium.spotbugs") + id("net.elytrium.checkstyle") + id("net.elytrium.licence") } dependencies { @@ -25,16 +28,6 @@ dependencies { compileOnly(libs.tool.spotbugs.annotations) } -extensions.configure { - matching( - "**/mcprotocollib/**", - closureOf { - setHeader(rootProject.file("HEADER_MCPROTOCOLLIB.txt")) - } - ) - setHeader(file("HEADER.txt")) -} - tasks.named("javadoc") { options.encoding = "UTF-8" (options as? StandardJavadocDocletOptions)?.apply { @@ -82,13 +75,10 @@ artifacts { archives(sourcesJar) } -@Suppress("UNCHECKED_CAST") -val getCurrentShortRevision = rootProject.extra["getCurrentShortRevision"] as () -> String - - val versionStringProvider = provider { if (version.toString().contains("-")) { - "${version} (git-${getCurrentShortRevision()})" + val currentShortRevision = currentShortRevisionProvider.getCurrentShortRevision() + "${version} (git-${currentShortRevision})" } else { version.toString() } diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts new file mode 100644 index 00000000..1e5f0aed --- /dev/null +++ b/build-logic/convention/build.gradle.kts @@ -0,0 +1,40 @@ +plugins { + `kotlin-dsl` + id("java-gradle-plugin") +} + +dependencies { + implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location)) + implementation(libs.gradle.spotbugs) + implementation(libs.gradle.licenser) +} + +gradlePlugin { + plugins { + create("net.elytrium.java.version") { + id = name + implementationClass = "net.elytrium.gradle.plugin.JavaVersionPlugin" + } + + create("net.elytrium.module.info") { + id = name + implementationClass = "net.elytrium.gradle.plugin.ModuleInfoPlugin" + } + create("net.elytrium.revision") { + id = name + implementationClass = "net.elytrium.gradle.plugin.revision.CurrentRevisionPlugin" + } + create("net.elytrium.spotbugs") { + id = name + implementationClass = "net.elytrium.gradle.plugin.SpotBugsConfigurationPlugin" + } + create("net.elytrium.checkstyle") { + id = name + implementationClass = "net.elytrium.gradle.plugin.CheckstyleConfigurationPlugin" + } + create("net.elytrium.licence") { + id = name + implementationClass = "net.elytrium.gradle.plugin.LicenceConfigurationPlugin" + } + } +} diff --git a/build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/CheckstyleConfigurationPlugin.kt b/build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/CheckstyleConfigurationPlugin.kt new file mode 100644 index 00000000..758100d9 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/CheckstyleConfigurationPlugin.kt @@ -0,0 +1,21 @@ +package net.elytrium.gradle.plugin + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.plugins.quality.CheckstyleExtension +import org.gradle.kotlin.dsl.configure + +class CheckstyleConfigurationPlugin : Plugin { + override fun apply(target: Project) { + target.plugins.apply("checkstyle") + target.pluginManager.withPlugin("checkstyle") { + target.configure { + toolVersion = "10.12.1" + configFile = target.file("${target.rootDir}/config/checkstyle/checkstyle.xml") + configProperties = mapOf("configDirectory" to "${target.rootDir}/config/checkstyle") + maxErrors = 0 + maxWarnings = 0 + } + } + } +} \ No newline at end of file diff --git a/build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/JavaVersionPlugin.kt b/build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/JavaVersionPlugin.kt new file mode 100644 index 00000000..ff86fb98 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/JavaVersionPlugin.kt @@ -0,0 +1,20 @@ +package net.elytrium.gradle.plugin + +import org.gradle.api.JavaVersion +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.tasks.compile.JavaCompile +import org.gradle.kotlin.dsl.withType + +class JavaVersionPlugin : Plugin { + override fun apply(target: Project) { + target.pluginManager.withPlugin("java") { + target.tasks.withType { + sourceCompatibility = JavaVersion.VERSION_21.toString() + targetCompatibility = JavaVersion.VERSION_21.toString() + options.release.set(21) + options.encoding = "UTF-8" + } + } + } +} \ No newline at end of file diff --git a/build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/LicenceConfigurationPlugin.kt b/build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/LicenceConfigurationPlugin.kt new file mode 100644 index 00000000..c15c0aea --- /dev/null +++ b/build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/LicenceConfigurationPlugin.kt @@ -0,0 +1,41 @@ +package net.elytrium.gradle.plugin + +import net.minecraftforge.licenser.LicenseExtension +import net.minecraftforge.licenser.LicenseProperties +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.closureOf +import org.gradle.kotlin.dsl.configure +import java.io.File + +class LicenceConfigurationPlugin : Plugin { + + private fun getHeaderFile(target: Project): File { + return target.file("HEADER.txt") + .takeIf(File::exists) + ?: target.rootProject.file("HEADER.txt") + } + + override fun apply(target: Project) { + target.pluginManager.withPlugin("net.minecraftforge.licenser") { + target.extensions.configure { + mapOf( + "**/mcprotocollib/**" to "HEADER_MCPROTOCOLLIB.txt", + "**/LoginListener.java" to "HEADER_MIXED.txt", + "**/KickListener.java" to "HEADER_MIXED.txt", + "**/LoginTasksQueue.java" to "HEADER_MIXED.txt", + "**/MinecraftLimitedCompressDecoder.java" to "HEADER_MIXED.txt" + ).forEach { (pattern, licenceFile) -> + matching( + pattern, + closureOf { + setHeader(target.rootProject.file(licenceFile)) + } + ) + } + setHeader(getHeaderFile(target)) + } + + } + } +} \ No newline at end of file diff --git a/build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/ModuleInfoPlugin.kt b/build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/ModuleInfoPlugin.kt new file mode 100644 index 00000000..96a084d4 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/ModuleInfoPlugin.kt @@ -0,0 +1,11 @@ +package net.elytrium.gradle.plugin + +import org.gradle.api.Plugin +import org.gradle.api.Project + +class ModuleInfoPlugin : Plugin { + override fun apply(target: Project) { + target.version = "1.1.27-SNAPSHOT" + target.group = "net.elytrium.limboapi" + } +} \ No newline at end of file diff --git a/build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/SpotBugsConfigurationPlugin.kt b/build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/SpotBugsConfigurationPlugin.kt new file mode 100644 index 00000000..43671de7 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/SpotBugsConfigurationPlugin.kt @@ -0,0 +1,30 @@ +package net.elytrium.gradle.plugin + +import com.github.spotbugs.snom.SpotBugsExtension +import com.github.spotbugs.snom.SpotBugsTask +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.withType + +class SpotBugsConfigurationPlugin : Plugin { + override fun apply(target: Project) { + target.plugins.apply("com.github.spotbugs") + + target.pluginManager.withPlugin("com.github.spotbugs") { + target.extensions.configure { + val suppressionsFile = target.file("${target.rootDir}/config/spotbugs/suppressions.xml") + excludeFilter.set(suppressionsFile) + } + + target.tasks.withType { + reports.create("html") { + required.set(true) + val outputFile = target.layout.buildDirectory.file("reports/spotbugs/main/spotbugs.html") + outputLocation.set(outputFile) + setStylesheet("fancy-hist.xsl") + } + } + } + } +} \ No newline at end of file diff --git a/build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/revision/CurrentRevisionExtensionProvider.kt b/build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/revision/CurrentRevisionExtensionProvider.kt new file mode 100644 index 00000000..79c71c0a --- /dev/null +++ b/build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/revision/CurrentRevisionExtensionProvider.kt @@ -0,0 +1,21 @@ +package net.elytrium.gradle.plugin.revision + +open class CurrentRevisionExtensionProvider { + fun getCurrentShortRevision(): String { + val isWindows = System.getProperty("os.name") + .lowercase() + .contains("win") + + val process = if (isWindows) { + ProcessBuilder("cmd", "/c", "git rev-parse --short HEAD") + } else { + ProcessBuilder("bash", "-c", "git rev-parse --short HEAD") + } + return process + .start() + .inputStream + .bufferedReader() + .readText() + .trim() + } +} \ No newline at end of file diff --git a/build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/revision/CurrentRevisionPlugin.kt b/build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/revision/CurrentRevisionPlugin.kt new file mode 100644 index 00000000..d14922ba --- /dev/null +++ b/build-logic/convention/src/main/kotlin/net/elytrium/gradle/plugin/revision/CurrentRevisionPlugin.kt @@ -0,0 +1,14 @@ +package net.elytrium.gradle.plugin.revision + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.create + +class CurrentRevisionPlugin : Plugin { + override fun apply(target: Project) { + target.extensions.create( + "currentShortRevisionProvider", + CurrentRevisionExtensionProvider::class + ) + } +} \ No newline at end of file diff --git a/build-logic/convention/src/main/kotlin/versionCatalog.kt b/build-logic/convention/src/main/kotlin/versionCatalog.kt new file mode 100644 index 00000000..e1b801ef --- /dev/null +++ b/build-logic/convention/src/main/kotlin/versionCatalog.kt @@ -0,0 +1,9 @@ +@file:Suppress("Filename") + +import org.gradle.accessors.dm.LibrariesForLibs +import org.gradle.api.Project +import org.gradle.kotlin.dsl.the + +// Workaround for https://github.com/gradle/gradle/issues/15383 +val Project.libs: LibrariesForLibs + get() = the() diff --git a/build-logic/gradle/wrapper b/build-logic/gradle/wrapper new file mode 120000 index 00000000..3232fe4e --- /dev/null +++ b/build-logic/gradle/wrapper @@ -0,0 +1 @@ +../../gradle/wrapper \ No newline at end of file diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts new file mode 100644 index 00000000..af555017 --- /dev/null +++ b/build-logic/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + repositories { + gradlePluginPortal() + mavenCentral() + google() + } +} + +dependencyResolutionManagement { + repositories { + gradlePluginPortal() + mavenCentral() + google() + } + + versionCatalogs { + create("libs") { + from(files("../gradle/libs.versions.toml")) + } + } +} + +rootProject.name = "build-logic" + +include(":convention") diff --git a/build.gradle.kts b/build.gradle.kts index 5d45062c..169b6eb5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,59 +6,12 @@ plugins { checkstyle alias(libs.plugins.gradle.spotbugs) apply false alias(libs.plugins.gradle.licenser) apply false + id("net.elytrium.java.version") apply false + id("net.elytrium.module.info") apply false + id("net.elytrium.revision") apply false + id("net.elytrium.spotbugs") apply false + id("net.elytrium.checkstyle") apply false + id("net.elytrium.licence") apply false } -allprojects { - apply(plugin = "checkstyle") - apply(plugin = "com.github.spotbugs") - apply(plugin = "net.minecraftforge.licenser") - group = "net.elytrium.limboapi" - version = "1.1.27-SNAPSHOT" - - tasks.withType { - sourceCompatibility = JavaVersion.VERSION_21.toString() - targetCompatibility = JavaVersion.VERSION_21.toString() - } - - checkstyle { - toolVersion = "10.12.1" - configFile = file("$rootDir/config/checkstyle/checkstyle.xml") - configProperties = mapOf("configDirectory" to "$rootDir/config/checkstyle") - maxErrors = 0 - maxWarnings = 0 - } - - extensions.configure { - excludeFilter.set(file("${rootDir}/config/spotbugs/suppressions.xml")) - } - - tasks.withType() { - reports.create("html") { - required.set(true) - outputLocation.set(layout.buildDirectory.file("reports/spotbugs/main/spotbugs.html")) - setStylesheet("fancy-hist.xsl") - } - } -} - -fun getCurrentShortRevision(): String { - val isWindows = System.getProperty("os.name") - .lowercase() - .contains("win") - - val process = if (isWindows) { - ProcessBuilder("cmd", "/c", "git rev-parse --short HEAD") - } else { - ProcessBuilder("bash", "-c", "git rev-parse --short HEAD") - } - return process - .start() - .inputStream - .bufferedReader() - .readText() - .trim() -} - -// Make the function available to subprojects via extra properties -extra["getCurrentShortRevision"] = ::getCurrentShortRevision diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0ae75e77..694e1421 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -30,6 +30,8 @@ tool-google-guava = { module = "com.google.guava:guava", version.ref = "tool-goo tool-netty-codec = { module = "io.netty:netty-codec", version.ref = "tool-netty" } tool-netty-handler = { module = "io.netty:netty-handler", version.ref = "tool-netty" } tool-spotbugs-annotations = { module = "com.github.spotbugs:spotbugs-annotations", version.ref = "tool-spotbugs-annotations" } +gradle-spotbugs = { module = "com.github.spotbugs:com.github.spotbugs.gradle.plugin", version.ref = "gradle-spotbugs" } +gradle-licenser = { module = "net.minecraftforge.licenser:net.minecraftforge.licenser.gradle.plugin", version.ref = "gradle-licenser" } [plugins] gradle-licenser = { id = "net.minecraftforge.licenser", version.ref = "gradle-licenser" } diff --git a/plugin/build.gradle b/plugin/build.gradle index e6801031..3b607c8d 100644 --- a/plugin/build.gradle +++ b/plugin/build.gradle @@ -10,11 +10,14 @@ buildscript() { plugins() { id("java") alias(libs.plugins.gradle.shadow) -} - -compileJava() { - getOptions().getRelease().set(21) - getOptions().setEncoding("UTF-8") + alias(libs.plugins.gradle.spotbugs) + alias(libs.plugins.gradle.licenser) + id("net.elytrium.java.version") + id("net.elytrium.module.info") + id("net.elytrium.revision") + id("net.elytrium.spotbugs") + id("net.elytrium.checkstyle") + id("net.elytrium.licence") } dependencies() { @@ -54,30 +57,6 @@ shadowJar() { relocate("net.elytrium.commons.config", "net.elytrium.limboapi.thirdparty.commons.config") } -license() { - matching("**/mcprotocollib/**") { - header = rootProject.file("HEADER_MCPROTOCOLLIB.txt") - } - - matching("**/LoginListener.java") { - header = rootProject.file("HEADER_MIXED.txt") - } - - matching("**/KickListener.java") { - header = rootProject.file("HEADER_MIXED.txt") - } - - matching("**/LoginTasksQueue.java") { - header = rootProject.file("HEADER_MIXED.txt") - } - - matching("**/MinecraftLimitedCompressDecoder.java") { - header = rootProject.file("HEADER_MIXED.txt") - } - - header = rootProject.file("HEADER.txt") -} - tasks.register("finalize") { doLast { file("build/libs/${project.name}-${project.version}.jar").delete() @@ -467,6 +446,11 @@ static Map getBlockMappings(Object data, Map blockReports) { + if (blockReports == null || blockReports.isEmpty()) { + logger.error("generateBlockMappings: blockReports is empty or null, skipping block mappings generation") + return + } + File defaultBlockPropertiesFile = new File(targetDir, "defaultblockproperties.json") File blockStatesFile = new File(targetDir, "blockstates.json") File blockStatesMappingFile = new File(targetDir, "blockstates_mapping.json") @@ -481,6 +465,11 @@ void generateBlockMappings(File targetDir, Map blockRe [version, getDefaultProperties(report)] }) + if (defaultProperties[MinecraftVersion.MAXIMUM_VERSION] == null) { + logger.error("generateBlockMappings: no data for MAXIMUM_VERSION (${MinecraftVersion.MAXIMUM_VERSION}), skipping block mappings generation") + return + } + defaultBlockPropertiesFile.write(JsonOutput.prettyPrint( JsonOutput.toJson(defaultProperties[MinecraftVersion.MAXIMUM_VERSION].sort())), "UTF-8") @@ -495,6 +484,11 @@ void generateBlockMappings(File targetDir, Map blockRe Map blocks = mappings[MinecraftVersion.MAXIMUM_VERSION] + if (blocks == null) { + logger.error("generateBlockMappings: no block mappings for MAXIMUM_VERSION (${MinecraftVersion.MAXIMUM_VERSION}), skipping block mappings generation") + return + } + blockStatesFile.write( JsonOutput.prettyPrint(JsonOutput.toJson( blocks.sort(Map.Entry::getValue) @@ -599,6 +593,11 @@ void generateRegistryMapping(String target, File targetDir, Map registriesReports) { + if (registriesReports == null || registriesReports.isEmpty()) { + logger.error("generateRegistryMappings: registriesReports is empty or null, skipping registry mappings generation") + return + } + this.generateRegistryMapping("item", targetDir, registriesReports .findAll({ e -> MinecraftVersion.WORLD_VERSIONS.contains(e.getKey()) })) this.generateRegistryMapping("block", targetDir, registriesReports) @@ -679,6 +678,11 @@ static Map>> getTags(File tagDir, Map tagDirs) { + if (tagDirs == null || tagDirs.isEmpty()) { + logger.error("generateTags: tagDirs is empty or null, skipping tags generation") + return + } + File tagsFile = new File(targetDir, "tags.json"); if (checkIsCacheValid(tagsFile)) { this.println("> Generating tags...") @@ -728,7 +732,14 @@ tasks.register("generateMappings") { .dropWhile({ it < MinecraftVersion.MINECRAFT_1_13 }) .collect(Collectors.toMap(Function.identity(), this::generateData)) - Map blockReports = generated.collectEntries({ version, directory -> + Map blockReports = generated.findAll({ version, directory -> + File file = new File(directory, "reports/blocks.json") + if (!file.exists()) { + logger.error("Skipping ${version}: file not found: ${file.absolutePath}") + return false + } + return true + }).collectEntries({ version, directory -> [version, new JsonSlurper().parse(new File(directory, "reports/blocks.json"))] }) @@ -736,6 +747,14 @@ tasks.register("generateMappings") { Map registriesReports = generated .findAll({ it.getKey() >= MinecraftVersion.MINECRAFT_1_14 }) + .findAll({ version, directory -> + File file = new File(directory, "reports/registries.json") + if (!file.exists()) { + logger.error("Skipping ${version}: file not found: ${file.absolutePath}") + return false + } + return true + }) .collectEntries({ version, directory -> [version, new JsonSlurper().parse(new File(directory, "reports/registries.json"))] }) @@ -743,6 +762,14 @@ tasks.register("generateMappings") { this.generateRegistryMappings(targetDir, registriesReports) Map tags = generated + .findAll({ version, directory -> + File file = new File(directory, "data/minecraft/tags") + if (!file.exists()) { + logger.error("Skipping ${version}: directory not found: ${file.absolutePath}") + return false + } + return true + }) .collectEntries({ version, directory -> [version, new File(directory, "data/minecraft/tags")] }) diff --git a/settings.gradle.kts b/settings.gradle.kts index 0e35a202..e34f3a9c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,3 +1,7 @@ +pluginManagement { + includeBuild("build-logic") +} + dependencyResolutionManagement { repositories { mavenCentral() @@ -17,4 +21,4 @@ enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") rootProject.name = "limboapi" include("api") -include("plugin") +//include("plugin") From 522b12a85ffa356f888259331ccbc95e276aae51 Mon Sep 17 00:00:00 2001 From: Roman Makeev Date: Sat, 28 Mar 2026 13:55:59 +0300 Subject: [PATCH 2/3] add publish convention --- api/build.gradle.kts | 58 ++----------------- .../kotlin/net.elytrium.publish.gradle.kts | 52 +++++++++++++++++ build.gradle.kts | 3 - plugin/build.gradle | 8 +-- settings.gradle.kts | 2 +- 5 files changed, 61 insertions(+), 62 deletions(-) create mode 100644 build-logic/convention/src/main/kotlin/net.elytrium.publish.gradle.kts diff --git a/api/build.gradle.kts b/api/build.gradle.kts index 20621a60..17a2273a 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -1,20 +1,17 @@ @file:Suppress("GroovyAssignabilityCheck") -import net.minecraftforge.licenser.LicenseExtension -import net.minecraftforge.licenser.LicenseProperties -import org.gradle.kotlin.dsl.closureOf - plugins { `java-library` `maven-publish` - alias(libs.plugins.gradle.spotbugs) alias(libs.plugins.gradle.licenser) + alias(libs.plugins.gradle.spotbugs) + id("net.elytrium.checkstyle") id("net.elytrium.java.version") + id("net.elytrium.licence") id("net.elytrium.module.info") + id("net.elytrium.publish") id("net.elytrium.revision") id("net.elytrium.spotbugs") - id("net.elytrium.checkstyle") - id("net.elytrium.licence") } dependencies { @@ -28,53 +25,6 @@ dependencies { compileOnly(libs.tool.spotbugs.annotations) } -tasks.named("javadoc") { - options.encoding = "UTF-8" - (options as? StandardJavadocDocletOptions)?.apply { - source = "21" - links("https://docs.oracle.com/en/java/javase/11/docs/api/") - addStringOption("Xdoclint:none", "-quiet") - if (JavaVersion.current() >= JavaVersion.VERSION_1_9 && JavaVersion.current() < JavaVersion.VERSION_12) { - addBooleanOption("-no-module-directories", true) - } - } -} - -val sourcesJar by tasks.registering(Jar::class) { - archiveClassifier.set("sources") - from(sourceSets.main.get().allSource) -} - -val javadocJar by tasks.registering(Jar::class) { - archiveClassifier.set("javadoc") - from(tasks.javadoc) -} - -publishing { - repositories { - maven { - credentials { - username = System.getenv("ELYTRIUM_MAVEN_USERNAME") - password = System.getenv("ELYTRIUM_MAVEN_PASSWORD") - } - name = "elytrium-repo" - url = uri("https://maven.elytrium.net/repo/") - } - } - - publications.create("publication") { - from(components["java"]) - - artifact(javadocJar) - artifact(sourcesJar) - } -} - -artifacts { - archives(javadocJar) - archives(sourcesJar) -} - val versionStringProvider = provider { if (version.toString().contains("-")) { val currentShortRevision = currentShortRevisionProvider.getCurrentShortRevision() diff --git a/build-logic/convention/src/main/kotlin/net.elytrium.publish.gradle.kts b/build-logic/convention/src/main/kotlin/net.elytrium.publish.gradle.kts new file mode 100644 index 00000000..59f0f5db --- /dev/null +++ b/build-logic/convention/src/main/kotlin/net.elytrium.publish.gradle.kts @@ -0,0 +1,52 @@ +plugins { + id("java") + id("java-library") + id("maven-publish") +} + +tasks.named("javadoc") { + options.encoding = "UTF-8" + (options as? StandardJavadocDocletOptions)?.apply { + source = "21" + links("https://docs.oracle.com/en/java/javase/11/docs/api/") + addStringOption("Xdoclint:none", "-quiet") + if (JavaVersion.current() >= JavaVersion.VERSION_1_9 && JavaVersion.current() < JavaVersion.VERSION_12) { + addBooleanOption("-no-module-directories", true) + } + } +} + +val sourcesJar by tasks.registering(Jar::class) { + archiveClassifier.set("sources") + from(sourceSets.main.get().allSource) +} + +val javadocJar by tasks.registering(Jar::class) { + archiveClassifier.set("javadoc") + from(tasks.javadoc) +} + +publishing { + repositories { + maven { + credentials { + username = System.getenv("ELYTRIUM_MAVEN_USERNAME") + password = System.getenv("ELYTRIUM_MAVEN_PASSWORD") + } + name = "elytrium-repo" + url = uri("https://maven.elytrium.net/repo/") + } + } + + publications.create("publication") { + from(components["java"]) + + artifact(javadocJar) + artifact(sourcesJar) + } +} + +artifacts { + archives(javadocJar) + archives(sourcesJar) +} \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 169b6eb5..2b1473fd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,3 @@ -import com.github.spotbugs.snom.SpotBugsExtension -import com.github.spotbugs.snom.SpotBugsTask - plugins { java checkstyle diff --git a/plugin/build.gradle b/plugin/build.gradle index 3b607c8d..dd4a2e04 100644 --- a/plugin/build.gradle +++ b/plugin/build.gradle @@ -8,16 +8,16 @@ buildscript() { } plugins() { - id("java") + alias(libs.plugins.gradle.licenser) alias(libs.plugins.gradle.shadow) alias(libs.plugins.gradle.spotbugs) - alias(libs.plugins.gradle.licenser) + id("java") + id("net.elytrium.checkstyle") id("net.elytrium.java.version") + id("net.elytrium.licence") id("net.elytrium.module.info") id("net.elytrium.revision") id("net.elytrium.spotbugs") - id("net.elytrium.checkstyle") - id("net.elytrium.licence") } dependencies() { diff --git a/settings.gradle.kts b/settings.gradle.kts index e34f3a9c..ebb6e5ea 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -21,4 +21,4 @@ enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") rootProject.name = "limboapi" include("api") -//include("plugin") +include("plugin") From 2c33b4eae1e229438ace44e7e5ee099ec171f250 Mon Sep 17 00:00:00 2001 From: Roman Makeev Date: Sat, 28 Mar 2026 14:01:18 +0300 Subject: [PATCH 3/3] revert plugin --- plugin/build.gradle | 50 +-------------------------------------------- 1 file changed, 1 insertion(+), 49 deletions(-) diff --git a/plugin/build.gradle b/plugin/build.gradle index dd4a2e04..a974e47e 100644 --- a/plugin/build.gradle +++ b/plugin/build.gradle @@ -446,11 +446,6 @@ static Map getBlockMappings(Object data, Map blockReports) { - if (blockReports == null || blockReports.isEmpty()) { - logger.error("generateBlockMappings: blockReports is empty or null, skipping block mappings generation") - return - } - File defaultBlockPropertiesFile = new File(targetDir, "defaultblockproperties.json") File blockStatesFile = new File(targetDir, "blockstates.json") File blockStatesMappingFile = new File(targetDir, "blockstates_mapping.json") @@ -465,11 +460,6 @@ void generateBlockMappings(File targetDir, Map blockRe [version, getDefaultProperties(report)] }) - if (defaultProperties[MinecraftVersion.MAXIMUM_VERSION] == null) { - logger.error("generateBlockMappings: no data for MAXIMUM_VERSION (${MinecraftVersion.MAXIMUM_VERSION}), skipping block mappings generation") - return - } - defaultBlockPropertiesFile.write(JsonOutput.prettyPrint( JsonOutput.toJson(defaultProperties[MinecraftVersion.MAXIMUM_VERSION].sort())), "UTF-8") @@ -484,11 +474,6 @@ void generateBlockMappings(File targetDir, Map blockRe Map blocks = mappings[MinecraftVersion.MAXIMUM_VERSION] - if (blocks == null) { - logger.error("generateBlockMappings: no block mappings for MAXIMUM_VERSION (${MinecraftVersion.MAXIMUM_VERSION}), skipping block mappings generation") - return - } - blockStatesFile.write( JsonOutput.prettyPrint(JsonOutput.toJson( blocks.sort(Map.Entry::getValue) @@ -593,11 +578,6 @@ void generateRegistryMapping(String target, File targetDir, Map registriesReports) { - if (registriesReports == null || registriesReports.isEmpty()) { - logger.error("generateRegistryMappings: registriesReports is empty or null, skipping registry mappings generation") - return - } - this.generateRegistryMapping("item", targetDir, registriesReports .findAll({ e -> MinecraftVersion.WORLD_VERSIONS.contains(e.getKey()) })) this.generateRegistryMapping("block", targetDir, registriesReports) @@ -678,11 +658,6 @@ static Map>> getTags(File tagDir, Map tagDirs) { - if (tagDirs == null || tagDirs.isEmpty()) { - logger.error("generateTags: tagDirs is empty or null, skipping tags generation") - return - } - File tagsFile = new File(targetDir, "tags.json"); if (checkIsCacheValid(tagsFile)) { this.println("> Generating tags...") @@ -732,14 +707,7 @@ tasks.register("generateMappings") { .dropWhile({ it < MinecraftVersion.MINECRAFT_1_13 }) .collect(Collectors.toMap(Function.identity(), this::generateData)) - Map blockReports = generated.findAll({ version, directory -> - File file = new File(directory, "reports/blocks.json") - if (!file.exists()) { - logger.error("Skipping ${version}: file not found: ${file.absolutePath}") - return false - } - return true - }).collectEntries({ version, directory -> + Map blockReports = generated.collectEntries({ version, directory -> [version, new JsonSlurper().parse(new File(directory, "reports/blocks.json"))] }) @@ -747,14 +715,6 @@ tasks.register("generateMappings") { Map registriesReports = generated .findAll({ it.getKey() >= MinecraftVersion.MINECRAFT_1_14 }) - .findAll({ version, directory -> - File file = new File(directory, "reports/registries.json") - if (!file.exists()) { - logger.error("Skipping ${version}: file not found: ${file.absolutePath}") - return false - } - return true - }) .collectEntries({ version, directory -> [version, new JsonSlurper().parse(new File(directory, "reports/registries.json"))] }) @@ -762,14 +722,6 @@ tasks.register("generateMappings") { this.generateRegistryMappings(targetDir, registriesReports) Map tags = generated - .findAll({ version, directory -> - File file = new File(directory, "data/minecraft/tags") - if (!file.exists()) { - logger.error("Skipping ${version}: directory not found: ${file.absolutePath}") - return false - } - return true - }) .collectEntries({ version, directory -> [version, new File(directory, "data/minecraft/tags")] })