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..17a2273a 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -1,17 +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` -} - -tasks.withType { - options.release.set(21) - options.encoding = "UTF-8" + 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") } dependencies { @@ -25,70 +25,10 @@ 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 { - 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) -} - -@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.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-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..2b1473fd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,64 +1,14 @@ -import com.github.spotbugs.snom.SpotBugsExtension -import com.github.spotbugs.snom.SpotBugsTask - plugins { java 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..a974e47e 100644 --- a/plugin/build.gradle +++ b/plugin/build.gradle @@ -8,13 +8,16 @@ buildscript() { } plugins() { - id("java") + alias(libs.plugins.gradle.licenser) alias(libs.plugins.gradle.shadow) -} - -compileJava() { - getOptions().getRelease().set(21) - getOptions().setEncoding("UTF-8") + alias(libs.plugins.gradle.spotbugs) + 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") } 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() diff --git a/settings.gradle.kts b/settings.gradle.kts index 0e35a202..ebb6e5ea 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,3 +1,7 @@ +pluginManagement { + includeBuild("build-logic") +} + dependencyResolutionManagement { repositories { mavenCentral()