24 Commits

Author SHA1 Message Date
b040711701 v0.11.0 2023-02-07 18:23:23 -05:00
96ed2ff2bb Remove serialization plugin, which makes us compatible with more Gradle versions. 2023-02-07 18:22:01 -05:00
061a788d93 Fix CodeQL task name. 2023-02-07 10:13:30 -05:00
3c02e23163 Publish GitHub CodeQL from Qodona 2023-02-07 10:09:42 -05:00
1c4217da53 Qodona Workflow 2023-02-07 09:57:48 -05:00
81985013e8 Start work on v0.11.0-SNAPSHOT 2023-02-07 06:41:11 -05:00
55efba22bd v0.10.0 2023-02-07 06:36:41 -05:00
2cb2d8fe89 v0.10.0 2023-02-07 06:34:30 -05:00
b3219afb24 v0.10.0 2023-02-07 06:31:43 -05:00
ac7ec227b0 Gradle Plugin Portal 2023-02-07 06:31:23 -05:00
0ed243e9ae Publish sources JAR and ensure new lines. 2023-02-07 05:57:45 -05:00
34648bdc8c Begin work on 0.10.0-SNAPSHOT 2023-02-05 21:33:03 -08:00
e1e42df67e v0.9.0 2023-02-05 21:32:40 -08:00
dc1ebe09b7 Upgrade Kotlin to 1.8.10 2023-02-05 21:30:50 -08:00
1cd36b5529 Start work on 0.9.0 2023-02-03 13:08:14 -08:00
a06687507c v0.8.0 2023-02-03 13:07:49 -08:00
5d4152d6df Support CONCRETE_BUILD_NUMBER for build number in version. 2023-02-02 20:33:32 -08:00
4c7dea2296 Start on v0.8.0-SNAPSHOT 2023-01-27 22:43:23 -08:00
c3ddcff572 v0.7.0 2023-01-27 22:40:24 -08:00
ee697e2c4f Simple code cleanup. 2023-01-27 22:39:21 -08:00
d304170062 Allocate PaperVersionClient closer to time of use. 2023-01-27 22:31:07 -08:00
0129f761f2 Properly mark task internal methods as internal. 2023-01-27 22:01:48 -08:00
ace5b0ab3e Add support for running a second custom directory as a Minecraft server. 2023-01-27 21:59:40 -08:00
18916bbd22 Start on v0.7.0-SNAPSHOT 2023-01-26 21:48:45 -08:00
19 changed files with 278 additions and 91 deletions

20
.github/workflows/portal.yml vendored Normal file
View File

@ -0,0 +1,20 @@
name: Gradle Plugin Portal
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Publish with Gradle
uses: gradle/gradle-build-action@v2
with:
arguments: "publishPlugins -Pgradle.publish.key=${{ secrets.GRADLE_PLUGIN_PUBLISHING_KEY }} -Pgradle.publish.secret=${{ secrets.GRADLE_PLUGIN_PUBLISHING_SECRET }}"

View File

@ -4,7 +4,7 @@ on:
branches:
- main
jobs:
build:
publish:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository

16
.github/workflows/qodona.yml vendored Normal file
View File

@ -0,0 +1,16 @@
name: Qodona
on: [push]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v3
- name: Qodana Scan
uses: JetBrains/qodana-action@main
env:
QODANA_TOKEN: "${{ secrets.QODANA_TOKEN }}"
- name: Upload CodeQL SARIF
uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: "${{ runner.temp }}/qodana/results/qodana.sarif.json"

View File

@ -1,13 +1,15 @@
@file:Suppress("UnstableApiUsage")
plugins {
`kotlin-dsl`
kotlin("plugin.serialization") version "1.7.10"
id("maven-publish")
id("java-gradle-plugin")
`maven-publish`
`java-gradle-plugin`
id("com.gradle.plugin-publish") version "1.1.0"
}
group = "gay.pizza.foundation"
version = "0.6.0"
version = "0.11.0"
repositories {
mavenCentral()
@ -15,8 +17,8 @@ repositories {
}
dependencies {
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10")
implementation("org.jetbrains.kotlin:kotlin-serialization:1.7.10")
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.10")
implementation("org.jetbrains.kotlin:kotlin-serialization:1.8.10")
implementation("gradle.plugin.com.github.johnrengelman:shadow:7.1.2")
implementation("com.google.code.gson:gson:2.10.1")
@ -25,29 +27,56 @@ dependencies {
}
gradlePlugin {
website.set("https://github.com/GayPizzaSpecifications/concrete")
vcsUrl.set("https://github.com/GayPizzaSpecifications/concrete")
plugins {
create("concrete-root") {
id = "gay.pizza.foundation.concrete-root"
implementationClass = "gay.pizza.foundation.concrete.ConcreteRootPlugin"
displayName = "Concrete Root"
description = "Concrete project root."
}
create("concrete-base") {
id = "gay.pizza.foundation.concrete-base"
implementationClass = "gay.pizza.foundation.concrete.ConcreteBasePlugin"
displayName = "Concrete Base"
description = "Concrete project base."
}
create("concrete-library") {
id = "gay.pizza.foundation.concrete-library"
implementationClass = "gay.pizza.foundation.concrete.ConcreteLibraryPlugin"
displayName = "Concrete Library"
description = "Concrete project library."
}
create("concrete-plugin") {
id = "gay.pizza.foundation.concrete-plugin"
implementationClass = "gay.pizza.foundation.concrete.ConcretePluginPlugin"
displayName = "Concrete Library"
description = "Concrete project plugin."
}
forEach { declaration ->
declaration.tags.set(listOf("foundation-concrete", "minecraft-bukkit"))
}
}
}
val gradlePublishingKey: String? = System.getenv("GRADLE_PLUGIN_PUBLISHING_KEY")
val gradlePublishingSecret: String? = System.getenv("GRADLE_PLUGIN_PUBLISHING_SECRET")
if (gradlePublishingKey != null && gradlePublishingSecret != null) {
project.setProperty("gradle.publish.key", gradlePublishingKey.toString())
project.setProperty("gradle.publish.secret", gradlePublishingSecret.toString())
}
java {
val version = JavaVersion.toVersion("17")
sourceCompatibility = version
@ -100,5 +129,8 @@ publishing {
tasks.withType<Wrapper> {
gradleVersion = "7.6"
distributionType = Wrapper.DistributionType.ALL
}
java {
withSourcesJar()
}

Binary file not shown.

View File

@ -1,5 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

12
gradlew vendored
View File

@ -55,7 +55,7 @@
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
@ -80,10 +80,10 @@ do
esac
done
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
@ -143,12 +143,16 @@ fi
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac

1
gradlew.bat vendored
View File

@ -26,6 +26,7 @@ if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

View File

@ -12,6 +12,8 @@ open class ConcreteBasePlugin : Plugin<Project> {
override fun apply(project: Project) {
val versionWithBuild = if (System.getenv("CI_PIPELINE_IID") != null) {
project.rootProject.version.toString() + ".${System.getenv("CI_PIPELINE_IID")}"
} else if (System.getenv("CONCRETE_BUILD_NUMBER") != null) {
project.rootProject.version.toString() + ".${System.getenv("CONCRETE_BUILD_NUMBER")}"
} else {
"DEV"
}

View File

@ -11,12 +11,16 @@ class ConcretePluginPlugin : ConcreteBaseBukkitPlugin() {
project.plugins.apply("com.github.johnrengelman.shadow")
project.tasks.find<ProcessResources>("processResources")!!.apply {
val props = mapOf("version" to project.version.toString())
inputs.properties(props)
filteringCharset = "UTF-8"
filesMatching("plugin.yml") {
expand(props)
// During IDEA project import, if this code is active, it will print warnings.
// This will make the VERSION field unexpanded if you run using the IntelliJ build system.
if (!project.properties.containsKey("idea.gradle.do.not.build.tasks")) {
project.tasks.find<ProcessResources>("processResources")!!.apply {
val props = mapOf("version" to project.version.toString())
inputs.properties(props)
filteringCharset = "UTF-8"
filesMatching("plugin.yml") {
expand(props)
}
}
}
@ -27,5 +31,7 @@ class ConcretePluginPlugin : ConcreteBaseBukkitPlugin() {
project.tasks.addTaskDependency("assemble", "shadowJar")
project.concreteRootProject.tasks["setupPaperServer"].dependsOn(project.tasks["shadowJar"])
project.concreteRootProject.tasks.find<SetupLocalMinecraftServer>("setupLocalMinecraftServer")
?.dependsOn(project.tasks["shadowJar"])
}
}

View File

@ -4,6 +4,7 @@ import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.create
import java.nio.file.Paths
class ConcreteRootPlugin : Plugin<Project> {
override fun apply(project: Project) {
@ -13,6 +14,21 @@ class ConcreteRootPlugin : Plugin<Project> {
val runPaperServer = project.tasks.create<RunPaperServer>("runPaperServer")
runPaperServer.dependsOn(setupPaperServer)
val maybeLocalServerPathString = project.properties["localMinecraftServerPath"]?.toString()
if (maybeLocalServerPathString != null) {
val localServerJarFileName = project.properties["localMinecraftServerJarFileName"]?.toString() ?: "server.jar"
val currentWorkingDirectory = System.getProperty("user.dir")
val localServerDirectory = Paths.get(currentWorkingDirectory).resolve(maybeLocalServerPathString).toFile()
val setupLocalMinecraftServer = project.tasks.create<SetupLocalMinecraftServer>("setupLocalMinecraftServer")
val runLocalMinecraftServer = project.tasks.create<RunLocalMinecraftServer>("runLocalMinecraftServer")
runLocalMinecraftServer.dependsOn(setupLocalMinecraftServer)
setupLocalMinecraftServer.minecraftServerDirectory = localServerDirectory
runLocalMinecraftServer.minecraftServerDirectory = localServerDirectory
runLocalMinecraftServer.serverJarFileName = localServerJarFileName
}
val updateManifests = project.tasks.create<UpdateManifestTask>("updateManifests")
project.tasks.getByName("assemble").dependsOn(updateManifests)
}

View File

@ -0,0 +1,18 @@
package gay.pizza.foundation.concrete
import org.gradle.api.tasks.Internal
import java.io.File
open class RunLocalMinecraftServer : RunMinecraftServer() {
@Internal
lateinit var minecraftServerDirectory: File
@Internal
lateinit var serverJarFileName: String
@Internal
override fun getServerDirectory(): File = minecraftServerDirectory
@Internal
override fun getServerJarName(): String = serverJarFileName
}

View File

@ -0,0 +1,51 @@
package gay.pizza.foundation.concrete
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskAction
import java.io.File
import java.util.jar.JarFile
abstract class RunMinecraftServer : DefaultTask() {
init {
outputs.upToDateWhen { false }
}
@get:Input
var additionalServerArguments = mutableListOf<String>()
@get:Input
var disableServerGui = true
@TaskAction
fun runMinecraftServer() {
val minecraftServerDirectory = getServerDirectory()
val serverJarFile = minecraftServerDirectory.resolve(getServerJarName())
val mainClassName = readMainClass(serverJarFile)
project.javaexec {
classpath(serverJarFile.absolutePath)
workingDir(minecraftServerDirectory)
val allServerArguments = mutableListOf<String>()
allServerArguments.addAll(additionalServerArguments)
if (disableServerGui) {
allServerArguments.add("nogui")
}
args(allServerArguments)
mainClass.set(mainClassName)
}
}
private fun readMainClass(file: File): String = JarFile(file).use { jar ->
jar.manifest.mainAttributes.getValue("Main-Class")!!
}
@Internal
abstract fun getServerDirectory(): File
@Internal
abstract fun getServerJarName(): String
}

View File

@ -1,47 +1,20 @@
package gay.pizza.foundation.concrete
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.Internal
import org.gradle.kotlin.dsl.getByType
import java.io.File
import java.util.jar.JarFile
open class RunPaperServer : DefaultTask() {
open class RunPaperServer : RunMinecraftServer() {
init {
outputs.upToDateWhen { false }
}
@get:Input
var additionalServerArguments = mutableListOf<String>()
@get:Input
var disableServerGui = true
@TaskAction
fun runPaperServer() {
@Internal
override fun getServerDirectory(): File {
val concrete = project.extensions.getByType<ConcreteExtension>()
val minecraftServerDirectory = project.file(concrete.minecraftServerPath.get())
val paperJarFile = minecraftServerDirectory.resolve("paper.jar")
val mainClassName = readMainClass(paperJarFile)
project.javaexec {
classpath(paperJarFile.absolutePath)
workingDir(minecraftServerDirectory)
val allServerArguments = mutableListOf<String>()
allServerArguments.addAll(additionalServerArguments)
if (disableServerGui) {
allServerArguments.add("nogui")
}
args(allServerArguments)
mainClass.set(mainClassName)
}
return project.file(concrete.minecraftServerPath.get())
}
private fun readMainClass(file: File): String = JarFile(file).use { jar ->
jar.manifest.mainAttributes.getValue("Main-Class")!!
}
@Internal
override fun getServerJarName(): String = "paper.jar"
}

View File

@ -0,0 +1,12 @@
package gay.pizza.foundation.concrete
import org.gradle.api.tasks.Internal
import java.io.File
open class SetupLocalMinecraftServer : SetupMinecraftServer() {
@Internal
lateinit var minecraftServerDirectory: File
@Internal
override fun getServerDirectory(): File = minecraftServerDirectory
}

View File

@ -0,0 +1,49 @@
package gay.pizza.foundation.concrete
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskAction
import org.gradle.kotlin.dsl.getByType
import java.io.File
import java.nio.file.Files
import java.util.*
abstract class SetupMinecraftServer : DefaultTask() {
init {
outputs.upToDateWhen { false }
}
@TaskAction
fun setupMinecraftAction() {
val minecraftServerDirectory = getServerDirectory()
if (!minecraftServerDirectory.exists()) {
minecraftServerDirectory.mkdirs()
}
val serverPluginsDirectory = minecraftServerDirectory.resolve("plugins")
if (!serverPluginsDirectory.exists()) {
serverPluginsDirectory.mkdirs()
}
for (project in project.findPluginProjects()) {
val task = project.shadowJarTask!!
val pluginJarFile = task.outputs.files.first()
val pluginLinkFile = serverPluginsDirectory.resolve("${project.name}.jar")
pluginLinkFile.delete()
Files.createSymbolicLink(pluginLinkFile.toPath(), pluginJarFile.toPath())
}
val concrete = project.extensions.getByType<ConcreteExtension>()
if (concrete.acceptServerEula.isPresent && concrete.acceptServerEula.get()) {
val writer = minecraftServerDirectory.resolve("eula.txt").bufferedWriter()
val properties = Properties()
properties.setProperty("eula", "true")
properties.store(writer, "Written by Concrete")
writer.close()
}
}
@Internal
abstract fun getServerDirectory(): File
}

View File

@ -1,15 +1,13 @@
package gay.pizza.foundation.concrete
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.options.Option
import org.gradle.kotlin.dsl.getByType
import java.io.File
import java.nio.file.Files
import java.util.Properties
open class SetupPaperServer : DefaultTask() {
open class SetupPaperServer : SetupMinecraftServer() {
init {
outputs.upToDateWhen { false }
}
@ -18,46 +16,18 @@ open class SetupPaperServer : DefaultTask() {
@set:Option(option = "update", description = "Update Paper Server")
var shouldUpdatePaperServer = true
private val paperVersionClient = PaperVersionClient()
@TaskAction
fun downloadPaperTask() {
fun setupPaperServer() {
val concrete = project.extensions.getByType<ConcreteExtension>()
val minecraftServerDirectory = project.file(concrete.minecraftServerPath.get())
if (!minecraftServerDirectory.exists()) {
minecraftServerDirectory.mkdirs()
}
val paperJarFile = project.file("${concrete.minecraftServerPath.get()}/paper.jar")
val minecraftServerDirectory = getServerDirectory()
val paperJarFile = project.file("${minecraftServerDirectory}/paper.jar")
if (!paperJarFile.exists() || shouldUpdatePaperServer) {
downloadLatestBuild(concrete.paperServerVersionGroup.get(), paperJarFile)
}
val paperPluginsDirectory = minecraftServerDirectory.resolve("plugins")
if (!paperPluginsDirectory.exists()) {
paperPluginsDirectory.mkdirs()
}
for (project in project.findPluginProjects()) {
val task = project.shadowJarTask!!
val pluginJarFile = task.outputs.files.first()
val pluginLinkFile = paperPluginsDirectory.resolve("${project.name}.jar")
pluginLinkFile.delete()
Files.createSymbolicLink(pluginLinkFile.toPath(), pluginJarFile.toPath())
}
if (concrete.acceptServerEula.isPresent && concrete.acceptServerEula.get()) {
val writer = minecraftServerDirectory.resolve("eula.txt").bufferedWriter()
val properties = Properties()
properties.setProperty("eula", "true")
properties.store(writer, "Written by Concrete")
writer.close()
}
}
private fun downloadLatestBuild(paperVersionGroup: String, paperJarFile: File) {
val paperVersionClient = PaperVersionClient()
if (project.gradle.startParameter.isOffline) {
if (!paperJarFile.exists()) {
throw RuntimeException("Offline mode is enabled and Paper has not been downloaded.")
@ -77,4 +47,10 @@ open class SetupPaperServer : DefaultTask() {
logger.lifecycle("Paper Server ${build.version} build ${build.build} is up-to-date")
}
}
@Internal
override fun getServerDirectory(): File {
val concrete = project.extensions.getByType<ConcreteExtension>()
return project.file(concrete.minecraftServerPath.get())
}
}

View File

@ -8,7 +8,7 @@ import java.nio.file.Path
open class UpdateManifestTask : DefaultTask() {
@TaskAction
fun update() {
val manifestsDir = ensureManifestsDir()
val manifestsDir = ensureManifestsDirectory()
val updateFile = manifestsDir.resolve("update.json")
val rootPath = project.rootProject.rootDir.toPath()
val updateManifest = project.findPluginProjects().mapNotNull { project ->
@ -24,7 +24,7 @@ open class UpdateManifestTask : DefaultTask() {
Files.writeString(updateFile, Globals.gson.toJson(updateManifest))
}
private fun ensureManifestsDir(): Path {
private fun ensureManifestsDirectory(): Path {
val manifestsDir = project.buildDir.resolve("manifests")
manifestsDir.mkdirs()
return manifestsDir.toPath()

10
tools/ensure-new-lines.sh Executable file
View File

@ -0,0 +1,10 @@
#!/usr/bin/env bash
set -e
git ls-files -z | while IFS= read -rd '' f
do
if file --mime-encoding "$f" | grep -qv binary
then
tail -c1 < "$f" | read -r _ || echo >> "$f"
fi
done