diff --git a/gradle.properties b/gradle.properties index 8aef2c4..6ff9233 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,5 +7,5 @@ org.gradle.configuration-cache=true # org.gradle.unsafe.isolated-projects=true group=net.msrandom -version=0.5.2 +version=0.5.4 kotlin.code.style=official diff --git a/minecraft-codev-access-widener/src/main/kotlin/net/msrandom/minecraftcodev/accesswidener/AccessWiden.kt b/minecraft-codev-access-widener/src/main/kotlin/net/msrandom/minecraftcodev/accesswidener/AccessWiden.kt index 91f1790..9e64f09 100644 --- a/minecraft-codev-access-widener/src/main/kotlin/net/msrandom/minecraftcodev/accesswidener/AccessWiden.kt +++ b/minecraft-codev-access-widener/src/main/kotlin/net/msrandom/minecraftcodev/accesswidener/AccessWiden.kt @@ -110,8 +110,8 @@ abstract class AccessWiden : DefaultTask() { from(inputFile) } - cacheExpensiveOperation(cacheDirectory.getAsPath(), "access-widened", cacheKey, outputFile.getAsPath()) { - accessWiden(it) + cacheExpensiveOperation(cacheDirectory.getAsPath(), "access-widened", cacheKey, outputFile.getAsPath()) { (output) -> + accessWiden(output) } } } diff --git a/minecraft-codev-core/src/main/kotlin/net/msrandom/minecraftcodev/core/utils/Cache.kt b/minecraft-codev-core/src/main/kotlin/net/msrandom/minecraftcodev/core/utils/Cache.kt index c7ba553..f112c0c 100644 --- a/minecraft-codev-core/src/main/kotlin/net/msrandom/minecraftcodev/core/utils/Cache.kt +++ b/minecraft-codev-core/src/main/kotlin/net/msrandom/minecraftcodev/core/utils/Cache.kt @@ -93,15 +93,17 @@ internal fun clientJarPath( version: String, ) = getVanillaExtractJarPath(cacheDirectory, version, "client") -private val operationLocks = ConcurrentHashMap() +private val operationLocks = ConcurrentHashMap() fun cacheExpensiveOperation( cacheDirectory: Path, operationName: String, inputFiles: Iterable, - outputPath: Path, - generate: (Path) -> Unit, + vararg outputPaths: Path, + generate: (List) -> Unit, ) { + val outputPathsList = outputPaths.toList() + val hashes = runBlocking { inputFiles.map { @@ -121,34 +123,54 @@ fun cacheExpensiveOperation( .resolve(operationName) .resolve(directoryName) - val cachedOutput = cachedOperationDirectoryName.resolve(outputPath.fileName) + var allCached = true - if (cachedOutput.exists()) { - outputPath.deleteIfExists() - outputPath.tryLink(cachedOutput) + for (outputPath in outputPathsList) { + val cachedOutput = cachedOperationDirectoryName.resolve(outputPath.fileName) + + if (cachedOutput.exists()) { + outputPath.deleteIfExists() + outputPath.tryLink(cachedOutput) - println("Cache hit for $operationName operation for $outputPath") + println("Cache hit for $operationName operation for $outputPath") + } else { + allCached = false + } + } + if (allCached) { return } - println("Cache miss for $operationName operation for $outputPath") + println("Cache miss for $operationName operation for $outputPathsList") - val lock = operationLocks.computeIfAbsent(outputPath) { + val lock = operationLocks.computeIfAbsent(outputPathsList) { ReentrantLock() } lock.withLock { - val temporaryPath = - Files.createTempFile("$operationName-${outputPath.nameWithoutExtension}", ".${outputPath.extension}") - temporaryPath.deleteExisting() + val temporaryPaths = outputPathsList.map { outputPath -> + val temporaryPath = Files.createTempFile("$operationName-${outputPath.nameWithoutExtension}", ".${outputPath.extension}") + temporaryPath.deleteExisting() + + temporaryPath + } - generate(temporaryPath) + generate(temporaryPaths) cachedOperationDirectoryName.createDirectories() - temporaryPath.copyTo(cachedOutput, StandardCopyOption.COPY_ATTRIBUTES) + + for ((temporaryPath, outputPath) in temporaryPaths.zip(outputPathsList)) { + val cachedOutput = cachedOperationDirectoryName.resolve(outputPath.fileName) + + temporaryPath.copyTo(cachedOutput, StandardCopyOption.COPY_ATTRIBUTES, StandardCopyOption.REPLACE_EXISTING) + } } - outputPath.deleteIfExists() - outputPath.tryLink(cachedOutput) + for (outputPath in outputPathsList) { + val cachedOutput = cachedOperationDirectoryName.resolve(outputPath.fileName) + + outputPath.deleteIfExists() + outputPath.tryLink(cachedOutput) + } } diff --git a/minecraft-codev-fabric/src/main/kotlin/net/msrandom/minecraftcodev/fabric/runs/FabricRunsDefaultsContainer.kt b/minecraft-codev-fabric/src/main/kotlin/net/msrandom/minecraftcodev/fabric/runs/FabricRunsDefaultsContainer.kt index 56febc7..8eff6f2 100644 --- a/minecraft-codev-fabric/src/main/kotlin/net/msrandom/minecraftcodev/fabric/runs/FabricRunsDefaultsContainer.kt +++ b/minecraft-codev-fabric/src/main/kotlin/net/msrandom/minecraftcodev/fabric/runs/FabricRunsDefaultsContainer.kt @@ -15,10 +15,10 @@ import kotlin.io.path.createDirectories open class FabricRunsDefaultsContainer(private val defaults: RunConfigurationDefaultsContainer) { private fun defaults(sidedMain: FabricInstaller.MainClass.() -> String) { - defaults.builder.jvmArguments("-Dfabric.development=true") - // defaults.builder.jvmArguments("-Dmixin.env.remapRefMap=true") + defaults.configuration.jvmArguments("-Dfabric.development=true") + // defaults.configuration.jvmArguments("-Dmixin.env.remapRefMap=true") - defaults.builder.action { + defaults.configuration.apply { val remapClasspathDirectory = project.layout.buildDirectory.dir("fabricRemapClasspath") mainClass.set( @@ -41,14 +41,12 @@ open class FabricRunsDefaultsContainer(private val defaults: RunConfigurationDef }, ) } - - defaults.builder.jvmArguments() } fun client(version: Provider) { defaults(FabricInstaller.MainClass::client) - defaults.builder.action { + defaults.configuration.apply { val assetIndex = version.map { cacheParameters @@ -82,9 +80,7 @@ open class FabricRunsDefaultsContainer(private val defaults: RunConfigurationDef fun server() { defaults(FabricInstaller.MainClass::server) - defaults.builder.apply { - arguments("nogui") - } + defaults.configuration.arguments("nogui") } fun data( @@ -93,7 +89,7 @@ open class FabricRunsDefaultsContainer(private val defaults: RunConfigurationDef ) { client(version) - defaults.builder.action { + defaults.configuration.apply { val data = project.objects.newInstance(FabricDatagenRunConfigurationData::class.java) action.execute(data) @@ -105,12 +101,10 @@ open class FabricRunsDefaultsContainer(private val defaults: RunConfigurationDef } private fun gameTest() { - defaults.builder.apply { - jvmArguments( - "-Dfabric-api.gametest", - "-Dfabric.autoTest", - ) - } + defaults.configuration.jvmArguments( + "-Dfabric-api.gametest", + "-Dfabric.autoTest", + ) } fun gameTestServer() { diff --git a/minecraft-codev-forge/src/main/kotlin/net/msrandom/minecraftcodev/forge/runs/ForgeRunsDefaultsContainer.kt b/minecraft-codev-forge/src/main/kotlin/net/msrandom/minecraftcodev/forge/runs/ForgeRunsDefaultsContainer.kt index 47e1a63..971c58e 100644 --- a/minecraft-codev-forge/src/main/kotlin/net/msrandom/minecraftcodev/forge/runs/ForgeRunsDefaultsContainer.kt +++ b/minecraft-codev-forge/src/main/kotlin/net/msrandom/minecraftcodev/forge/runs/ForgeRunsDefaultsContainer.kt @@ -18,9 +18,11 @@ import net.msrandom.minecraftcodev.runs.RunConfigurationDefaultsContainer.Compan import net.msrandom.minecraftcodev.runs.task.DownloadAssets import net.msrandom.minecraftcodev.runs.task.ExtractNatives import org.gradle.api.Action +import org.gradle.api.Task import org.gradle.api.artifacts.component.ModuleComponentIdentifier import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.file.FileCollection +import org.gradle.api.provider.ListProperty import org.gradle.api.provider.Property import org.gradle.api.provider.Provider import org.gradle.api.tasks.Input @@ -67,9 +69,9 @@ open class ForgeRunsDefaultsContainer( config: UserdevConfig, arguments: MutableList, existing: List, - extractNativesName: String, - downloadAssetsName: String, - modId: Provider, + extractNatives: Provider, + downloadAssets: Provider, + data: ForgeRunConfigurationData, ) { arguments.addAll( existing.map { @@ -78,9 +80,9 @@ open class ForgeRunsDefaultsContainer( manifest, config, it.substring(1, it.length - 1), - extractNativesName, - downloadAssetsName, - modId, + extractNatives, + downloadAssets, + data, ) } else { it @@ -93,18 +95,14 @@ open class ForgeRunsDefaultsContainer( manifest: MinecraftVersionMetadata, config: UserdevConfig, template: String, - extractNativesName: String, - downloadAssetsName: String, - modId: Provider, + extractNatives: Provider, + downloadAssets: Provider, + data: ForgeRunConfigurationData, ): Any? = when (template) { "asset_index" -> manifest.assets "assets_root" -> { - val task = project.tasks.named(downloadAssetsName, DownloadAssets::class.java) - - beforeRun.add(task) - - task.flatMap(DownloadAssets::assetsDirectory) + downloadAssets.flatMap(DownloadAssets::assetsDirectory) } "modules" -> { @@ -134,15 +132,19 @@ open class ForgeRunsDefaultsContainer( "MC_VERSION" -> manifest.id "mcp_mappings" -> "minecraft-codev.mappings" "source_roots" -> { - val files = sourceSet.map { - if (it.output.resourcesDir == null) { - it.output.classesDirs - } else { - project.files(it.output.resourcesDir, it.output.classesDirs) + val files = project.files(data.additionalIncludedSourceSets.flatMap { extra -> + sourceSet.map { primary -> + (extra + primary).map { + if (it.output.resourcesDir == null) { + it.output.classesDirs + } else { + project.files(it.output.resourcesDir, it.output.classesDirs) + } + } } - } + }) - val modClasses = files.zip(modId, ::Pair).map { (files, modId) -> + val modClasses = data.modId.map { modId -> files.joinToString(File.pathSeparator) { "$modId%%$it" } @@ -221,13 +223,21 @@ open class ForgeRunsDefaultsContainer( path.parent.createDirectories() - // TODO Works for neoforge, for forge it should be ${sourceSet.get().runtimeClasspath - sourceSet.get().output} - val runtimeClasspath = sourceSet.flatMap { - project.configurations.named(it.runtimeClasspathConfigurationName) + val runtimeClasspath = data.neoforgeClasspathHandling.flatMap { + if (it) { + sourceSet.flatMap { + // TODO This is making an assumption that the patched minecraft Jar is not here + project.configurations.named(it.runtimeClasspathConfigurationName) + } + } else { + sourceSet.map { + // TODO Can just be the runtimeClasspath configuration if the above assumption is false + it.runtimeClasspath - it.output + } + } } runtimeClasspath.map { - // TODO This is making an assumption that the forge Jar is not here val files = it.map(File::getAbsolutePath) path.writeLines(files) @@ -237,11 +247,7 @@ open class ForgeRunsDefaultsContainer( } "natives" -> { - val task = project.tasks.named(extractNativesName, ExtractNatives::class.java) - - beforeRun.add(task) - - task.flatMap(ExtractNatives::destinationDirectory) + extractNatives.flatMap(ExtractNatives::destinationDirectory) } else -> { @@ -258,14 +264,43 @@ open class ForgeRunsDefaultsContainer( ) { val configProvider = getUserdevData(data.patches) - val extractNativesTaskName = sourceSet.get().extractNativesTaskName - val downloadAssetsTaskName = sourceSet.get().downloadAssetsTaskName + val extractNativesTask = sourceSet.flatMap { + project.tasks.named(it.extractNativesTaskName, ExtractNatives::class.java) + } + + val downloadAssetsTask = sourceSet.flatMap { + project.tasks.named(it.downloadAssetsTaskName, DownloadAssets::class.java) + } val getRun: UserdevConfig.() -> UserdevConfig.Run = { runType(runs) ?: throw UnsupportedOperationException("Attempted to use $caller run configuration which doesn't exist.") } + beforeRun.addAll(configProvider.flatMap { + val list = project.objects.listProperty(Task::class.java) + + val hasAssets = it.getRun().args.any { + it == "{assets_root}" + } || it.getRun().env.values.any { + it == "{assets_root}" + } + + val hasNatives = it.getRun().env.values.any { + it == "{natives}" + } + + if (hasAssets) { + list.add(downloadAssetsTask) + } + + if (hasNatives) { + list.add(extractNativesTask) + } + + list + }) + val manifestProvider = getManifest(minecraftVersion) mainClass.set(configProvider.map { it.getRun().main }) @@ -282,18 +317,18 @@ open class ForgeRunsDefaultsContainer( manifest, userdevConfig, value.substring(2, value.length - 1), - extractNativesTaskName, - downloadAssetsTaskName, - data.modId, + extractNativesTask, + downloadAssetsTask, + data, ) } else if (value.startsWith('{')) { resolveTemplate( manifest, userdevConfig, value.substring(1, value.length - 1), - extractNativesTaskName, - downloadAssetsTaskName, - data.modId, + extractNativesTask, + downloadAssetsTask, + data, ) } else { value @@ -314,9 +349,9 @@ open class ForgeRunsDefaultsContainer( userdevConfig, arguments, userdevConfig.getRun().args, - extractNativesTaskName, - downloadAssetsTaskName, - data.modId, + extractNativesTask, + downloadAssetsTask, + data, ) for (mixinConfig in data.mixinConfigs) { @@ -337,9 +372,9 @@ open class ForgeRunsDefaultsContainer( userdevConfig, jvmArguments, run.jvmArgs, - extractNativesTaskName, - downloadAssetsTaskName, - data.modId, + extractNativesTask, + downloadAssetsTask, + data, ) for ((key, value) in run.props) { @@ -352,9 +387,9 @@ open class ForgeRunsDefaultsContainer( manifest, userdevConfig, template, - extractNativesTaskName, - downloadAssetsTaskName, - data.modId, + extractNativesTask, + downloadAssetsTask, + data, ), ), ) @@ -371,45 +406,41 @@ open class ForgeRunsDefaultsContainer( fun client( minecraftVersion: Provider, action: Action? = null, - ): Unit = - defaults.builder.action { - val data = - defaults.builder.project.objects - .newInstance(ForgeRunConfigurationData::class.java) + ) { + val data = defaults.configuration.project.objects.newInstance(ForgeRunConfigurationData::class.java) + defaults.configuration.apply { action?.execute(data) addData(::client.name, minecraftVersion, data, UserdevConfig.Runs::client) } + } fun server( minecraftVersion: Provider, action: Action? = null, - ): Unit = - defaults.builder.action { - val data = - defaults.builder.project.objects - .newInstance(ForgeRunConfigurationData::class.java) + ) { + val data = defaults.configuration.project.objects.newInstance(ForgeRunConfigurationData::class.java) + defaults.configuration.apply { action?.execute(data) addData(::server.name, minecraftVersion, data, UserdevConfig.Runs::server) } + } fun data( minecraftVersion: Provider, action: Action, ) { - defaults.builder.action { - val data = - defaults.builder.project.objects - .newInstance(ForgeDatagenRunConfigurationData::class.java) + val data = defaults.configuration.project.objects.newInstance(ForgeDatagenRunConfigurationData::class.java) + defaults.configuration.apply { action.execute(data) val outputDirectory = data.getOutputDirectory(this) - addData(UserdevConfig.Runs::data.name, minecraftVersion, data, UserdevConfig.Runs::data) + addData(::data.name, minecraftVersion, data, UserdevConfig.Runs::data) val resources = sourceSet.map { it.output.resourcesDir!! } @@ -425,14 +456,10 @@ open class ForgeRunsDefaultsContainer( minecraftVersion: Provider, action: Action? = null, ) { - defaults.builder.setup { - sourceSet.convention(project.extension().named(SourceSet.TEST_SOURCE_SET_NAME)) - } + val data = defaults.configuration.project.objects.newInstance(ForgeRunConfigurationData::class.java) - defaults.builder.action { - val data = - defaults.builder.project.objects - .newInstance(ForgeRunConfigurationData::class.java) + defaults.configuration.apply { + sourceSet.convention(project.extension().named(SourceSet.TEST_SOURCE_SET_NAME)) action?.execute(data) @@ -453,6 +480,14 @@ interface ForgeRunConfigurationData { val modId: Property @Input get + + val neoforgeClasspathHandling: Property + @Input + get + + val additionalIncludedSourceSets: ListProperty + @Input + get } abstract class ForgeDatagenRunConfigurationData : diff --git a/minecraft-codev-forge/src/main/kotlin/net/msrandom/minecraftcodev/forge/task/ResolvePatchedMinecraft.kt b/minecraft-codev-forge/src/main/kotlin/net/msrandom/minecraftcodev/forge/task/ResolvePatchedMinecraft.kt index 1fd58bc..0d780c4 100644 --- a/minecraft-codev-forge/src/main/kotlin/net/msrandom/minecraftcodev/forge/task/ResolvePatchedMinecraft.kt +++ b/minecraft-codev-forge/src/main/kotlin/net/msrandom/minecraftcodev/forge/task/ResolvePatchedMinecraft.kt @@ -80,7 +80,7 @@ abstract class ResolvePatchedMinecraft : CachedMinecraftTask() { ) } - private fun resolve(cacheDirectory: Path, outputPath: Path) { + private fun resolve(cacheDirectory: Path, outputPath: Path, clientExtra: Path) { val isOffline = cacheParameters.getIsOffline().get() val metadata = cacheParameters.versionList().version(version.get()) @@ -134,8 +134,6 @@ abstract class ResolvePatchedMinecraft : CachedMinecraftTask() { librariesFile.writeLines(libraries.flatMap { listOf("-e", it.absolutePath) }) - val clientExtra = clientExtra.get() - val patchLog = temporaryDir.resolve("patch.log").outputStream() val renameLog = temporaryDir.resolve("rename.log").outputStream() @@ -272,9 +270,9 @@ abstract class ResolvePatchedMinecraft : CachedMinecraftTask() { System.setErr(err) } - clientJar.copyTo(clientExtra.toPath(), StandardCopyOption.REPLACE_EXISTING) + clientJar.copyTo(clientExtra, StandardCopyOption.REPLACE_EXISTING) - zipFileSystem(clientExtra.toPath()).use { clientZip -> + zipFileSystem(clientExtra).use { clientZip -> clientZip.getPath("/").walk { for (path in filter(Path::isRegularFile)) { if (path.toString().endsWith(".class") || path.startsWith("/META-INF")) { @@ -291,8 +289,8 @@ abstract class ResolvePatchedMinecraft : CachedMinecraftTask() { fun resolve() { val cacheDirectory = cacheParameters.directory.getAsPath() - cacheExpensiveOperation(cacheDirectory, "patch", patches, output.getAsPath()) { - resolve(cacheDirectory, it) + cacheExpensiveOperation(cacheDirectory, "patch", patches, output.getAsPath(), clientExtra.getAsPath()) { (output, clientExtra) -> + resolve(cacheDirectory, output, clientExtra) } } } diff --git a/minecraft-codev-intersections/src/main/kotlin/net/msrandom/minecraftcodev/intersection/JarIntersection.kt b/minecraft-codev-intersections/src/main/kotlin/net/msrandom/minecraftcodev/intersection/JarIntersection.kt index 1250859..82a9b61 100644 --- a/minecraft-codev-intersections/src/main/kotlin/net/msrandom/minecraftcodev/intersection/JarIntersection.kt +++ b/minecraft-codev-intersections/src/main/kotlin/net/msrandom/minecraftcodev/intersection/JarIntersection.kt @@ -279,8 +279,8 @@ abstract class JarIntersection : DefaultTask() { fun intersection() { val output = output.getAsPath() - cacheExpensiveOperation(cacheDirectory.getAsPath(), "intersection", files, output) { - intersection(it) + cacheExpensiveOperation(cacheDirectory.getAsPath(), "intersection", files, output) { (output) -> + intersection(output) } } } diff --git a/minecraft-codev-remapper/src/main/kotlin/net/msrandom/minecraftcodev/remapper/JarRemapper.kt b/minecraft-codev-remapper/src/main/kotlin/net/msrandom/minecraftcodev/remapper/JarRemapper.kt index 30c5f08..fb56e88 100644 --- a/minecraft-codev-remapper/src/main/kotlin/net/msrandom/minecraftcodev/remapper/JarRemapper.kt +++ b/minecraft-codev-remapper/src/main/kotlin/net/msrandom/minecraftcodev/remapper/JarRemapper.kt @@ -9,11 +9,8 @@ import net.fabricmc.tinyremapper.IMappingProvider import net.fabricmc.tinyremapper.NonClassCopyMode import net.fabricmc.tinyremapper.OutputConsumerPath import net.fabricmc.tinyremapper.TinyRemapper -import net.msrandom.minecraftcodev.core.utils.cacheExpensiveOperation -import net.msrandom.minecraftcodev.core.utils.getAsPath import net.msrandom.minecraftcodev.core.utils.zipFileSystem import net.msrandom.minecraftcodev.remapper.dependency.getNamespaceId -import org.gradle.api.file.FileCollection import org.objectweb.asm.commons.Remapper import java.io.File import java.nio.file.Path diff --git a/minecraft-codev-remapper/src/main/kotlin/net/msrandom/minecraftcodev/remapper/RemapAction.kt b/minecraft-codev-remapper/src/main/kotlin/net/msrandom/minecraftcodev/remapper/RemapAction.kt index 40b546a..deab19b 100644 --- a/minecraft-codev-remapper/src/main/kotlin/net/msrandom/minecraftcodev/remapper/RemapAction.kt +++ b/minecraft-codev-remapper/src/main/kotlin/net/msrandom/minecraftcodev/remapper/RemapAction.kt @@ -8,7 +8,6 @@ import net.msrandom.minecraftcodev.core.utils.cacheExpensiveOperation import net.msrandom.minecraftcodev.core.utils.getAsPath import org.gradle.api.artifacts.transform.* import org.gradle.api.file.ConfigurableFileCollection -import org.gradle.api.file.DirectoryProperty import org.gradle.api.file.FileCollection import org.gradle.api.file.FileSystemLocation import org.gradle.api.file.RegularFileProperty @@ -16,14 +15,11 @@ import org.gradle.api.model.ObjectFactory import org.gradle.api.provider.Property import org.gradle.api.provider.Provider import org.gradle.api.tasks.* -import org.gradle.jvm.toolchain.JavaLauncher import org.gradle.process.ExecOperations import java.nio.file.Files import javax.inject.Inject -import kotlin.io.path.deleteExisting +import kotlin.io.path.bufferedWriter import kotlin.io.path.reader -import kotlin.io.path.writer -import kotlin.io.reader @CacheableTransform abstract class RemapAction : TransformAction { @@ -94,10 +90,10 @@ abstract class RemapAction : TransformAction { val mappingsFile = Files.createTempDirectory("mappings").resolve("mappings.tiny") - cacheExpensiveOperation(parameters.cacheParameters.directory.getAsPath(), "mappings", parameters.mappings, mappingsFile) { + cacheExpensiveOperation(parameters.cacheParameters.directory.getAsPath(), "mappings", parameters.mappings, mappingsFile) { (output) -> val mappings = loadMappings(parameters.mappings, parameters.javaExecutable.get(), parameters.cacheParameters, execOperations) - mappings.accept(Tiny2Writer(it.writer(), false)) + mappings.accept(Tiny2Writer(output.bufferedWriter(), false)) } val cacheKey = objectFactory.fileCollection() @@ -106,7 +102,7 @@ abstract class RemapAction : TransformAction { cacheKey.from(parameters.mappings) cacheKey.from(inputFile.get().asFile) - cacheExpensiveOperation(parameters.cacheParameters.directory.getAsPath(), "remap", cacheKey, output.toPath()) { + cacheExpensiveOperation(parameters.cacheParameters.directory.getAsPath(), "remap", cacheKey, output.toPath()) { (output) -> println("Remapping mod $input from $sourceNamespace to $targetNamespace") val mappings = MemoryMappingTree() @@ -118,7 +114,7 @@ abstract class RemapAction : TransformAction { sourceNamespace, targetNamespace, input.toPath(), - it, + output, classpath + parameters.extraClasspath, ) } diff --git a/minecraft-codev-remapper/src/main/kotlin/net/msrandom/minecraftcodev/remapper/task/LoadMappings.kt b/minecraft-codev-remapper/src/main/kotlin/net/msrandom/minecraftcodev/remapper/task/LoadMappings.kt index 03303f8..89f37b5 100644 --- a/minecraft-codev-remapper/src/main/kotlin/net/msrandom/minecraftcodev/remapper/task/LoadMappings.kt +++ b/minecraft-codev-remapper/src/main/kotlin/net/msrandom/minecraftcodev/remapper/task/LoadMappings.kt @@ -37,10 +37,10 @@ abstract class LoadMappings : CachedMinecraftTask() { @TaskAction fun load() { - cacheExpensiveOperation(cacheParameters.directory.getAsPath(), "mappings", mappings, output.getAsPath()) { + cacheExpensiveOperation(cacheParameters.directory.getAsPath(), "mappings", mappings, output.getAsPath()) { (output) -> val mappings = loadMappings(mappings, javaExecutable.get(), cacheParameters, execOperations) - it.bufferedWriter().use { writer -> + output.bufferedWriter().use { writer -> mappings.accept(Tiny2Writer(writer, false)) } } diff --git a/minecraft-codev-remapper/src/main/kotlin/net/msrandom/minecraftcodev/remapper/task/RemapTask.kt b/minecraft-codev-remapper/src/main/kotlin/net/msrandom/minecraftcodev/remapper/task/RemapTask.kt index 888a668..0a0a696 100644 --- a/minecraft-codev-remapper/src/main/kotlin/net/msrandom/minecraftcodev/remapper/task/RemapTask.kt +++ b/minecraft-codev-remapper/src/main/kotlin/net/msrandom/minecraftcodev/remapper/task/RemapTask.kt @@ -2,25 +2,18 @@ package net.msrandom.minecraftcodev.remapper.task import net.fabricmc.mappingio.format.Tiny2Reader import net.fabricmc.mappingio.tree.MemoryMappingTree -import net.msrandom.minecraftcodev.core.task.CachedMinecraftParameters -import net.msrandom.minecraftcodev.core.task.CachedMinecraftTask import net.msrandom.minecraftcodev.core.utils.cacheExpensiveOperation import net.msrandom.minecraftcodev.core.utils.getAsPath import net.msrandom.minecraftcodev.core.utils.getGlobalCacheDirectoryProvider import net.msrandom.minecraftcodev.remapper.JarRemapper import net.msrandom.minecraftcodev.remapper.MinecraftCodevRemapperPlugin -import net.msrandom.minecraftcodev.remapper.loadMappings import org.gradle.api.DefaultTask import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.file.DirectoryProperty import org.gradle.api.file.RegularFileProperty import org.gradle.api.model.ObjectFactory -import org.gradle.api.provider.MapProperty import org.gradle.api.provider.Property import org.gradle.api.tasks.* -import org.gradle.jvm.toolchain.JavaLauncher -import org.gradle.process.ExecOperations -import java.io.File import javax.inject.Inject abstract class RemapTask : DefaultTask() { @@ -82,7 +75,7 @@ abstract class RemapTask : DefaultTask() { cacheKey.from(mappings) cacheKey.from(inputFile.get().asFile) - cacheExpensiveOperation(cacheDirectory.getAsPath(), "remap", cacheKey, outputFile.getAsPath()) { + cacheExpensiveOperation(cacheDirectory.getAsPath(), "remap", cacheKey, outputFile.getAsPath()) { (output) -> val mappings = MemoryMappingTree() Tiny2Reader.read(this.mappings.asFile.get().reader(), mappings) @@ -92,7 +85,7 @@ abstract class RemapTask : DefaultTask() { sourceNamespace.get(), targetNamespace.get(), inputFile.getAsPath(), - it, + output, classpath, ) } diff --git a/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/MinecraftCodevRunsPlugin.kt b/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/MinecraftCodevRunsPlugin.kt index d99b73c..d95346d 100644 --- a/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/MinecraftCodevRunsPlugin.kt +++ b/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/MinecraftCodevRunsPlugin.kt @@ -48,17 +48,19 @@ class MinecraftCodevRunsPlugin : Plugin { project.integrateIdeaRuns() - runs.all { builder -> - fun taskName(builder: MinecraftRunConfigurationBuilder) = - ApplicationPlugin.TASK_RUN_NAME + GUtil.toCamelCase(builder.name.replace(':', '-')) - - tasks.register(taskName(builder), JavaExec::class.java) { javaExec -> - val configuration = builder.build() - - javaExec.environment = configuration.environment.keySet().get().associateWith { - object { - override fun toString() = configuration.environment.getting(it).get() - } + runs.all { configuration -> + fun taskName(configuration: MinecraftRunConfiguration) = + ApplicationPlugin.TASK_RUN_NAME + GUtil.toCamelCase(configuration.name) + + tasks.register(taskName(configuration), JavaExec::class.java) { javaExec -> + javaExec.doFirst { + javaExec.environment.putAll(System.getenv()) + + javaExec.environment.putAll(configuration.environment.keySet().get().associateWith { + object { + override fun toString() = configuration.environment.getting(it).get() + } + }) } javaExec.javaLauncher.set(project.serviceOf().launcherFor { diff --git a/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/MinecraftRunConfiguration.kt b/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/MinecraftRunConfiguration.kt index db35c87..afdcaf9 100644 --- a/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/MinecraftRunConfiguration.kt +++ b/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/MinecraftRunConfiguration.kt @@ -3,6 +3,8 @@ package net.msrandom.minecraftcodev.runs import net.msrandom.minecraftcodev.core.task.CachedMinecraftParameters import net.msrandom.minecraftcodev.core.task.convention import net.msrandom.minecraftcodev.core.utils.extension +import org.gradle.api.Action +import org.gradle.api.Named import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.file.DirectoryProperty @@ -13,7 +15,7 @@ import java.io.File import java.nio.file.Path import javax.inject.Inject -abstract class MinecraftRunConfiguration @Inject constructor(val project: Project) { +abstract class MinecraftRunConfiguration @Inject constructor(private val name: String, val project: Project) : Named { abstract val mainClass: Property @Input get @@ -30,7 +32,7 @@ abstract class MinecraftRunConfiguration @Inject constructor(val project: Projec @Input get - abstract val dependsOn: ListProperty + abstract val dependsOn: ListProperty @Input get @@ -54,6 +56,13 @@ abstract class MinecraftRunConfiguration @Inject constructor(val project: Projec @Nested get + val friendlyName + get() = if (project == project.rootProject) { + "Run :$name" + } else { + "Run ${project.path}:$name" + } + init { run { mainClass.finalizeValueOnRead() @@ -74,6 +83,98 @@ abstract class MinecraftRunConfiguration @Inject constructor(val project: Projec } } + fun mainClass(mainClass: String) = apply { + this.mainClass.set(mainClass) + } + + fun jvmVersion(jvmVersion: Int) = apply { + this.jvmVersion.set(jvmVersion) + } + + fun sourceSet(sourceSet: String) = apply { + this.sourceSet.set(project.extension().named(sourceSet)) + } + + fun sourceSet(sourceSet: Provider) = apply { + this.sourceSet.set(sourceSet) + } + + fun sourceSet(sourceSet: SourceSet) = apply { + this.sourceSet.set(sourceSet) + } + + fun beforeRun(task: Provider) = apply { + beforeRun.add(task) + } + + fun beforeRun(vararg tasks: Task) = apply { + beforeRun.addAll(tasks.toList()) + } + + fun beforeRun(vararg taskNames: String) = apply { + for (taskName in taskNames) { + beforeRun.add(project.tasks.named(taskName)) + } + } + + fun dependsOn(vararg runConfigurations: MinecraftRunConfiguration) = apply { + dependsOn.addAll(runConfigurations.toList()) + } + + fun args(vararg args: Any?) = arguments(*args) + + fun arguments(vararg args: Any?) = apply { + + arguments.addAll(args.map(Any?::toString)) + } + + fun jvmArgs(vararg args: Any?) = jvmArguments(*args) + + fun jvmArguments(vararg args: Any?) = apply { + + jvmArguments.addAll(args.map(Any?::toString)) + } + + fun env(variables: Map) = environment(variables) + + fun env(vararg variables: Pair) = environment(*variables) + + fun env( + key: String, + value: Any, + ) = environment(key, value) + + fun environment(variables: Map) = apply { + + environment.putAll(variables.mapValues(Any::toString)) + } + + fun environment(vararg variables: Pair) = environment(variables.toMap()) + + fun environment( + key: String, + value: Any, + ) = apply { + + environment.put(key, value.toString()) + } + + fun executableDir(path: Any) = apply { + executableDirectory.set(project.file(path)) + } + + fun executableDirectory(path: Any) = apply { + executableDirectory.set(project.file(path)) + } + + fun defaults(action: Action) { + val defaults = project.extension().extension() + + defaults.configuration = this + + action.execute(defaults) + } + private fun mapArgumentPart(part: Any?) = when (part) { is Path -> part.toAbsolutePath().toString() is File -> part.absolutePath @@ -81,17 +182,20 @@ abstract class MinecraftRunConfiguration @Inject constructor(val project: Projec else -> part.toString() } - fun compileArguments(arguments: Iterable): ListProperty = project.objects.listProperty(String::class.java).apply { - for (argument in arguments) { - if (argument is Provider<*>) { - add(argument.map(::mapArgumentPart)) - } else { - add(mapArgumentPart(argument)) + fun compileArguments(arguments: Iterable): ListProperty = + project.objects.listProperty(String::class.java).apply { + for (argument in arguments) { + if (argument is Provider<*>) { + add(argument.map(::mapArgumentPart)) + } else { + add(mapArgumentPart(argument)) + } } } - } fun compileArgument(vararg parts: Any?): Provider = compileArguments(parts.toList()).map { it.joinToString("") } + + override fun getName() = name } diff --git a/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/MinecraftRunConfigurationBuilder.kt b/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/MinecraftRunConfigurationBuilder.kt deleted file mode 100644 index b1a96e8..0000000 --- a/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/MinecraftRunConfigurationBuilder.kt +++ /dev/null @@ -1,140 +0,0 @@ -package net.msrandom.minecraftcodev.runs - -import net.msrandom.minecraftcodev.core.utils.extension -import org.gradle.api.Action -import org.gradle.api.Named -import org.gradle.api.Project -import org.gradle.api.Task -import org.gradle.api.provider.Provider -import org.gradle.api.tasks.SourceSet -import org.gradle.api.tasks.SourceSetContainer -import javax.inject.Inject - -abstract class MinecraftRunConfigurationBuilder @Inject constructor(private val name: String, val project: Project) : Named { - private val setupActions = mutableListOf>() - private val configurationActions = mutableListOf>() - - val defaults: RunConfigurationDefaultsContainer - get() = project.extension().extension().also { it.builder = this } - - val friendlyName - get() = if (project == project.rootProject) { - "Run :$name" - } else { - "Run ${project.path}:$name" - } - - override fun getName() = name - - fun setup(action: Action) { - setupActions += action - } - - fun setup(action: MinecraftRunConfiguration.() -> Unit) = setup(Action(action)) - - fun action(action: Action) { - configurationActions += action - } - - fun action(action: MinecraftRunConfiguration.() -> Unit) = action(Action(action)) - - fun mainClass(mainClass: String) = apply { - action { this.mainClass.set(mainClass) } - } - - fun jvmVersion(jvmVersion: Int) = apply { - action { this.jvmVersion.set(jvmVersion) } - } - - fun sourceSet(sourceSet: String) = apply { - setup { this.sourceSet.set(project.extension().named(sourceSet)) } - } - - fun sourceSet(sourceSet: Provider) = apply { - setup { this.sourceSet.set(sourceSet) } - } - - fun sourceSet(sourceSet: SourceSet) = apply { - setup { this.sourceSet.set(sourceSet) } - } - - fun beforeRun(task: Provider) = apply { - action { beforeRun.add(task) } - } - - fun beforeRun(vararg tasks: Task) = apply { - action { beforeRun.addAll(tasks.toList()) } - } - - fun beforeRun(vararg taskNames: String) = apply { - action { - for (taskName in taskNames) { - beforeRun.add(project.tasks.named(taskName)) - } - } - } - - fun dependsOn(vararg runConfigurations: MinecraftRunConfigurationBuilder) = apply { - action { dependsOn.addAll(runConfigurations.toList()) } - } - - fun args(vararg args: Any?) = arguments(*args) - - fun arguments(vararg args: Any?) = apply { - action { - arguments.addAll(args.map(Any?::toString)) - } - } - - fun jvmArgs(vararg args: Any?) = jvmArguments(*args) - - fun jvmArguments(vararg args: Any?) = apply { - action { - jvmArguments.addAll(args.map(Any?::toString)) - } - } - - fun env(variables: Map) = environment(variables) - - fun env(vararg variables: Pair) = environment(*variables) - - fun env( - key: String, - value: Any, - ) = environment(key, value) - - fun environment(variables: Map) = apply { - action { - environment.putAll(variables.mapValues(Any::toString)) - } - } - - fun environment(vararg variables: Pair) = environment(variables.toMap()) - - fun environment( - key: String, - value: Any, - ) = apply { - action { - environment.put(key, value.toString()) - } - } - - fun executableDir(path: Any) = apply { - action { executableDirectory.set(project.file(path)) } - } - - fun executableDirectory(path: Any) = apply { - action { executableDirectory.set(project.file(path)) } - } - - internal fun build() = project.objects.newInstance(MinecraftRunConfiguration::class.java).also { - for (action in setupActions) { - action.execute(it) - } - - for (action in configurationActions) { - action.execute(it) - } - } -} diff --git a/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/RunConfigurationDefaultsContainer.kt b/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/RunConfigurationDefaultsContainer.kt index 9c563b6..f638ef2 100644 --- a/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/RunConfigurationDefaultsContainer.kt +++ b/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/RunConfigurationDefaultsContainer.kt @@ -27,10 +27,10 @@ import kotlin.io.path.readText import kotlin.random.Random abstract class RunConfigurationDefaultsContainer : ExtensionAware { - lateinit var builder: MinecraftRunConfigurationBuilder + lateinit var configuration: MinecraftRunConfiguration fun client(minecraftVersion: Provider) { - builder.action { + configuration.apply { val manifest = getManifest(minecraftVersion) val extractNativesTask = @@ -148,7 +148,7 @@ abstract class RunConfigurationDefaultsContainer : ExtensionAware { } fun server(minecraftVersion: Provider) { - builder.action { + configuration.apply { val manifestProvider = getManifest(minecraftVersion) arguments.add("nogui") diff --git a/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/RunsContainer.kt b/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/RunsContainer.kt index 5fdb5e2..579564c 100644 --- a/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/RunsContainer.kt +++ b/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/RunsContainer.kt @@ -8,7 +8,7 @@ import org.gradle.api.plugins.ExtensionAware import org.gradle.api.provider.Provider import javax.inject.Inject -sealed interface RunsContainer : NamedDomainObjectContainer, ExtensionAware { +sealed interface RunsContainer : NamedDomainObjectContainer, ExtensionAware { /** * Directory used for storing download asset objects & indexes */ @@ -24,7 +24,7 @@ abstract class RunsContainerImpl @Inject constructor( cacheDirectory: Provider, objects: ObjectFactory, ) : - RunsContainer, NamedDomainObjectContainer by objects.domainObjectContainer(MinecraftRunConfigurationBuilder::class.java) { + RunsContainer, NamedDomainObjectContainer by objects.domainObjectContainer(MinecraftRunConfiguration::class.java) { init { apply { assetsDirectory.convention(cacheDirectory.map { it.dir("assets") }) diff --git a/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/integrateIdeaRuns.kt b/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/integrateIdeaRuns.kt index 8d9ef51..2cdef09 100644 --- a/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/integrateIdeaRuns.kt +++ b/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/integrateIdeaRuns.kt @@ -7,10 +7,8 @@ import org.gradle.plugins.ide.idea.model.IdeaModel import org.jetbrains.gradle.ext.* import javax.inject.Inject -private fun setupIdeaRun(project: Project, runConfigurations: RunConfigurationContainer, builder: MinecraftRunConfigurationBuilder) { - runConfigurations.register(builder.friendlyName, Application::class.java) { application -> - val config = builder.build() - +private fun setupIdeaRun(project: Project, runConfigurations: RunConfigurationContainer, config: MinecraftRunConfiguration) { + runConfigurations.register(config.friendlyName, Application::class.java) { application -> // TODO the .get()s are broken due to the tasks are not executed. We need to make it so you can query the task inputs without requiring the task execution. application.mainClass = config.mainClass.get() application.workingDirectory = config.executableDirectory.get().asFile.absolutePath @@ -55,8 +53,8 @@ fun Project.integrateIdeaRuns() { allprojects { otherProject -> otherProject.plugins.withType(MinecraftCodevRunsPlugin::class.java) { otherProject.extension() - .all { builder -> - setupIdeaRun(otherProject, runConfigurations, builder) + .all { configuration -> + setupIdeaRun(otherProject, runConfigurations, configuration) } } } diff --git a/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/task/ExtractNatives.kt b/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/task/ExtractNatives.kt index 7bbc52e..a254689 100644 --- a/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/task/ExtractNatives.kt +++ b/minecraft-codev-runs/src/main/kotlin/net/msrandom/minecraftcodev/runs/task/ExtractNatives.kt @@ -11,11 +11,14 @@ import org.gradle.api.artifacts.ConfigurationContainer import org.gradle.api.artifacts.component.ModuleComponentIdentifier import org.gradle.api.artifacts.dsl.DependencyHandler import org.gradle.api.file.DirectoryProperty +import org.gradle.api.model.ObjectFactory import org.gradle.api.provider.Property import org.gradle.api.tasks.CacheableTask import org.gradle.api.tasks.Input import org.gradle.api.tasks.OutputDirectory import org.gradle.api.tasks.TaskAction +import org.gradle.nativeplatform.OperatingSystemFamily +import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform import java.nio.file.Path import java.nio.file.StandardCopyOption import javax.inject.Inject @@ -37,6 +40,9 @@ abstract class ExtractNatives : CachedMinecraftTask() { abstract val dependencyHandler: DependencyHandler @Inject get + abstract val objects: ObjectFactory + @Inject get + init { destinationDirectory.convention(project.layout.dir(project.provider { temporaryDir })) } @@ -60,7 +66,9 @@ abstract class ExtractNatives : CachedMinecraftTask() { dependencyHandler.create("${it.name}:$classifier") to it.extract } - val config = configurationContainer.detachedConfiguration(*libs.keys.toTypedArray()) + val config = configurationContainer.detachedConfiguration(*libs.keys.toTypedArray()).apply { + attributes.attribute(OperatingSystemFamily.OPERATING_SYSTEM_ATTRIBUTE, objects.named(OperatingSystemFamily::class.java, DefaultNativePlatform.host().operatingSystem.toFamilyName())) + } val artifactView = config.incoming.artifactView { view -> view.componentFilter {