diff --git a/src/main/groovy/ru/endlesscode/bukkitgradle/BukkitGradlePlugin.groovy b/src/main/groovy/ru/endlesscode/bukkitgradle/BukkitGradlePlugin.groovy index d3a4fd1..345c2f3 100644 --- a/src/main/groovy/ru/endlesscode/bukkitgradle/BukkitGradlePlugin.groovy +++ b/src/main/groovy/ru/endlesscode/bukkitgradle/BukkitGradlePlugin.groovy @@ -9,6 +9,7 @@ import ru.endlesscode.bukkitgradle.meta.PluginMetaPlugin import ru.endlesscode.bukkitgradle.meta.extension.PluginMeta import ru.endlesscode.bukkitgradle.meta.util.StringUtils import ru.endlesscode.bukkitgradle.server.extension.RunConfiguration +import ru.endlesscode.bukkitgradle.server.legacy.LegacyDevServerPlugin class BukkitGradlePlugin implements Plugin { final static String GROUP = 'Bukkit' @@ -45,7 +46,7 @@ class BukkitGradlePlugin implements Plugin { plugins.with { apply('java') apply(PluginMetaPlugin) - apply(DevServerPlugin) + apply(LegacyDevServerPlugin) } convention.getPlugin(JavaPluginConvention).with { diff --git a/src/main/groovy/ru/endlesscode/bukkitgradle/DevServerPlugin.groovy b/src/main/groovy/ru/endlesscode/bukkitgradle/DevServerPlugin.groovy deleted file mode 100644 index 8300118..0000000 --- a/src/main/groovy/ru/endlesscode/bukkitgradle/DevServerPlugin.groovy +++ /dev/null @@ -1,39 +0,0 @@ -package ru.endlesscode.bukkitgradle - -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.tasks.TaskProvider -import ru.endlesscode.bukkitgradle.server.ServerConstants -import ru.endlesscode.bukkitgradle.server.ServerCore -import ru.endlesscode.bukkitgradle.server.task.CreateIdeaJarRunConfiguration -import ru.endlesscode.bukkitgradle.server.task.PrepareServer -import ru.endlesscode.bukkitgradle.server.task.RunServer - -class DevServerPlugin implements Plugin { - - @Override - void apply(Project project) { - ServerCore serverCore = new ServerCore(project) - project.tasks.register('runServer', RunServer) { - group = BukkitGradlePlugin.GROUP - description = 'Run dev server' - core = serverCore - dependsOn('prepareServer') - } - - def prepareServer = project.tasks.register('prepareServer', PrepareServer) { - group = BukkitGradlePlugin.GROUP - description = 'Prepare server ro run. Configure server and copy compiled plugin to plugins dir' - core = serverCore - dependsOn('build', 'copyServerCore') - } as TaskProvider - - project.tasks.register('buildIdeaRun', CreateIdeaJarRunConfiguration) { - configurationName.set("$project.name: Run server") - beforeRunTask.set('prepareServer') - configurationsDir.set(project.rootProject.layout.projectDirectory.dir('.idea/runConfigurations')) - jarPath.set(prepareServer.get().serverDir - .map { it.file(ServerConstants.FILE_CORE).asFile.path }) - } - } -} diff --git a/src/main/groovy/ru/endlesscode/bukkitgradle/server/Constants.groovy b/src/main/groovy/ru/endlesscode/bukkitgradle/server/Constants.groovy deleted file mode 100644 index 1f17e8c..0000000 --- a/src/main/groovy/ru/endlesscode/bukkitgradle/server/Constants.groovy +++ /dev/null @@ -1,21 +0,0 @@ -package ru.endlesscode.bukkitgradle.server - -class ServerConstants { - public static final String FALLBACK_VERSION = "1.16.2" - public static final String FILE_CORE = "core.jar" - - public static final String FILE_BUILDTOOLS = "BuildTools.jar" - public static final String FILE_MAVEN_METADATA = "maven-metadata.xml" - - public static final String URL_SPIGOT_METADATA = "https://hub.spigotmc.org/nexus/content/repositories/snapshots/org/spigotmc/spigot-api/$FILE_MAVEN_METADATA" -} - -class PaperConstants { - public static final String FALLBACK_VERSION = "1.16.1" - - public static final String FILE_PAPERCLIP = "paperclip.jar" - public static final String FILE_PAPER_VERSIONS = "paper-versions.json" - - public static final String URL_PAPER_VERSIONS = "https://gist.githubusercontent.com/osipxd/6119732e30059241c2192c4a8d2218d9/raw/7d2b9f6eaa982edebf1147ece8439dacd5f33d16/$FILE_PAPER_VERSIONS" - public static final String URL_PAPER_DEFAULT = "https://papermc.io/ci/job/Paper-1.15/lastSuccessfulBuild/artifact/paperclip.jar" -} diff --git a/src/main/groovy/ru/endlesscode/bukkitgradle/server/CoreType.groovy b/src/main/groovy/ru/endlesscode/bukkitgradle/server/CoreType.groovy deleted file mode 100644 index 5a29437..0000000 --- a/src/main/groovy/ru/endlesscode/bukkitgradle/server/CoreType.groovy +++ /dev/null @@ -1,6 +0,0 @@ -package ru.endlesscode.bukkitgradle.server - -/** Supported server core types to run. */ -enum CoreType { - SPIGOT, PAPER -} diff --git a/src/main/groovy/ru/endlesscode/bukkitgradle/server/extension/RunConfiguration.groovy b/src/main/groovy/ru/endlesscode/bukkitgradle/server/extension/RunConfiguration.groovy deleted file mode 100644 index 3d27953..0000000 --- a/src/main/groovy/ru/endlesscode/bukkitgradle/server/extension/RunConfiguration.groovy +++ /dev/null @@ -1,58 +0,0 @@ -package ru.endlesscode.bukkitgradle.server.extension - -import org.slf4j.Logger -import org.slf4j.LoggerFactory -import ru.endlesscode.bukkitgradle.server.CoreType - -class RunConfiguration implements Serializable { - - private static final String DEBUG_ARGS = "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005" - - private transient Logger logger = LoggerFactory.getLogger("RunConfiguration") - - boolean eula = false - boolean onlineMode = false - boolean debug = true - String encoding = 'UTF-8' - String javaArgs = '-Xmx1G' - String bukkitArgs = '' - - private CoreType coreType = CoreType.SPIGOT - - void setCore(String core) { - try { - coreType = CoreType.valueOf(core.toUpperCase(Locale.ENGLISH)) - } catch (IllegalArgumentException ignored) { - logger.warn(""" - Core type '$core' not found. May be it doesn't supported by BukkitGradle yet. - Fallback core type is '${coreType.name()}'. - Supported types: ${CoreType.values().join(', ')} - Write an issue on GitHub to request support of other cores. - """.stripIndent()) - } - } - - CoreType getCoreType() { - return coreType - } - - /** - * Returns arguments for JVM - */ - String buildJvmArgs(boolean debug = this.debug) { - return "${debug ? "$DEBUG_ARGS " : ''}-Dfile.encoding=$encoding $javaArgs" - } - - @Override - String toString() { - return "RunConfiguration{" + - "eula=$eula" + - ", onlineMode=$onlineMode" + - ", debug=$debug" + - ", encoding='$encoding'" + - ", javaArgs='$javaArgs'" + - ", bukkitArgs='$bukkitArgs'" + - ", coreType=$coreType" + - "}" - } -} diff --git a/src/main/groovy/ru/endlesscode/bukkitgradle/server/legacy/LegacyDevServerPlugin.groovy b/src/main/groovy/ru/endlesscode/bukkitgradle/server/legacy/LegacyDevServerPlugin.groovy new file mode 100644 index 0000000..5cbd0cb --- /dev/null +++ b/src/main/groovy/ru/endlesscode/bukkitgradle/server/legacy/LegacyDevServerPlugin.groovy @@ -0,0 +1,60 @@ +package ru.endlesscode.bukkitgradle.server.legacy + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.tasks.Copy +import org.gradle.api.tasks.TaskProvider +import org.gradle.jvm.tasks.Jar +import ru.endlesscode.bukkitgradle.meta.extension.PluginMeta +import ru.endlesscode.bukkitgradle.server.ServerConstants +import ru.endlesscode.bukkitgradle.server.extension.RunConfiguration +import ru.endlesscode.bukkitgradle.server.task.CreateIdeaJarRunConfiguration +import ru.endlesscode.bukkitgradle.server.task.GenerateRunningScript +import ru.endlesscode.bukkitgradle.server.task.PrepareServer +import ru.endlesscode.bukkitgradle.server.task.RunServer + +class LegacyDevServerPlugin implements Plugin { + + @Override + void apply(Project project) { + ServerCore serverCore = new ServerCore(project) + def configuration = project.bukkit.run as RunConfiguration + def generateRunningScript = project.tasks.register('generateRunningScript', GenerateRunningScript) { + jvmArgs.set(configuration.buildJvmArgs()) + bukkitArgs.set(configuration.bukkitArgs) + scriptDir.set(serverCore.serverDir) + } + + def prepareServer = configurePrepareServerTask(project, serverCore) + project.tasks.register('runServer', RunServer) { + scriptFile.set(generateRunningScript.map { it.scriptFile.get().asFile }) + dependsOn(prepareServer) + } + + project.tasks.register('buildIdeaRun', CreateIdeaJarRunConfiguration) { + configurationName.set("$project.name: Run server") + beforeRunTask.set('prepareServer') + configurationsDir.set(project.rootProject.layout.projectDirectory.dir('.idea/runConfigurations')) + jarPath.set(new File(serverCore.serverDir, ServerConstants.FILE_CORE)) + } + } + + private static TaskProvider configurePrepareServerTask(Project project, ServerCore serverCore) { + def jarTaskName = project.plugins.hasPlugin("com.github.johnrengelman.shadow") ? "shadowJar" : "jar" + def jarTask = project.tasks.named(jarTaskName, Jar) as TaskProvider + def meta = project.bukkit.meta as PluginMeta + def copyPlugins = project.tasks.register("copyPlugins", Copy) { + from(jarTask) + into(project.mkdir(new File(serverCore.serverDir, "plugins"))) + rename { "${meta.name.get()}.jar" } + } + + def run = project.bukkit.run as RunConfiguration + return project.tasks.register('prepareServer', PrepareServer) { + serverDir.set(serverCore.serverDir) + eula = run.eula + onlineMode = run.onlineMode + dependsOn('copyServerCore', copyPlugins) + } + } +} diff --git a/src/main/groovy/ru/endlesscode/bukkitgradle/server/ServerCore.groovy b/src/main/groovy/ru/endlesscode/bukkitgradle/server/legacy/ServerCore.groovy similarity index 97% rename from src/main/groovy/ru/endlesscode/bukkitgradle/server/ServerCore.groovy rename to src/main/groovy/ru/endlesscode/bukkitgradle/server/legacy/ServerCore.groovy index 6bc0fd8..5804fb1 100644 --- a/src/main/groovy/ru/endlesscode/bukkitgradle/server/ServerCore.groovy +++ b/src/main/groovy/ru/endlesscode/bukkitgradle/server/legacy/ServerCore.groovy @@ -1,4 +1,4 @@ -package ru.endlesscode.bukkitgradle.server +package ru.endlesscode.bukkitgradle.server.legacy import de.undercouch.gradle.tasks.download.Download import de.undercouch.gradle.tasks.download.DownloadExtension @@ -6,9 +6,12 @@ import groovy.json.JsonSlurper import org.gradle.api.Project import org.gradle.api.tasks.Copy import org.gradle.api.tasks.JavaExec -import ru.endlesscode.bukkitgradle.BukkitGroovy import ru.endlesscode.bukkitgradle.BukkitGradlePlugin -import ru.endlesscode.bukkitgradle.server.util.MavenApi +import ru.endlesscode.bukkitgradle.BukkitGroovy +import ru.endlesscode.bukkitgradle.server.PaperConstants +import ru.endlesscode.bukkitgradle.server.ServerConstants +import ru.endlesscode.bukkitgradle.server.extension.CoreType +import ru.endlesscode.bukkitgradle.server.legacy.util.MavenApi import javax.annotation.Nullable diff --git a/src/main/groovy/ru/endlesscode/bukkitgradle/server/ServerProperties.groovy b/src/main/groovy/ru/endlesscode/bukkitgradle/server/legacy/ServerProperties.groovy similarity index 98% rename from src/main/groovy/ru/endlesscode/bukkitgradle/server/ServerProperties.groovy rename to src/main/groovy/ru/endlesscode/bukkitgradle/server/legacy/ServerProperties.groovy index e822ad4..e9c641b 100644 --- a/src/main/groovy/ru/endlesscode/bukkitgradle/server/ServerProperties.groovy +++ b/src/main/groovy/ru/endlesscode/bukkitgradle/server/legacy/ServerProperties.groovy @@ -1,4 +1,4 @@ -package ru.endlesscode.bukkitgradle.server +package ru.endlesscode.bukkitgradle.server.legacy import org.slf4j.Logger import org.slf4j.LoggerFactory diff --git a/src/main/groovy/ru/endlesscode/bukkitgradle/server/util/MavenApi.groovy b/src/main/groovy/ru/endlesscode/bukkitgradle/server/legacy/util/MavenApi.groovy similarity index 94% rename from src/main/groovy/ru/endlesscode/bukkitgradle/server/util/MavenApi.groovy rename to src/main/groovy/ru/endlesscode/bukkitgradle/server/legacy/util/MavenApi.groovy index d98544d..af2cd42 100644 --- a/src/main/groovy/ru/endlesscode/bukkitgradle/server/util/MavenApi.groovy +++ b/src/main/groovy/ru/endlesscode/bukkitgradle/server/legacy/util/MavenApi.groovy @@ -1,4 +1,4 @@ -package ru.endlesscode.bukkitgradle.server.util +package ru.endlesscode.bukkitgradle.server.legacy.util import org.gradle.api.Project diff --git a/src/main/groovy/ru/endlesscode/bukkitgradle/server/script/BashScript.groovy b/src/main/groovy/ru/endlesscode/bukkitgradle/server/script/BashScript.groovy deleted file mode 100644 index 8d037c5..0000000 --- a/src/main/groovy/ru/endlesscode/bukkitgradle/server/script/BashScript.groovy +++ /dev/null @@ -1,32 +0,0 @@ -package ru.endlesscode.bukkitgradle.server.script - -import ru.endlesscode.bukkitgradle.server.extension.RunConfiguration - -class BashScript extends RunningScript { - - BashScript(RunConfiguration configuration, String version) { - super(configuration, version) - } - - @Override - protected String getExt() { - return "sh" - } - - @Override - protected String getScriptText() { - //language=bash - $/ - #!/usr/bin/env bash - - cd "$( dirname "$0" )" - ${buildRunCommand()} - /$.stripIndent() - } - - @Override - List getCommand() { - String scriptName = getFileName() - return ["chmod +x $scriptName", "&&", "./$scriptName"] - } -} diff --git a/src/main/groovy/ru/endlesscode/bukkitgradle/server/script/RunningScript.groovy b/src/main/groovy/ru/endlesscode/bukkitgradle/server/script/RunningScript.groovy deleted file mode 100644 index ea1e600..0000000 --- a/src/main/groovy/ru/endlesscode/bukkitgradle/server/script/RunningScript.groovy +++ /dev/null @@ -1,94 +0,0 @@ -package ru.endlesscode.bukkitgradle.server.script - -import org.gradle.internal.os.OperatingSystem -import ru.endlesscode.bukkitgradle.server.ServerConstants -import ru.endlesscode.bukkitgradle.server.extension.RunConfiguration - -abstract class RunningScript { - - protected RunConfiguration configuration - private String version - - RunningScript(RunConfiguration configuration, String version) { - this.configuration = configuration - this.version = version - } - - /** - * Generates script file on given directory - * - * @param dir The directory - */ - void buildOn(File dir) { - def scriptFile = new File(dir, getFileName()) - if (!scriptFile.exists()) { - scriptFile.createNewFile() - } - - scriptFile.text = this.getScriptText() - } - - /** - * Returns script file name - * - * @return Script name - */ - protected String getFileName() { - return "start.${getExt()}" - } - - /** - * Returns script file extension - * - * @return File extension - */ - protected abstract String getExt() - - /** - * Returns script file content as multiline string - * - * @return Script text - */ - protected abstract String getScriptText() - - /** - * Builds and returns server run command - * It is same for any OS - * - * @return Server run command - */ - protected String buildRunCommand() { - "java ${configuration.buildJvmArgs()} -jar ${ServerConstants.FILE_CORE} ${configuration.bukkitArgs}" - } - - /** - * Returns command for ProcessBuilder - * - * @return Command - */ - abstract List getCommand() - - /** - * Gets title for console window - * - * @return The title - */ - protected String getTitle() { - return "Dev Server (v$version)" - } - - /** - * Returns start script for current system - * - * @param configuration Run configuration - * @param version Server version - * @return The script - */ - static RunningScript getScript(RunConfiguration configuration, String version) { - if (OperatingSystem.current().isWindows()) { - return new WindowsScript(configuration, version) - } - - return new BashScript(configuration, version) - } -} diff --git a/src/main/groovy/ru/endlesscode/bukkitgradle/server/script/WindowsScript.groovy b/src/main/groovy/ru/endlesscode/bukkitgradle/server/script/WindowsScript.groovy deleted file mode 100644 index 7cdf75f..0000000 --- a/src/main/groovy/ru/endlesscode/bukkitgradle/server/script/WindowsScript.groovy +++ /dev/null @@ -1,32 +0,0 @@ -package ru.endlesscode.bukkitgradle.server.script - -import ru.endlesscode.bukkitgradle.server.extension.RunConfiguration - -class WindowsScript extends RunningScript { - - WindowsScript(RunConfiguration configuration, String version) { - super(configuration, version) - } - - @Override - protected String getExt() { - return "bat" - } - - @Override - protected String getScriptText() { - //language=bat - $/ - @echo off - ${buildRunCommand()} - pause - exit - /$.stripIndent() - } - - @Override - List getCommand() { - String title = "\"${getTitle()}\"" - return ["cmd", "/c", "start", title, getFileName()] - } -} diff --git a/src/main/groovy/ru/endlesscode/bukkitgradle/server/task/CreateIdeaJarRunConfiguration.groovy b/src/main/groovy/ru/endlesscode/bukkitgradle/server/task/CreateIdeaJarRunConfiguration.groovy deleted file mode 100644 index 5c9d557..0000000 --- a/src/main/groovy/ru/endlesscode/bukkitgradle/server/task/CreateIdeaJarRunConfiguration.groovy +++ /dev/null @@ -1,78 +0,0 @@ -package ru.endlesscode.bukkitgradle.server.task - -import groovy.xml.MarkupBuilder -import org.gradle.api.DefaultTask -import org.gradle.api.file.DirectoryProperty -import org.gradle.api.provider.Property -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.OutputDirectory -import org.gradle.api.tasks.TaskAction -import ru.endlesscode.bukkitgradle.BukkitGradlePlugin -import ru.endlesscode.bukkitgradle.server.util.Idea - -/** - * Builds and writes to file run configuration in IDEA .xml format - */ -class CreateIdeaJarRunConfiguration extends DefaultTask { - - @Input - final Property configurationName = project.objects.property(String) - - @Input - final Property vmParameters = project.objects.property(String) - - @Input - final Property programParameters = project.objects.property(String) - - @Input - final Property beforeRunTask = project.objects.property(String) - - @Input - final Property jarPath = project.objects.property(String) - - @OutputDirectory - final DirectoryProperty configurationsDir = project.objects.directoryProperty() - - CreateIdeaJarRunConfiguration() { - group = BukkitGradlePlugin.GROUP - description = 'Configure server run configuration for IDEA' - - vmParameters.convention('') - programParameters.convention('') - - onlyIf { Idea.isActive() } - } - - @TaskAction - def createJarRunConfiguration() { - def configurationName = configurationName.get() - def configurationsDir = configurationsDir.get() - - configurationsDir.asFile.mkdirs() - - def runConfigurationFile = configurationsDir - .file("${Idea.fileNameSlug(configurationName)}.xml") - .asFile - - def xml = new MarkupBuilder(runConfigurationFile.newWriter('UTF-8')) - xml.component(name: 'ProjectRunConfigurationManager') { - configuration( - default: 'false', - name: configurationName, - type: 'JarApplication', - singleton: 'true' - ) { - option(name: 'JAR_PATH', value: jarPath.get()) - option(name: 'VM_PARAMETERS', value: vmParameters.get()) - option(name: 'PROGRAM_PARAMETERS', value: programParameters.get()) - option(name: 'WORKING_DIRECTORY', value: new File(jarPath.get()).parentFile) - method(v: 2) { - option(name: 'Gradle.BeforeRunTask', - enabled: 'true', - tasks: beforeRunTask.get(), - externalProjectPath: '$PROJECT_DIR$') - } - } - } - } -} diff --git a/src/main/groovy/ru/endlesscode/bukkitgradle/server/task/PrepareServer.groovy b/src/main/groovy/ru/endlesscode/bukkitgradle/server/task/PrepareServer.groovy deleted file mode 100644 index 7483349..0000000 --- a/src/main/groovy/ru/endlesscode/bukkitgradle/server/task/PrepareServer.groovy +++ /dev/null @@ -1,75 +0,0 @@ -package ru.endlesscode.bukkitgradle.server.task - -import org.gradle.api.DefaultTask -import org.gradle.api.file.DirectoryProperty -import org.gradle.api.provider.Property -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.InputDirectory -import org.gradle.api.tasks.TaskAction -import org.gradle.jvm.tasks.Jar -import ru.endlesscode.bukkitgradle.server.ServerCore -import ru.endlesscode.bukkitgradle.server.extension.RunConfiguration - -class PrepareServer extends DefaultTask { - @Input - ServerCore core - - @InputDirectory - final DirectoryProperty serverDir = project.objects.directoryProperty() - - @Input - final Property jarTask = project.objects.property(Jar) - - @Input - RunConfiguration run - - PrepareServer() { - def jarTaskName = project.plugins.hasPlugin('com.github.johnrengelman.shadow') ? 'shadowJar' : 'jar' - jarTask.convention(project.tasks.named(jarTaskName, Jar)) - } - - void setCore(ServerCore core) { - this.core = core - this.serverDir.fileProvider(project.provider { project.mkdir(core.serverDir) }) - this.run = project.bukkit.run - } - - @TaskAction - void prepareServer() { - resolveEula() - resolveOnlineMode() - copyPluginsToServerDir() - } - - void resolveEula() { - def eulaFile = serverDir.file("eula.txt").get().asFile - if (!eulaFile.exists()) { - eulaFile.createNewFile() - } - - Properties properties = new Properties() - properties.load(eulaFile.newReader("UTF-8")) - properties.setProperty("eula", "${this.run.eula}") - properties.store(eulaFile.newWriter("UTF-8"), "By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).") - } - - void resolveOnlineMode() { - def propsFile = serverDir.file("server.properties").get().asFile - if (!propsFile.exists()) { - propsFile.createNewFile() - } - - Properties properties = new Properties() - properties.load(propsFile.newReader("UTF-8")) - properties.setProperty("online-mode", "${this.run.onlineMode}") - properties.store(propsFile.newWriter("UTF-8"), "Minecraft server properties") - } - - void copyPluginsToServerDir() { - project.copy { - from(jarTask) - into(project.mkdir(serverDir.dir('plugins'))) - rename { "${project.bukkit.meta.name}.jar" } - } - } -} diff --git a/src/main/groovy/ru/endlesscode/bukkitgradle/server/task/RunServer.groovy b/src/main/groovy/ru/endlesscode/bukkitgradle/server/task/RunServer.groovy deleted file mode 100644 index c032a88..0000000 --- a/src/main/groovy/ru/endlesscode/bukkitgradle/server/task/RunServer.groovy +++ /dev/null @@ -1,37 +0,0 @@ -package ru.endlesscode.bukkitgradle.server.task - -import org.gradle.api.DefaultTask -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.TaskAction -import ru.endlesscode.bukkitgradle.server.ServerCore -import ru.endlesscode.bukkitgradle.server.extension.RunConfiguration -import ru.endlesscode.bukkitgradle.server.script.RunningScript - -class RunServer extends DefaultTask { - @Input - ServerCore core - - @TaskAction - void runServer() { - RunningScript script = this.createStartScript() - logger.lifecycle("Running script built!") - logger.lifecycle("Starting Server...") - this.runScript(script) - logger.lifecycle("Server started successfully!") - } - - RunningScript createStartScript() { - RunConfiguration configuration = project.bukkit.run - RunningScript script = RunningScript.getScript(configuration, core.simpleVersion) - script.buildOn(this.core.serverDir) - - return script - } - - void runScript(RunningScript script) { - new ProcessBuilder(script.command) - .redirectErrorStream(true) - .directory(core.serverDir) - .start() - } -} diff --git a/src/main/groovy/ru/endlesscode/bukkitgradle/server/util/Idea.groovy b/src/main/groovy/ru/endlesscode/bukkitgradle/server/util/Idea.groovy deleted file mode 100644 index 0a3a183..0000000 --- a/src/main/groovy/ru/endlesscode/bukkitgradle/server/util/Idea.groovy +++ /dev/null @@ -1,18 +0,0 @@ -package ru.endlesscode.bukkitgradle.server.util - -class Idea { - - static final IDEA_ACTIVE = 'idea.active' - - private Idea() {} - - static boolean isActive() { - return System.getProperty(IDEA_ACTIVE) == 'true' - } - - static String fileNameSlug(String name) { - return name - .replaceAll(/[^\x20-\x7E]/, '') - .replaceAll(/[^a-zA-Z]/, '_') - } -} diff --git a/src/main/kotlin/Bukkit.kt b/src/main/kotlin/Bukkit.kt index ca90fb3..28079b5 100644 --- a/src/main/kotlin/Bukkit.kt +++ b/src/main/kotlin/Bukkit.kt @@ -3,9 +3,11 @@ package ru.endlesscode.bukkitgradle import org.gradle.api.Project import org.gradle.kotlin.dsl.getByType import ru.endlesscode.bukkitgradle.meta.extension.PluginMeta +import ru.endlesscode.bukkitgradle.server.extension.RunConfiguration public interface Bukkit { public val meta: PluginMeta + public val run: RunConfiguration } internal val Project.bukkit: Bukkit get() = extensions.getByType() diff --git a/src/main/kotlin/Constants.kt b/src/main/kotlin/Constants.kt index 5082f9b..c52240a 100644 --- a/src/main/kotlin/Constants.kt +++ b/src/main/kotlin/Constants.kt @@ -2,5 +2,5 @@ package ru.endlesscode.bukkitgradle -/** Plugins group name. */ -internal const val PLUGINS_GROUP: String = "Bukkit" +/** Bukkit tasks group name. */ +internal const val TASKS_GROUP_BUKKIT: String = "Bukkit" diff --git a/src/main/kotlin/meta/task/GenerateMeta.kt b/src/main/kotlin/meta/task/GenerateMeta.kt index e030dca..48ba825 100644 --- a/src/main/kotlin/meta/task/GenerateMeta.kt +++ b/src/main/kotlin/meta/task/GenerateMeta.kt @@ -5,7 +5,7 @@ import org.gradle.api.file.RegularFileProperty import org.gradle.api.tasks.Nested import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction -import ru.endlesscode.bukkitgradle.PLUGINS_GROUP +import ru.endlesscode.bukkitgradle.TASKS_GROUP_BUKKIT import ru.endlesscode.bukkitgradle.meta.MetaFile import java.io.File import javax.inject.Inject @@ -23,7 +23,7 @@ public open class GenerateMeta @Inject internal constructor( public val target: RegularFileProperty = project.objects.fileProperty() init { - group = PLUGINS_GROUP + group = TASKS_GROUP_BUKKIT description = "Generate plugin.yml file" val defaultTargetProvider = project.provider { File(temporaryDir, MetaFile.NAME) } diff --git a/src/main/kotlin/package.kt b/src/main/kotlin/package.kt deleted file mode 100644 index 4f94c61..0000000 --- a/src/main/kotlin/package.kt +++ /dev/null @@ -1 +0,0 @@ -package ru.endlesscode.bukkitgradle diff --git a/src/main/kotlin/server/Constants.kt b/src/main/kotlin/server/Constants.kt new file mode 100644 index 0000000..ea362c1 --- /dev/null +++ b/src/main/kotlin/server/Constants.kt @@ -0,0 +1,24 @@ +package ru.endlesscode.bukkitgradle.server + +public object ServerConstants { + public const val FALLBACK_VERSION: String = "1.16.2" + public const val FILE_CORE: String = "core.jar" + + public const val FILE_BUILDTOOLS: String = "BuildTools.jar" + public const val FILE_MAVEN_METADATA: String = "maven-metadata.xml" + + public const val URL_SPIGOT_METADATA: String = + "https://hub.spigotmc.org/nexus/content/repositories/snapshots/org/spigotmc/spigot-api/$FILE_MAVEN_METADATA" +} + +public object PaperConstants { + public const val FALLBACK_VERSION: String = "1.16.1" + + public const val FILE_PAPERCLIP: String = "paperclip.jar" + public const val FILE_PAPER_VERSIONS: String = "paper-versions.json" + + public const val URL_PAPER_VERSIONS: String = + "https://gist.githubusercontent.com/osipxd/6119732e30059241c2192c4a8d2218d9/raw/7d2b9f6eaa982edebf1147ece8439dacd5f33d16/$FILE_PAPER_VERSIONS" + public const val URL_PAPER_DEFAULT: String = + "https://papermc.io/ci/job/Paper-1.15/lastSuccessfulBuild/artifact/paperclip.jar" +} diff --git a/src/main/kotlin/server/extension/CoreType.kt b/src/main/kotlin/server/extension/CoreType.kt new file mode 100644 index 0000000..6c97f21 --- /dev/null +++ b/src/main/kotlin/server/extension/CoreType.kt @@ -0,0 +1,6 @@ +package ru.endlesscode.bukkitgradle.server.extension + +/** Supported server core types to run. */ +public enum class CoreType { + SPIGOT, PAPER +} diff --git a/src/main/kotlin/server/extension/RunConfiguration.kt b/src/main/kotlin/server/extension/RunConfiguration.kt new file mode 100644 index 0000000..7329f68 --- /dev/null +++ b/src/main/kotlin/server/extension/RunConfiguration.kt @@ -0,0 +1,60 @@ +package ru.endlesscode.bukkitgradle.server.extension + +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import java.util.* + +public class RunConfiguration { + + private val logger: Logger = LoggerFactory.getLogger("RunConfiguration") + + public var eula: Boolean = false + public var onlineMode: Boolean = false + public var debug: Boolean = true + public var encoding: String = "UTF-8" + public var javaArgs: String = "-Xmx1G" + public var bukkitArgs: String = "" + + private var coreType: CoreType = CoreType.SPIGOT + + public fun setCore(core: String) { + try { + coreType = CoreType.valueOf(core.toUpperCase(Locale.ENGLISH)) + } catch (_: IllegalArgumentException) { + logger.warn( + """ + Core type '$core' not found. May be it doesn't supported by BukkitGradle yet. + Fallback core type is '${coreType.name}'. + Supported types: ${CoreType.values().joinToString(", ")} + Write an issue on GitHub to request support of other cores. + """.trimIndent() + ) + } + } + + public fun getCoreType(): CoreType { + return coreType + } + + /** Returns arguments for JVM. */ + @JvmOverloads + public fun buildJvmArgs(debug: Boolean = this.debug): String { + return "${if (debug) "$DEBUG_ARGS " else ""}-Dfile.encoding=$encoding $javaArgs" + } + + override fun toString(): String { + return "RunConfiguration{" + + "eula=$eula" + + ", onlineMode=$onlineMode" + + ", debug=$debug" + + ", encoding='$encoding'" + + ", javaArgs='$javaArgs'" + + ", bukkitArgs='$bukkitArgs'" + + ", coreType=$coreType" + + "}" + } + + private companion object { + const val DEBUG_ARGS: String = "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005" + } +} diff --git a/src/main/kotlin/server/script/BashScriptStrategy.kt b/src/main/kotlin/server/script/BashScriptStrategy.kt new file mode 100644 index 0000000..0852530 --- /dev/null +++ b/src/main/kotlin/server/script/BashScriptStrategy.kt @@ -0,0 +1,21 @@ +package ru.endlesscode.bukkitgradle.server.script + +internal object BashScriptStrategy : RunningScriptStrategy() { + + override val ext: String = "sh" + + override fun getScriptText(jvmArgs: String, coreFileName: String, bukkitArgs: String): String { + //language=bash + return """ + #!/usr/bin/env bash + set -e + + cd "$( dirname "$0" )" + ${buildJavaCommand(jvmArgs, coreFileName, bukkitArgs)} + """.trimIndent() + } + + override fun getCommand(fileName: String, title: String): List { + return listOf("bash", "-c", "chmod +x $fileName && ./$fileName") + } +} diff --git a/src/main/kotlin/server/script/RunningScriptStrategy.kt b/src/main/kotlin/server/script/RunningScriptStrategy.kt new file mode 100644 index 0000000..c4164be --- /dev/null +++ b/src/main/kotlin/server/script/RunningScriptStrategy.kt @@ -0,0 +1,40 @@ +package ru.endlesscode.bukkitgradle.server.script + +import org.gradle.internal.os.OperatingSystem + +internal abstract class RunningScriptStrategy { + + /** Returns script file extension. */ + protected abstract val ext: String + + /** Returns script file name. */ + val fileName: String get() = "start.$ext" + + /** Returns script file content as multiline string. */ + abstract fun getScriptText(jvmArgs: String, coreFileName: String, bukkitArgs: String): String + + /** + * Builds and returns server run command + * It is same for any OS + * + * @return Server run command + */ + protected fun buildJavaCommand(jvmArgs: String, coreFileName: String, bukkitArgs: String): String { + return "java $jvmArgs -jar $coreFileName $bukkitArgs".trimEnd() + } + + /** Returns command for ProcessBuilder. */ + abstract fun getCommand(fileName: String, title: String): List + + companion object { + + /** Returns script strategy for current system. */ + fun get(operatingSystem: OperatingSystem): RunningScriptStrategy { + if (operatingSystem.isWindows) { + return WindowsScriptStrategy + } + + return BashScriptStrategy + } + } +} diff --git a/src/main/kotlin/server/script/WindowsScriptStrategy.kt b/src/main/kotlin/server/script/WindowsScriptStrategy.kt new file mode 100644 index 0000000..b08e8dd --- /dev/null +++ b/src/main/kotlin/server/script/WindowsScriptStrategy.kt @@ -0,0 +1,20 @@ +package ru.endlesscode.bukkitgradle.server.script + +internal object WindowsScriptStrategy : RunningScriptStrategy() { + + override val ext: String = "bat" + + override fun getScriptText(jvmArgs: String, coreFileName: String, bukkitArgs: String): String { + //language=bat + return """ + @echo off + ${buildJavaCommand(jvmArgs, coreFileName, bukkitArgs)} + pause + exit + """.trimIndent() + } + + override fun getCommand(fileName: String, title: String): List { + return listOf("cmd", "/c", "start", "\"${title}\"", fileName) + } +} diff --git a/src/main/kotlin/server/task/CreateIdeaJarRunConfiguration.kt b/src/main/kotlin/server/task/CreateIdeaJarRunConfiguration.kt new file mode 100644 index 0000000..6f07f64 --- /dev/null +++ b/src/main/kotlin/server/task/CreateIdeaJarRunConfiguration.kt @@ -0,0 +1,82 @@ +package ru.endlesscode.bukkitgradle.server.task + +import groovy.xml.MarkupBuilder +import org.gradle.api.DefaultTask +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.provider.Property +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.OutputDirectory +import org.gradle.api.tasks.TaskAction +import org.gradle.kotlin.dsl.property +import org.gradle.kotlin.dsl.withGroovyBuilder +import ru.endlesscode.bukkitgradle.TASKS_GROUP_BUKKIT +import ru.endlesscode.bukkitgradle.server.util.Idea +import java.io.File + +/** Builds and writes to file run configuration in IDEA .xml format. */ +public open class CreateIdeaJarRunConfiguration : DefaultTask() { + + @Input + public val configurationName: Property = project.objects.property() + + @Input + public val vmParameters: Property = project.objects.property() + + @Input + public val programParameters: Property = project.objects.property() + + @Input + public val beforeRunTask: Property = project.objects.property() + + @Input + public val jarPath: Property = project.objects.property() + + @OutputDirectory + public val configurationsDir: DirectoryProperty = project.objects.directoryProperty() + + init { + group = TASKS_GROUP_BUKKIT + description = "Configure server run configuration for IDEA" + + vmParameters.convention("") + programParameters.convention("") + + onlyIf { Idea.isActive() } + } + + @TaskAction + public fun createJarRunConfiguration() { + val configurationName = configurationName.get() + val configurationsDir = configurationsDir.get() + + configurationsDir.asFile.mkdirs() + + val runConfigurationFile = configurationsDir + .file("${Idea.fileNameSlug(configurationName)}.xml") + .asFile + + MarkupBuilder(runConfigurationFile.writer()).withGroovyBuilder { + "component"("name" to "ProjectRunConfigurationManager") { + "configuration"( + "default" to false, + "name" to configurationName, + "type" to "JarApplication", + "singleton" to true + ) { + "option"("name" to "JAR_PATH", "value" to jarPath.get()) + "option"("name" to "VM_PARAMETERS", "value" to vmParameters.get()) + "option"("name" to "PROGRAM_PARAMETERS", "value" to programParameters.get()) + "option"("name" to "WORKING_DIRECTORY", "value" to jarPath.get().parentFile) + "method"("v" to 2) { + "option"( + "name" to "Gradle.BeforeRunTask", + "enabled" to true, + "tasks" to beforeRunTask.get(), + "externalProjectPath" to "\$PROJECT_DIR$" + ) + } + } + } + } + } +} diff --git a/src/main/kotlin/server/task/GenerateRunningScript.kt b/src/main/kotlin/server/task/GenerateRunningScript.kt new file mode 100644 index 0000000..bea601b --- /dev/null +++ b/src/main/kotlin/server/task/GenerateRunningScript.kt @@ -0,0 +1,66 @@ +package ru.endlesscode.bukkitgradle.server.task + +import org.gradle.api.DefaultTask +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.file.RegularFile +import org.gradle.api.model.ObjectFactory +import org.gradle.api.provider.Property +import org.gradle.api.provider.Provider +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.Internal +import org.gradle.api.tasks.OutputFile +import org.gradle.api.tasks.TaskAction +import org.gradle.internal.os.OperatingSystem +import org.gradle.kotlin.dsl.property +import ru.endlesscode.bukkitgradle.TASKS_GROUP_BUKKIT +import ru.endlesscode.bukkitgradle.server.ServerConstants +import ru.endlesscode.bukkitgradle.server.script.RunningScriptStrategy +import javax.inject.Inject + +/** Generates script to run server without IDE. */ +public open class GenerateRunningScript @Inject constructor(objects: ObjectFactory) : DefaultTask() { + + @Input + public val jvmArgs: Property = objects.property() + + @Input + public val bukkitArgs: Property = objects.property() + + @Input + public val coreFileName: Property = objects.property() + + @Input + public var osName: String = System.getProperty("os.name") + + @Internal + public val scriptDir: DirectoryProperty = objects.directoryProperty() + + @OutputFile + public val scriptFile: Provider + + private val scriptStrategy = RunningScriptStrategy.get(OperatingSystem.forName(osName)) + + init { + group = TASKS_GROUP_BUKKIT + description = "Generates script to run server without IDE." + + coreFileName.convention(ServerConstants.FILE_CORE) + scriptFile = scriptDir.map { it.file(scriptStrategy.fileName) } + } + + @TaskAction + internal fun generateScript() { + val scriptFile = scriptFile.get().asFile + if (!scriptFile.exists()) { + scriptFile.createNewFile() + } + + scriptFile.writeText( + scriptStrategy.getScriptText( + jvmArgs = jvmArgs.get(), + coreFileName = coreFileName.get(), + bukkitArgs = bukkitArgs.get() + ) + ) + } +} diff --git a/src/main/kotlin/server/task/PrepareServer.kt b/src/main/kotlin/server/task/PrepareServer.kt new file mode 100644 index 0000000..ee90dfc --- /dev/null +++ b/src/main/kotlin/server/task/PrepareServer.kt @@ -0,0 +1,70 @@ +package ru.endlesscode.bukkitgradle.server.task + +import org.gradle.api.DefaultTask +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.file.RegularFile +import org.gradle.api.model.ObjectFactory +import org.gradle.api.provider.Provider +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.Internal +import org.gradle.api.tasks.OutputFile +import org.gradle.api.tasks.TaskAction +import ru.endlesscode.bukkitgradle.TASKS_GROUP_BUKKIT +import java.util.* +import javax.inject.Inject + +internal open class PrepareServer @Inject constructor(objects: ObjectFactory) : DefaultTask() { + + @Internal + val serverDir: DirectoryProperty = objects.directoryProperty() + + @Input + var eula: Boolean = false + + @Input + var onlineMode: Boolean = true + + @OutputFile + val eulaFile: Provider = serverDir.map { it.file("eula.txt") } + + @OutputFile + val propertiesFile: Provider = serverDir.map { it.file("server.properties") } + + init { + group = TASKS_GROUP_BUKKIT + description = "Prepare server to run. Configure eula and online-mode." + } + + @TaskAction + fun prepareServer() { + resolveEula() + resolveOnlineMode() + } + + private fun resolveEula() { + val eulaFile = eulaFile.get().asFile + if (!eulaFile.exists()) { + eulaFile.createNewFile() + } + + val properties = Properties() + properties.load(eulaFile.reader()) + properties.setProperty("eula", "$eula") + properties.store( + eulaFile.writer(), + "By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula)." + ) + } + + private fun resolveOnlineMode() { + val propsFile = propertiesFile.get().asFile + if (!propsFile.exists()) { + propsFile.createNewFile() + } + + val properties = Properties() + properties.load(propsFile.reader()) + properties.setProperty("online-mode", "$onlineMode") + properties.store(propsFile.writer(), "Minecraft server properties") + } +} diff --git a/src/main/kotlin/server/task/RunServer.kt b/src/main/kotlin/server/task/RunServer.kt new file mode 100644 index 0000000..74d68b8 --- /dev/null +++ b/src/main/kotlin/server/task/RunServer.kt @@ -0,0 +1,48 @@ +package ru.endlesscode.bukkitgradle.server.task + +import org.gradle.api.DefaultTask +import org.gradle.api.model.ObjectFactory +import org.gradle.api.provider.Property +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.Internal +import org.gradle.api.tasks.TaskAction +import org.gradle.internal.os.OperatingSystem +import org.gradle.kotlin.dsl.property +import ru.endlesscode.bukkitgradle.TASKS_GROUP_BUKKIT +import ru.endlesscode.bukkitgradle.server.script.RunningScriptStrategy +import java.io.File +import javax.inject.Inject + +/** Run dev server from script. */ +public open class RunServer @Inject constructor(objects: ObjectFactory) : DefaultTask() { + + @Internal + public val title: Property = objects.property() + + @Input + public val scriptFile: Property = objects.property() + + @Internal + public var osName: String = System.getProperty("os.name") + + private val scriptStrategy = RunningScriptStrategy.get(OperatingSystem.forName(osName)) + + init { + group = TASKS_GROUP_BUKKIT + description = "Run dev server from script." + + title.convention("Dev Server") + outputs.upToDateWhen { false } + } + + @TaskAction + internal fun runServer() { + logger.lifecycle("Starting Server...") + val scriptFile = scriptFile.get() + ProcessBuilder(scriptStrategy.getCommand(scriptFile.name, title.get())) + .redirectErrorStream(true) + .directory(scriptFile.parentFile) + .start() + logger.lifecycle("Server started successfully!") + } +} diff --git a/src/main/kotlin/server/util/Idea.kt b/src/main/kotlin/server/util/Idea.kt new file mode 100644 index 0000000..782c7d2 --- /dev/null +++ b/src/main/kotlin/server/util/Idea.kt @@ -0,0 +1,15 @@ +package ru.endlesscode.bukkitgradle.server.util + +internal object Idea { + + private const val IDEA_ACTIVE: String = "idea.active" + + fun isActive(): Boolean = System.getProperty(IDEA_ACTIVE) == "true" + + @JvmStatic + fun fileNameSlug(name: String): String { + return name + .replace(Regex("[^\\x20-\\x7E]"), "") + .replace(Regex("[^a-zA-Z]"), "_") + } +} diff --git a/src/test/groovy/ru/endlesscode/bukkitgradle/BukkitTest.groovy b/src/test/groovy/ru/endlesscode/bukkitgradle/BukkitTest.groovy index ac39262..443ba1f 100644 --- a/src/test/groovy/ru/endlesscode/bukkitgradle/BukkitTest.groovy +++ b/src/test/groovy/ru/endlesscode/bukkitgradle/BukkitTest.groovy @@ -22,12 +22,12 @@ class BukkitTest extends PluginTestBase { void testDefaultMetaMustInheritMeta() throws Exception { project.with { PluginMeta meta = bukkit.meta - assert name == meta.name - assert description == meta.description - assert version == meta.version - assert ext.url == meta.url - assert "com.example.plugin.TestProject" == meta.main - assert meta.authors == null + assert name == meta.name.get() + assert description == meta.description.get() + assert version == meta.version.get() + assert ext.url == meta.url.get() + assert "com.example.plugin.TestProject" == meta.main.get() + assert [] == meta.authors.get() } } @@ -36,11 +36,11 @@ class BukkitTest extends PluginTestBase { this.initBukkitMeta() PluginMeta meta = this.project.bukkit.meta - assert "TestPlugin" == meta.name - assert "Test plugin description" == meta.description - assert "0.1" == meta.version - assert "com.example.plugin.Plugin" == meta.main - assert "http://www.example.com/" == meta.url - assert "[OsipXD, Contributors]" == meta.authors + assert "TestPlugin" == meta.name.get() + assert "Test plugin description" == meta.description.get() + assert "0.1" == meta.version.get() + assert "com.example.plugin.Plugin" == meta.main.get() + assert "http://www.example.com/" == meta.url.get() + assert ['OsipXD', 'Contributors'] == meta.authors.get() } } diff --git a/src/test/groovy/ru/endlesscode/bukkitgradle/server/extension/RunConfigurationSpec.groovy b/src/test/groovy/ru/endlesscode/bukkitgradle/server/extension/RunConfigurationSpec.groovy index be435d1..880dadc 100644 --- a/src/test/groovy/ru/endlesscode/bukkitgradle/server/extension/RunConfigurationSpec.groovy +++ b/src/test/groovy/ru/endlesscode/bukkitgradle/server/extension/RunConfigurationSpec.groovy @@ -1,6 +1,5 @@ package ru.endlesscode.bukkitgradle.server.extension -import ru.endlesscode.bukkitgradle.server.CoreType import spock.lang.Specification class RunConfigurationSpec extends Specification { diff --git a/src/test/groovy/ru/endlesscode/bukkitgradle/server/task/CreateIdeaJarRunConfigurationSpec.groovy b/src/test/groovy/ru/endlesscode/bukkitgradle/server/task/CreateIdeaJarRunConfigurationSpec.groovy index 669f22b..160ed0a 100644 --- a/src/test/groovy/ru/endlesscode/bukkitgradle/server/task/CreateIdeaJarRunConfigurationSpec.groovy +++ b/src/test/groovy/ru/endlesscode/bukkitgradle/server/task/CreateIdeaJarRunConfigurationSpec.groovy @@ -33,27 +33,25 @@ class CreateIdeaJarRunConfigurationSpec extends PluginSpecification { '''.stripIndent() def serverDir = "${project.buildDir}/server/1.15.2" - def expectedLines = [ - "", - " ", - " ", - "" - ] when: runner.withArguments(TASK_NAME, IDEA_ACTIVE_PROPERTY).build() and: - def lines = file('.idea/runConfigurations/test_plugin__Run_server.xml').readLines() + def text = file('.idea/runConfigurations/test_plugin__Run_server.xml').text then: - expectedLines == lines + text == """\ + + + + """.stripIndent() } } diff --git a/src/test/groovy/ru/endlesscode/bukkitgradle/server/task/GenerateRunningScriptSpec.groovy b/src/test/groovy/ru/endlesscode/bukkitgradle/server/task/GenerateRunningScriptSpec.groovy new file mode 100644 index 0000000..916fbe1 --- /dev/null +++ b/src/test/groovy/ru/endlesscode/bukkitgradle/server/task/GenerateRunningScriptSpec.groovy @@ -0,0 +1,88 @@ +package ru.endlesscode.bukkitgradle.server.task + +import org.gradle.testkit.runner.BuildResult +import org.gradle.testkit.runner.TaskOutcome +import ru.endlesscode.bukkitgradle.PluginSpecification + +class GenerateRunningScriptSpec extends PluginSpecification { + + private final static TASK_NAME = ':generateRunningScript' + private final static OS_NAME_ARG = '-Dos.name=' + + private File scriptDir + + def setup() { + buildFile << """ + bukkit { + version = '1.16.4' + run.debug = false + } + """.stripIndent() + scriptDir = dir("build/server/1.16.4/") + } + + def "when run script generation - task should generate script"() { + when: "run script generation" + def result = generateRunningScript() + + then: "task should be successful" + result.task(TASK_NAME).outcome == TaskOutcome.SUCCESS + } + + def "when rerun script generation - and not changing any inputs - task should be up-to-date"() { + when: "run script generation" + def result = generateRunningScript() + + then: "task should be successful" + result.task(TASK_NAME).outcome == TaskOutcome.SUCCESS + + when: "run script generation again" + result = generateRunningScript() + + then: "task should be up-to-date" + result.task(TASK_NAME).outcome == TaskOutcome.UP_TO_DATE + } + + def "when run script generation - and os is windows - should generate .bat file"() { + when: "run script generation with os windows" + def result = generateRunningScript('windows') + + then: "task should be successful" + result.task(TASK_NAME).outcome == TaskOutcome.SUCCESS + + and: "should generate bat script" + def scriptFile = new File(scriptDir, "start.bat") + //language=bat + scriptFile.text == """\ + @echo off + java -Dfile.encoding=UTF-8 -Xmx1G -jar core.jar + pause + exit + """.stripIndent().trim() + } + + def "when run script generation - and os is linux - should generate .sh file"() { + when: "run script generation with os linux" + def result = generateRunningScript('linux') + + then: "task should be successful" + result.task(TASK_NAME).outcome == TaskOutcome.SUCCESS + + and: "should generate bat script" + def scriptFile = new File(scriptDir, "start.sh") + //language=sh + scriptFile.text == """\ + #!/usr/bin/env bash + set -e + + cd "\$( dirname "\$0" )" + java -Dfile.encoding=UTF-8 -Xmx1G -jar core.jar + """.stripIndent().trim() + } + + private BuildResult generateRunningScript(String osName = null) { + def arguments = [TASK_NAME] + if (osName != null) arguments += "$OS_NAME_ARG$osName".toString() + return runner.withArguments(arguments).build() + } +} diff --git a/src/test/groovy/ru/endlesscode/bukkitgradle/server/task/RunServerSpec.groovy b/src/test/groovy/ru/endlesscode/bukkitgradle/server/task/RunServerSpec.groovy new file mode 100644 index 0000000..2a04fdc --- /dev/null +++ b/src/test/groovy/ru/endlesscode/bukkitgradle/server/task/RunServerSpec.groovy @@ -0,0 +1,23 @@ +package ru.endlesscode.bukkitgradle.server.task + +import org.gradle.testkit.runner.BuildResult +import org.gradle.testkit.runner.TaskOutcome +import ru.endlesscode.bukkitgradle.PluginSpecification + +class RunServerSpec extends PluginSpecification { + + private final static TASK_NAME = ':runServer' + + def "when run runServer - should also task dependencies"() { + when: "run server" + def result = runServer('-x', 'prepareServer') + + then: "task should be successful" + result.task(':generateRunningScript').outcome == TaskOutcome.SUCCESS + result.task(TASK_NAME).outcome == TaskOutcome.SUCCESS + } + + private BuildResult runServer(String... args) { + return runner.withArguments([TASK_NAME] + args.toList()).build() + } +}