diff --git a/docs/MULTIPLE.md b/docs/MULTIPLE.md index 30f8d8b8..fb9b0fdb 100644 --- a/docs/MULTIPLE.md +++ b/docs/MULTIPLE.md @@ -33,6 +33,22 @@ unimined.minecraft { accessWidener { accessWidener "src/main/resources/accessWidenerName.aw" } + + // you may want to set this if you want to include architectury mods in common + mods.modImplementation { + namespace("intermediary") + } + + // if you don't want to build/remap a "common" jar + if (sourceSet == sourceSets.main) { + defaultRemapJar = false + } +} + +// if not disabling remapJar above, +// you may want to set this so the "common" jar is in intermediary to match architectury +tasks.named("remapJar") { + prodNamespace("intermediary") } // forge @@ -80,6 +96,22 @@ unimined.minecraft { accessWidener { accessWidener "src/main/resources/accessWidenerName.aw" } + + // you may want to set this if you want to include arch mods in common + mods.modImplementation { + namespace("intermediary") + } + + // if you don't want to build/remap a "common" jar + if (sourceSet == sourceSets.main) { + defaultRemapJar = false + } +} + +// if not disabling remapJar above, +// you may want to set this so the "common" jar is in intermediary to match architectury +tasks.named("remapJar") { + prodNamespace("intermediary") } ``` diff --git a/docs/USAGE.md b/docs/USAGE.md index b3cb679a..21fa1844 100644 --- a/docs/USAGE.md +++ b/docs/USAGE.md @@ -99,7 +99,14 @@ configurations { unimined.minecraft { ... mods { - remap(configurations.modCompileOnly) + remap(configurations.modCompileOnly) { + } + + // this is basically just a shortcut for `remap(configurations.modImplementation)` + modImplementation { + // you can do this is mods have the wrong access widener mapping, but it may break runs + catchAWNamespaceAssertion() + } } } diff --git a/src/api/kotlin/xyz/wagyourtail/unimined/api/minecraft/MinecraftConfig.kt b/src/api/kotlin/xyz/wagyourtail/unimined/api/minecraft/MinecraftConfig.kt index 62d83867..884f3043 100644 --- a/src/api/kotlin/xyz/wagyourtail/unimined/api/minecraft/MinecraftConfig.kt +++ b/src/api/kotlin/xyz/wagyourtail/unimined/api/minecraft/MinecraftConfig.kt @@ -19,7 +19,9 @@ import xyz.wagyourtail.unimined.api.minecraft.resolver.MinecraftData import xyz.wagyourtail.unimined.api.mod.ModsConfig import xyz.wagyourtail.unimined.api.runs.RunsConfig import xyz.wagyourtail.unimined.api.source.SourceConfig +import xyz.wagyourtail.unimined.api.minecraft.task.AbstractRemapJarTask import xyz.wagyourtail.unimined.api.minecraft.task.RemapJarTask +import xyz.wagyourtail.unimined.api.minecraft.task.RemapSourcesJarTask import xyz.wagyourtail.unimined.api.unimined import xyz.wagyourtail.unimined.mapping.EnvType import xyz.wagyourtail.unimined.mapping.Namespace @@ -183,7 +185,7 @@ abstract class MinecraftConfig(val project: Project, val sourceSet: SourceSet) : val proj = this.project.project(path) combineWith(proj, proj.sourceSets.getByName(name)) } - }; + } /** * the minecraft version to use @@ -260,6 +262,63 @@ abstract class MinecraftConfig(val project: Project, val sourceSet: SourceSet) : } } + /** + * @since 1.3.10 + */ + fun remapSources(task: Task) { + remapSources(task) {} + } + + /** + * @since 1.3.10 + */ + fun remapSources(task: Task, action: RemapSourcesJarTask.() -> Unit) { + remapSources(task, "remap${task.name.capitalized()}", action) + } + + /** + * @since 1.3.10 + */ + fun remapSources( + task: Task, + @DelegatesTo(value = RemapSourcesJarTask::class, strategy = Closure.DELEGATE_FIRST) + action: Closure<*> + ) { + remapSources(task) { + action.delegate = this + action.resolveStrategy = Closure.DELEGATE_FIRST + action.call() + } + } + + /** + * @since 1.3.10 + */ + fun remapSources(task: Task, name: String) { + remapSources(task, name) {} + } + + /** + * @since 1.3.10 + */ + abstract fun remapSources(task: Task, name: String, action: RemapSourcesJarTask.() -> Unit) + + /** + * @since 1.3.10 + */ + fun remapSources( + task: Task, + name: String, + @DelegatesTo(value = RemapSourcesJarTask::class, strategy = Closure.DELEGATE_FIRST) + action: Closure<*> + ) { + remapSources(task, name) { + action.delegate = this + action.resolveStrategy = Closure.DELEGATE_FIRST + action.call() + } + } + fun mods(action: ModsConfig.() -> Unit) { mods.action() } diff --git a/src/api/kotlin/xyz/wagyourtail/unimined/api/minecraft/patch/MinecraftPatcher.kt b/src/api/kotlin/xyz/wagyourtail/unimined/api/minecraft/patch/MinecraftPatcher.kt index 03e38932..e412d655 100644 --- a/src/api/kotlin/xyz/wagyourtail/unimined/api/minecraft/patch/MinecraftPatcher.kt +++ b/src/api/kotlin/xyz/wagyourtail/unimined/api/minecraft/patch/MinecraftPatcher.kt @@ -5,6 +5,7 @@ import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream import org.gradle.api.file.FileCollection import org.jetbrains.annotations.ApiStatus import org.objectweb.asm.tree.ClassNode +import xyz.wagyourtail.unimined.api.minecraft.task.AbstractRemapJarTask import xyz.wagyourtail.unimined.api.minecraft.task.RemapJarTask import xyz.wagyourtail.unimined.mapping.Namespace import java.nio.file.FileSystem @@ -53,10 +54,10 @@ interface MinecraftPatcher { } @ApiStatus.Internal - fun beforeRemapJarTask(remapJarTask: RemapJarTask, input: Path): Path + fun beforeRemapJarTask(remapJarTask: AbstractRemapJarTask, input: Path): Path @ApiStatus.Internal - fun afterRemapJarTask(remapJarTask: RemapJarTask, output: Path) + fun afterRemapJarTask(remapJarTask: AbstractRemapJarTask, output: Path) @get:ApiStatus.Internal @set:ApiStatus.Experimental @@ -67,7 +68,7 @@ interface MinecraftPatcher { var unprotectRuntime: Boolean @ApiStatus.Internal - fun configureRemapJar(task: RemapJarTask) + fun configureRemapJar(task: AbstractRemapJarTask) @ApiStatus.Internal fun createSourcesJar(classpath: FileCollection, patchedJar: Path, outputPath: Path, linemappedPath: Path?) diff --git a/src/api/kotlin/xyz/wagyourtail/unimined/api/minecraft/task/AbstractRemapJarTask.kt b/src/api/kotlin/xyz/wagyourtail/unimined/api/minecraft/task/AbstractRemapJarTask.kt new file mode 100644 index 00000000..738dbbb8 --- /dev/null +++ b/src/api/kotlin/xyz/wagyourtail/unimined/api/minecraft/task/AbstractRemapJarTask.kt @@ -0,0 +1,71 @@ +package xyz.wagyourtail.unimined.api.minecraft.task + +import groovy.lang.Closure +import groovy.lang.DelegatesTo +import org.gradle.api.file.RegularFileProperty +import org.gradle.api.provider.Property +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.Internal +import org.gradle.api.tasks.Optional +import org.gradle.api.tasks.bundling.Jar +import org.jetbrains.annotations.ApiStatus +import xyz.wagyourtail.unimined.api.mapping.mixin.MixinRemapOptions +import xyz.wagyourtail.unimined.mapping.Namespace +import xyz.wagyourtail.unimined.util.FinalizeOnRead + +/** + * task responsible for transforming your built jar to production. + * @since 0.1.0 + */ +@Suppress("LeakingThis") +abstract class AbstractRemapJarTask : Jar() { + + @get:InputFile + abstract val inputFile: RegularFileProperty + + @get:Internal + @set:Internal + var devNamespace: Namespace? by FinalizeOnRead(null) + + @get:Internal + @set:Internal + var prodNamespace: Namespace? by FinalizeOnRead(null) + + /** + * whether to remap AccessTransformers to the legacy format (<=1.7.10) + */ + @get:Input + @get:Optional + abstract val remapATToLegacy: Property + + @get:Internal + @set:Internal + @set:ApiStatus.Experimental + abstract var allowImplicitWildcards: Boolean + + abstract fun devNamespace(namespace: String) + + @Deprecated(message = "no longer needed", replaceWith = ReplaceWith("")) + fun devFallbackNamespace(namespace: String) {} + + abstract fun prodNamespace(namespace: String) + + abstract fun mixinRemap(action: MixinRemapOptions.() -> Unit) + + fun mixinRemap( + @DelegatesTo(value = MixinRemapOptions::class, strategy = Closure.DELEGATE_FIRST) + action: Closure<*> + ) { + mixinRemap { + action.delegate = this + action.resolveStrategy = Closure.DELEGATE_FIRST + action.call() + } + } + + init { + remapATToLegacy.convention(null as Boolean?).finalizeValueOnRead() + } + +} \ No newline at end of file diff --git a/src/api/kotlin/xyz/wagyourtail/unimined/api/minecraft/task/RemapJarTask.kt b/src/api/kotlin/xyz/wagyourtail/unimined/api/minecraft/task/RemapJarTask.kt index 4e557b0a..75798f70 100644 --- a/src/api/kotlin/xyz/wagyourtail/unimined/api/minecraft/task/RemapJarTask.kt +++ b/src/api/kotlin/xyz/wagyourtail/unimined/api/minecraft/task/RemapJarTask.kt @@ -1,68 +1,5 @@ package xyz.wagyourtail.unimined.api.minecraft.task -import groovy.lang.Closure -import groovy.lang.DelegatesTo -import org.gradle.api.file.RegularFileProperty -import org.gradle.api.provider.Property -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.InputFile -import org.gradle.api.tasks.Internal -import org.gradle.api.tasks.Optional -import org.gradle.jvm.tasks.Jar -import org.jetbrains.annotations.ApiStatus -import xyz.wagyourtail.unimined.api.mapping.mixin.MixinRemapOptions -import xyz.wagyourtail.unimined.mapping.Namespace -import xyz.wagyourtail.unimined.util.FinalizeOnRead +import xyz.wagyourtail.unimined.util.JarInterface -/** - * task responsible for transforming your built jar to production. - * @since 0.1.0 - */ -@Suppress("LeakingThis") -abstract class RemapJarTask : Jar() { - - @get:InputFile - abstract val inputFile: RegularFileProperty - - @get:Internal - @set:Internal - var devNamespace: Namespace? by FinalizeOnRead(null) - - @get:Internal - @set:Internal - var prodNamespace: Namespace? by FinalizeOnRead(null) - - /** - * whether to remap AccessTransformers to the legacy format (<=1.7.10) - */ - @get:Input - @get:Optional - abstract val remapATToLegacy: Property - - @get:Internal - @set:Internal - @set:ApiStatus.Experimental - abstract var allowImplicitWildcards: Boolean - - abstract fun devNamespace(namespace: String) - - abstract fun prodNamespace(namespace: String) - - abstract fun mixinRemap(action: MixinRemapOptions.() -> Unit) - - fun mixinRemap( - @DelegatesTo(value = MixinRemapOptions::class, strategy = Closure.DELEGATE_FIRST) - action: Closure<*> - ) { - mixinRemap { - action.delegate = this - action.resolveStrategy = Closure.DELEGATE_FIRST - action.call() - } - } - - init { - remapATToLegacy.convention(null as Boolean?).finalizeValueOnRead() - } - -} \ No newline at end of file +interface RemapJarTask : JarInterface \ No newline at end of file diff --git a/src/api/kotlin/xyz/wagyourtail/unimined/api/minecraft/task/RemapSourcesJarTask.kt b/src/api/kotlin/xyz/wagyourtail/unimined/api/minecraft/task/RemapSourcesJarTask.kt new file mode 100644 index 00000000..3b99e15f --- /dev/null +++ b/src/api/kotlin/xyz/wagyourtail/unimined/api/minecraft/task/RemapSourcesJarTask.kt @@ -0,0 +1,5 @@ +package xyz.wagyourtail.unimined.api.minecraft.task + +import xyz.wagyourtail.unimined.util.JarInterface + +interface RemapSourcesJarTask : JarInterface \ No newline at end of file diff --git a/src/api/kotlin/xyz/wagyourtail/unimined/api/source/remapper/SourceRemapper.kt b/src/api/kotlin/xyz/wagyourtail/unimined/api/source/remapper/SourceRemapper.kt index d31dab48..bccdfdc0 100644 --- a/src/api/kotlin/xyz/wagyourtail/unimined/api/source/remapper/SourceRemapper.kt +++ b/src/api/kotlin/xyz/wagyourtail/unimined/api/source/remapper/SourceRemapper.kt @@ -2,8 +2,9 @@ package xyz.wagyourtail.unimined.api.source.remapper import groovy.lang.Closure import groovy.lang.DelegatesTo -import org.gradle.api.artifacts.Dependency +import org.gradle.api.artifacts.ExternalModuleDependency import org.gradle.api.file.FileCollection +import org.gradle.process.JavaExecSpec import org.jetbrains.annotations.ApiStatus import xyz.wagyourtail.unimined.mapping.Namespace import java.nio.file.Path @@ -25,11 +26,11 @@ interface SourceRemapper { * set the remapper to use (defaults to https://github.com/unimined/source-remap) * @since 1.2.0 */ - fun remapper(dep: Any, action: Dependency.() -> Unit) + fun remapper(dep: Any, action: ExternalModuleDependency.() -> Unit) fun remapper( dep: Any, - @DelegatesTo(value = Dependency::class, strategy = Closure.DELEGATE_FIRST) + @DelegatesTo(value = ExternalModuleDependency::class, strategy = Closure.DELEGATE_FIRST) action: Closure<*> ) { remapper(dep) { @@ -44,6 +45,7 @@ interface SourceRemapper { inputOutput: Map, classpath: FileCollection, source: Namespace, - target: Namespace + target: Namespace, + specConfig: JavaExecSpec.() -> Unit = {} ) } \ No newline at end of file diff --git a/src/api/kotlin/xyz/wagyourtail/unimined/util/JarInterface.kt b/src/api/kotlin/xyz/wagyourtail/unimined/util/JarInterface.kt new file mode 100644 index 00000000..03f973d5 --- /dev/null +++ b/src/api/kotlin/xyz/wagyourtail/unimined/util/JarInterface.kt @@ -0,0 +1,29 @@ +package xyz.wagyourtail.unimined.util + +import groovy.lang.Closure +import groovy.lang.DelegatesTo +import org.gradle.api.Task +import org.gradle.api.tasks.Internal +import org.gradle.api.tasks.bundling.Jar + +interface JarInterface : Task { + + @Suppress("UNCHECKED_CAST") + val asJar: T + @Internal + get() = this as T + + fun asJar(action: T.() -> Unit) { + asJar.action() + } + + fun asJar( + @DelegatesTo(Jar::class, strategy = Closure.DELEGATE_FIRST) + closure: Closure<*> + ) { + asJar { + closure.delegate = this + closure.call() + } + } +} \ No newline at end of file diff --git a/src/api/kotlin/xyz/wagyourtail/unimined/util/Utils.kt b/src/api/kotlin/xyz/wagyourtail/unimined/util/Utils.kt index cf40e3d5..30cf3a49 100644 --- a/src/api/kotlin/xyz/wagyourtail/unimined/util/Utils.kt +++ b/src/api/kotlin/xyz/wagyourtail/unimined/util/Utils.kt @@ -154,14 +154,15 @@ fun Project.cachingDownload(url: String): Path { fun Project.cachingDownload( url: URI, size: Long = -1L, - sha1: String = "", + sha1: String? = null, cachePath: Path = unimined.getGlobalCache().resolve(url.path.substring(1)), + ignoreShaOnCache: Boolean = false, expireTime: Duration = 1.days, retryCount: Int = 3, backoff: (Int) -> Int = { 1000 * 3.0.pow(it.toDouble()).toInt() }, // first backoff -> 1s, second -> 3s, third -> 9s ): Path { if (gradle.startParameter.isOffline) { - if (testSha1(size, sha1, cachePath, Long.MAX_VALUE.milliseconds)) { + if (testSha1(size, if (ignoreShaOnCache) null else sha1, cachePath, Duration.INFINITE)) { return cachePath } if (cachePath.exists()) { @@ -170,10 +171,21 @@ fun Project.cachingDownload( throw IllegalStateException("cached $url at $cachePath doesn't exist and offline mode is enabled") } } - if (testSha1(size, sha1, cachePath, if (gradle.startParameter.isRefreshDependencies || project.unimined.forceReload) 0.seconds else expireTime)) { + + val cacheTime = if (gradle.startParameter.isRefreshDependencies || project.unimined.forceReload) 0.seconds + else if (ignoreShaOnCache) Duration.INFINITE + else expireTime + + if (testSha1( + size, + if (ignoreShaOnCache) null else sha1, + cachePath, + cacheTime + )) { logger.info("[Unimined/Cache] Using cached $url at $cachePath") return cachePath } + var exception: Exception? = null cachePath.parent?.createDirectories() logger.info("[Unimined/Cache] Downloading $url to $cachePath") @@ -197,17 +209,20 @@ fun Project.cachingDownload( logger.warn("[Unimined/Cache] Failed to download $url, retrying in ${backoff(i)}ms...") Thread.sleep(backoff(i).toLong()) } + + // should only happen if ignoreShaOnCache is false if (testSha1(size, sha1, cachePath, Long.MAX_VALUE.milliseconds)) { logger.warn("[Unimined/Cache] Falling back on expired cache $cachePath for $url") return cachePath } + throw IllegalStateException("Failed to download $url", exception) } -fun testSha1(size: Long, sha1: String, path: Path, expireTime: Duration = 1.days): Boolean { +fun testSha1(size: Long, sha1: String?, path: Path, expireTime: Duration = 1.days): Boolean { if (path.exists()) { if (path.fileSize() == size || size == -1L) { - if (sha1.isEmpty()) { + if (sha1.isNullOrEmpty()) { // fallback: expire if older than a day return path.getLastModifiedTime().toMillis() > System.currentTimeMillis() - expireTime.inWholeMilliseconds } diff --git a/src/mapping/kotlin/xyz/wagyourtail/unimined/internal/mapping/extension/PerInputTagExtension.kt b/src/mapping/kotlin/xyz/wagyourtail/unimined/internal/mapping/extension/PerInputTagExtension.kt index ba930488..a45f4a61 100644 --- a/src/mapping/kotlin/xyz/wagyourtail/unimined/internal/mapping/extension/PerInputTagExtension.kt +++ b/src/mapping/kotlin/xyz/wagyourtail/unimined/internal/mapping/extension/PerInputTagExtension.kt @@ -16,12 +16,12 @@ abstract class PerInputTagExtension object SKIP companion object { - fun getInputTag(cls: TrClass): List? { - if (cls !is ClassInstance) return null + fun getInputTag(cls: TrClass): List { + if (cls !is ClassInstance) return listOf(null) // InputTag[] getInputTags() ClassInstance::class.java.getDeclaredMethod("getInputTags").apply { isAccessible = true - val arr = (invoke(cls) as Array?) ?: return null + val arr = (invoke(cls) as Array?) ?: return listOf(null) return arr.toList() } } @@ -73,14 +73,12 @@ abstract class PerInputTagExtension private fun preApplyVisitor(cls: TrClass, next: ClassVisitor): ClassVisitor { val tags = getInputTag(cls) - return tags?.reduce(next) { ni -> inputTagExtensions[this]!!.preApplyVisitor(cls, ni) } - ?: inputTagExtensions[SKIP]!!.preApplyVisitor(cls, next) + return tags.reduce(next) { ni -> inputTagExtensions[this ?: SKIP]!!.preApplyVisitor(cls, ni) } } private fun postApplyVisitor(cls: TrClass, next: ClassVisitor): ClassVisitor { val tags = getInputTag(cls) - return tags?.reduce(next) { ni -> inputTagExtensions[this]!!.postApplyVisitor(cls, ni) } - ?: inputTagExtensions[SKIP]!!.postApplyVisitor(cls, next) + return tags.reduce(next) { ni -> inputTagExtensions[this ?: SKIP]!!.postApplyVisitor(cls, ni) } } fun insertExtra(tag: InputTag, fs: FileSystem) { diff --git a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/MinecraftProvider.kt b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/MinecraftProvider.kt index a24e1552..19c1dd66 100644 --- a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/MinecraftProvider.kt +++ b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/MinecraftProvider.kt @@ -28,7 +28,9 @@ import xyz.wagyourtail.unimined.api.minecraft.patch.forge.MinecraftForgePatcher import xyz.wagyourtail.unimined.api.minecraft.patch.forge.NeoForgedPatcher import xyz.wagyourtail.unimined.api.minecraft.patch.jarmod.JarModAgentPatcher import xyz.wagyourtail.unimined.api.minecraft.patch.rift.RiftPatcher +import xyz.wagyourtail.unimined.api.minecraft.task.AbstractRemapJarTask import xyz.wagyourtail.unimined.api.minecraft.task.RemapJarTask +import xyz.wagyourtail.unimined.api.minecraft.task.RemapSourcesJarTask import xyz.wagyourtail.unimined.api.unimined import xyz.wagyourtail.unimined.api.uniminedMaybe import xyz.wagyourtail.unimined.internal.mapping.MappingsProvider @@ -52,6 +54,7 @@ import xyz.wagyourtail.unimined.internal.minecraft.resolver.Library import xyz.wagyourtail.unimined.internal.minecraft.resolver.MinecraftDownloader import xyz.wagyourtail.unimined.internal.minecraft.task.GenSourcesTaskImpl import xyz.wagyourtail.unimined.internal.minecraft.task.RemapJarTaskImpl +import xyz.wagyourtail.unimined.internal.minecraft.task.RemapSourcesJarTaskImpl import xyz.wagyourtail.unimined.internal.mods.ModsProvider import xyz.wagyourtail.unimined.internal.runs.RunsProvider import xyz.wagyourtail.unimined.internal.source.SourceProvider @@ -146,6 +149,18 @@ open class MinecraftProvider(project: Project, sourceSet: SourceSet) : Minecraft } } + override fun remapSources(task: Task, name: String, action: RemapSourcesJarTask.() -> Unit) { + val remapTask = project.tasks.register(name, RemapSourcesJarTaskImpl::class.java, this) + remapTask.configure { + it.dependsOn(task) + if (task is Jar) { + it.inputFile.set(task.archiveFile) + } + it.action() + mcPatcher.configureRemapJar(it) + } + } + override val mergedOfficialMinecraftFile: File? by lazy { val client = minecraftData.minecraftClient if (!client.path.exists()) throw IOException("minecraft path $client does not exist") @@ -396,7 +411,7 @@ open class MinecraftProvider(project: Project, sourceSet: SourceSet) : Minecraft protected val extractDependencies: MutableMap = mutableMapOf() - fun filterLibrary(lib: Library): Library? { + private fun filterLibrary(lib: Library): Library? { val lib2 = (mcPatcher as AbstractMinecraftTransformer).libraryFilter(lib) if (lib2 != null) { for (filter in libraryReplaceMap) { @@ -437,6 +452,70 @@ open class MinecraftProvider(project: Project, sourceSet: SourceSet) : Minecraft } } + private fun applyDefaultRemapJars() { + applyDefaultRemapJar("jar", ::remap) { + from(sourceSet.output) + archiveClassifier.set(sourceSet.name) + from(combinedWithList.map { it.second.output }) + } + + applyDefaultRemapJar("sourcesJar", ::remapSources) { + from(sourceSet.allSource) + archiveClassifier.set("${sourceSet.name}-sources") + from(combinedWithList.map { it.second.allSource }) + } + } + + private inline fun applyDefaultRemapJar( + inputTaskName: String, + remappingFunction: (Task, JarInterface.() -> Unit) -> Unit, + crossinline defaultTaskConfiguration: Jar.() -> Unit + ) where T : AbstractRemapJarTask, T : JarInterface { + + var inputTask = project.tasks.findByName(inputTaskName.withSourceSet(sourceSet)) + if (inputTask == null && createJarTask) { + project.logger.info("[Unimined/Minecraft ${project.path}:${sourceSet.name}] Creating default $inputTaskName for $sourceSet") + inputTask = project.tasks.create(inputTaskName.withSourceSet(sourceSet), Jar::class.java) { + it.group = "build" + defaultTaskConfiguration(it) + } + } else if (inputTask != null) { + if (inputTask is Jar) { + inputTask.also { + it.from(sourceSet.allSource) + for ((_, sourceSet) in combinedWithList) { + it.from(sourceSet.allSource) + } + } + } else { + project.logger.warn("[Unimined/Minecraft ${project.path}:${sourceSet.name}] task $inputTaskName for $sourceSet is not an instance of ${Jar::class.qualifiedName}") + return + } + } + + if (inputTask != null && inputTask is Jar) { + val classifier: String = inputTask.archiveClassifier.getOrElse("") + inputTask.apply { + if (classifier.isNotEmpty()) { + archiveClassifier.set("$classifier-dev") + } else { + archiveClassifier.set("dev") + } + } + remappingFunction(inputTask) { + group = "unimined" + description = "Remaps $inputTask's output jar" + asJar.archiveClassifier.set(classifier) + } + project.tasks.getByName("build").dependsOn("remap" + inputTask.name.capitalized()) + } else { + project.logger.warn( + "[Unimined/Minecraft ${project.path}:${sourceSet.name}] Could not find default task '${inputTaskName.withSourceSet(sourceSet)} for $sourceSet." + ) + project.logger.warn("[Unimined/Minecraft ${project.path}:${sourceSet.name}] add manually with `remapSources(task)` in the minecraft block for $sourceSet") + } + } + fun applyRunConfigs() { project.logger.lifecycle("[Unimined/Minecraft ${project.path}:${sourceSet.name}] Applying run configs") when (side) { @@ -531,52 +610,8 @@ open class MinecraftProvider(project: Project, sourceSet: SourceSet) : Minecraft // add minecraft libraries if (mcPatcher.addVanillaLibraries) addLibraries(minecraftData.metadata.libraries) - // create remapjar task if (defaultRemapJar) { - var task = project.tasks.findByName("jar".withSourceSet(sourceSet)) - if (task == null && createJarTask) { - project.logger.info("[Unimined/Minecraft ${project.path}:${sourceSet.name}] Creating default jar task for $sourceSet") - task = project.tasks.create("jar".withSourceSet(sourceSet), Jar::class.java) { - it.group = "build" - it.from(sourceSet.output) - it.archiveClassifier.set(sourceSet.name) - for ((_, sourceSet) in combinedWithList) { - it.from(sourceSet.output) - } - } - } else if (task != null) { - (task as Jar).also { - it.from(sourceSet.output) - for ((_, sourceSet) in combinedWithList) { - it.from(sourceSet.output) - } - } - } - if (task != null && task is Jar) { - val classifier: String= task.archiveClassifier.getOrElse("") - task.apply { - if (classifier.isNotEmpty()) { - archiveClassifier.set("$classifier-dev") - } else { - archiveClassifier.set("dev") - } - } - remap(task) { - group = "unimined" - description = "Remaps $task's output jar" - archiveClassifier.set(classifier) - } - project.tasks.getByName("build").dependsOn("remap" + "jar".withSourceSet(sourceSet).capitalized()) - } else { - project.logger.warn( - "[Unimined/Minecraft ${project.path}:${sourceSet.name}] Could not find default jar task for $sourceSet. named: ${ - "jar".withSourceSet( - sourceSet - ) - }." - ) - project.logger.warn("[Unimined/Minecraft ${project.path}:${sourceSet.name}] add manually with `remap(task)` in the minecraft block for $sourceSet") - } + applyDefaultRemapJars() } // apply minecraft patcher changes diff --git a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/AbstractMinecraftTransformer.kt b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/AbstractMinecraftTransformer.kt index aaf0c6e3..3f30276b 100644 --- a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/AbstractMinecraftTransformer.kt +++ b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/AbstractMinecraftTransformer.kt @@ -13,7 +13,7 @@ import xyz.wagyourtail.unimined.api.minecraft.MinecraftConfig import xyz.wagyourtail.unimined.api.minecraft.MinecraftJar import xyz.wagyourtail.unimined.api.minecraft.patch.MinecraftPatcher import xyz.wagyourtail.unimined.api.runs.RunConfig -import xyz.wagyourtail.unimined.api.minecraft.task.RemapJarTask +import xyz.wagyourtail.unimined.api.minecraft.task.AbstractRemapJarTask import xyz.wagyourtail.unimined.api.unimined import xyz.wagyourtail.unimined.api.uniminedMaybe import xyz.wagyourtail.unimined.internal.minecraft.MinecraftProvider @@ -224,12 +224,12 @@ abstract class AbstractMinecraftTransformer protected constructor( return baseMinecraft } - override fun beforeRemapJarTask(remapJarTask: RemapJarTask, input: Path): Path { + override fun beforeRemapJarTask(remapJarTask: AbstractRemapJarTask, input: Path): Path { return input } @ApiStatus.Internal - override fun afterRemapJarTask(remapJarTask: RemapJarTask, output: Path) { + override fun afterRemapJarTask(remapJarTask: AbstractRemapJarTask, output: Path) { // do nothing } @@ -304,7 +304,7 @@ abstract class AbstractMinecraftTransformer protected constructor( output[sourceSet] = out } - override fun configureRemapJar(task: RemapJarTask) {} + override fun configureRemapJar(task: AbstractRemapJarTask) {} override fun createSourcesJar(classpath: FileCollection, patchedJar: Path, outputPath: Path, linemappedPath: Path?) { provider.sourceProvider.sourceGenerator.generate(provider.sourceSet.compileClasspath, patchedJar, outputPath, linemappedPath) diff --git a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/fabric/FabricLikeMinecraftTransformer.kt b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/fabric/FabricLikeMinecraftTransformer.kt index 9d2ff88e..f5b939e4 100644 --- a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/fabric/FabricLikeMinecraftTransformer.kt +++ b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/fabric/FabricLikeMinecraftTransformer.kt @@ -14,6 +14,8 @@ import xyz.wagyourtail.unimined.api.minecraft.patch.ataw.AccessWidenerPatcher import xyz.wagyourtail.unimined.api.minecraft.patch.fabric.FabricLikePatcher import xyz.wagyourtail.unimined.api.minecraft.task.RemapJarTask import xyz.wagyourtail.unimined.api.runs.RunConfig +import xyz.wagyourtail.unimined.api.mapping.task.ExportMappingsTask +import xyz.wagyourtail.unimined.api.minecraft.task.AbstractRemapJarTask import xyz.wagyourtail.unimined.api.unimined import xyz.wagyourtail.unimined.api.uniminedMaybe import xyz.wagyourtail.unimined.internal.mapping.ii.InterfaceInjectionMinecraftTransformer @@ -21,7 +23,6 @@ import xyz.wagyourtail.unimined.internal.mapping.task.ExportMappingsTaskImpl import xyz.wagyourtail.unimined.internal.minecraft.MinecraftProvider import xyz.wagyourtail.unimined.internal.minecraft.patch.AbstractMinecraftTransformer import xyz.wagyourtail.unimined.internal.minecraft.patch.access.widener.AccessWidenerMinecraftTransformer -import xyz.wagyourtail.unimined.internal.minecraft.patch.reindev.ReIndevProvider import xyz.wagyourtail.unimined.internal.minecraft.resolver.Library import xyz.wagyourtail.unimined.internal.minecraft.resolver.parseLibrary import xyz.wagyourtail.unimined.internal.minecraft.transform.merge.ClassMerger @@ -330,7 +331,7 @@ abstract class FabricLikeMinecraftTransformer( icp } - override fun afterRemapJarTask(remapJarTask: RemapJarTask, output: Path) { + override fun afterRemapJarTask(remapJarTask: AbstractRemapJarTask, output: Path) { insertIncludes(output) insertAW(output) } diff --git a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/fabric/FlintMinecraftTransformer.kt b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/fabric/FlintMinecraftTransformer.kt index ad64c6b8..dbe3ea67 100644 --- a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/fabric/FlintMinecraftTransformer.kt +++ b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/fabric/FlintMinecraftTransformer.kt @@ -5,7 +5,7 @@ import com.google.gson.JsonParser import org.gradle.api.Project import org.gradle.api.artifacts.Dependency import xyz.wagyourtail.unimined.api.minecraft.MinecraftJar -import xyz.wagyourtail.unimined.api.minecraft.task.RemapJarTask +import xyz.wagyourtail.unimined.api.minecraft.task.AbstractRemapJarTask import xyz.wagyourtail.unimined.api.runs.RunConfig import xyz.wagyourtail.unimined.api.unimined import xyz.wagyourtail.unimined.internal.minecraft.MinecraftProvider @@ -103,7 +103,7 @@ open class FlintMinecraftTransformer( throw UnsupportedOperationException("Merging is not supported on flint") } - override fun afterRemapJarTask(remapJarTask: RemapJarTask, output: Path) { + override fun afterRemapJarTask(remapJarTask: AbstractRemapJarTask, output: Path) { this.insertAccessWidener(output) } diff --git a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/fabric/LegacyFabricMinecraftTransformer.kt b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/fabric/LegacyFabricMinecraftTransformer.kt index 868d383a..cc7ce978 100644 --- a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/fabric/LegacyFabricMinecraftTransformer.kt +++ b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/fabric/LegacyFabricMinecraftTransformer.kt @@ -3,7 +3,7 @@ package xyz.wagyourtail.unimined.internal.minecraft.patch.fabric import org.gradle.api.Project import org.gradle.api.artifacts.Dependency import xyz.wagyourtail.unimined.api.minecraft.patch.fabric.LegacyFabricPatcher -import xyz.wagyourtail.unimined.api.minecraft.task.RemapJarTask +import xyz.wagyourtail.unimined.api.minecraft.task.AbstractRemapJarTask import xyz.wagyourtail.unimined.api.unimined import xyz.wagyourtail.unimined.internal.minecraft.MinecraftProvider import xyz.wagyourtail.unimined.mapping.Namespace @@ -40,7 +40,7 @@ open class LegacyFabricMinecraftTransformer( project.unimined.legacyFabricMaven() } - override fun configureRemapJar(task: RemapJarTask) { + override fun configureRemapJar(task: AbstractRemapJarTask) { if (fabricDep.version?.let { SemVerUtils.matches(it, ">=0.15.0") } == true) { project.logger.info("enabling mixin extra") task.mixinRemap { diff --git a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/fabric/OfficialFabricMinecraftTransformer.kt b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/fabric/OfficialFabricMinecraftTransformer.kt index 4791991e..2de5740a 100644 --- a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/fabric/OfficialFabricMinecraftTransformer.kt +++ b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/fabric/OfficialFabricMinecraftTransformer.kt @@ -2,8 +2,7 @@ package xyz.wagyourtail.unimined.internal.minecraft.patch.fabric import org.gradle.api.Project import org.gradle.api.artifacts.Dependency -import xyz.wagyourtail.unimined.api.minecraft.MinecraftJar -import xyz.wagyourtail.unimined.api.minecraft.task.RemapJarTask +import xyz.wagyourtail.unimined.api.minecraft.task.AbstractRemapJarTask import xyz.wagyourtail.unimined.internal.minecraft.MinecraftProvider import xyz.wagyourtail.unimined.util.SemVerUtils @@ -28,7 +27,7 @@ open class OfficialFabricMinecraftTransformer( ) } - override fun configureRemapJar(task: RemapJarTask) { + override fun configureRemapJar(task: AbstractRemapJarTask) { if (fabricDep.version?.let { SemVerUtils.matches(it, ">=0.15.0") } == true) { project.logger.info("enabling mixin extra") task.mixinRemap { diff --git a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/forge/ForgeLikeMinecraftTransformer.kt b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/forge/ForgeLikeMinecraftTransformer.kt index 2c367483..d4f9cd74 100644 --- a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/forge/ForgeLikeMinecraftTransformer.kt +++ b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/forge/ForgeLikeMinecraftTransformer.kt @@ -17,6 +17,8 @@ import xyz.wagyourtail.unimined.api.minecraft.patch.ataw.AccessTransformerPatche import xyz.wagyourtail.unimined.api.minecraft.patch.forge.ForgeLikePatcher import xyz.wagyourtail.unimined.api.minecraft.task.RemapJarTask import xyz.wagyourtail.unimined.api.runs.RunConfig +import xyz.wagyourtail.unimined.api.mapping.task.ExportMappingsTask +import xyz.wagyourtail.unimined.api.minecraft.task.AbstractRemapJarTask import xyz.wagyourtail.unimined.api.unimined import xyz.wagyourtail.unimined.api.uniminedMaybe import xyz.wagyourtail.unimined.internal.mapping.at.AccessTransformerApplier @@ -399,7 +401,7 @@ abstract class ForgeLikeMinecraftTransformer( } } - override fun afterRemapJarTask(remapJarTask: RemapJarTask, output: Path) { + override fun afterRemapJarTask(remapJarTask: AbstractRemapJarTask, output: Path) { forgeTransformer.afterRemapJarTask(remapJarTask, output) } @@ -423,11 +425,11 @@ abstract class ForgeLikeMinecraftTransformer( return forgeTransformer.name() } - override fun beforeRemapJarTask(remapJarTask: RemapJarTask, input: Path): Path { + override fun beforeRemapJarTask(remapJarTask: AbstractRemapJarTask, input: Path): Path { return forgeTransformer.beforeRemapJarTask(remapJarTask, input) } - override fun configureRemapJar(task: RemapJarTask) { + override fun configureRemapJar(task: AbstractRemapJarTask) { forgeTransformer.configureRemapJar(task) } diff --git a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/forge/NeoForgedMinecraftTransformer.kt b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/forge/NeoForgedMinecraftTransformer.kt index 6bf1dab7..0ad6fdfa 100644 --- a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/forge/NeoForgedMinecraftTransformer.kt +++ b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/forge/NeoForgedMinecraftTransformer.kt @@ -4,7 +4,7 @@ import com.google.gson.JsonObject import org.gradle.api.Project import org.gradle.api.artifacts.Dependency import xyz.wagyourtail.unimined.api.minecraft.patch.forge.NeoForgedPatcher -import xyz.wagyourtail.unimined.api.minecraft.task.RemapJarTask +import xyz.wagyourtail.unimined.api.minecraft.task.AbstractRemapJarTask import xyz.wagyourtail.unimined.api.unimined import xyz.wagyourtail.unimined.internal.minecraft.MinecraftProvider import xyz.wagyourtail.unimined.internal.minecraft.patch.forge.fg3.FG3MinecraftTransformer @@ -64,7 +64,7 @@ open class NeoForgedMinecraftTransformer(project: Project, provider: MinecraftPr tweakClassClient = args.split("--tweakClass")[1].trim() } - override fun configureRemapJar(task: RemapJarTask) { + override fun configureRemapJar(task: AbstractRemapJarTask) { val forgeDep = forge.dependencies.first() if (provider.version != "1.20.1") { project.logger.info("setting `disableRefmap()` in mixinRemap") diff --git a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/forge/fg3/FG3MinecraftTransformer.kt b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/forge/fg3/FG3MinecraftTransformer.kt index 5e8d6ff9..4b51781b 100644 --- a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/forge/fg3/FG3MinecraftTransformer.kt +++ b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/forge/fg3/FG3MinecraftTransformer.kt @@ -14,7 +14,7 @@ import org.gradle.api.logging.LogLevel import org.jetbrains.annotations.ApiStatus import org.jetbrains.annotations.VisibleForTesting import xyz.wagyourtail.unimined.api.minecraft.MinecraftJar -import xyz.wagyourtail.unimined.api.minecraft.task.RemapJarTask +import xyz.wagyourtail.unimined.api.minecraft.task.AbstractRemapJarTask import xyz.wagyourtail.unimined.api.runs.RunConfig import xyz.wagyourtail.unimined.api.unimined import xyz.wagyourtail.unimined.internal.minecraft.patch.fabric.FabricLikeMinecraftTransformer @@ -561,7 +561,7 @@ open class FG3MinecraftTransformer(project: Project, val parent: ForgeLikeMinecr }) } - private fun doJarJar(remapJarTask: RemapJarTask, output: Path) { + private fun doJarJar(remapJarTask: AbstractRemapJarTask, output: Path) { if (include!!.dependencies.isEmpty()) { return } @@ -596,7 +596,7 @@ open class FG3MinecraftTransformer(project: Project, val parent: ForgeLikeMinecr } } - override fun afterRemapJarTask(remapJarTask: RemapJarTask, output: Path) { + override fun afterRemapJarTask(remapJarTask: AbstractRemapJarTask, output: Path) { if (provider.minecraftData.mcVersionCompare(provider.version, "1.18") >= 0) { doJarJar(remapJarTask, output) } diff --git a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/jarmod/JarModAgentMinecraftTransformer.kt b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/jarmod/JarModAgentMinecraftTransformer.kt index 0bc967e5..c8bfb658 100644 --- a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/jarmod/JarModAgentMinecraftTransformer.kt +++ b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/jarmod/JarModAgentMinecraftTransformer.kt @@ -4,7 +4,7 @@ import org.gradle.api.Project import org.gradle.api.artifacts.ExternalDependency import xyz.wagyourtail.unimined.api.minecraft.patch.jarmod.JarModAgentPatcher import xyz.wagyourtail.unimined.api.runs.RunConfig -import xyz.wagyourtail.unimined.api.minecraft.task.RemapJarTask +import xyz.wagyourtail.unimined.api.minecraft.task.AbstractRemapJarTask import xyz.wagyourtail.unimined.api.unimined import xyz.wagyourtail.unimined.internal.minecraft.MinecraftProvider import xyz.wagyourtail.unimined.internal.minecraft.patch.forge.fg3.mcpconfig.SubprocessExecutor @@ -104,7 +104,7 @@ open class JarModAgentMinecraftTransformer( //TODO: add mods to priority classpath, and resolve their jma.transformers } - override fun beforeRemapJarTask(remapJarTask: RemapJarTask, input: Path): Path { + override fun beforeRemapJarTask(remapJarTask: AbstractRemapJarTask, input: Path): Path { remapJarTask.mixinRemap { enableJarModAgent() } diff --git a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/merged/MergedMinecraftTransformer.kt b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/merged/MergedMinecraftTransformer.kt index 9c43437e..9a0ad40f 100644 --- a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/merged/MergedMinecraftTransformer.kt +++ b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/merged/MergedMinecraftTransformer.kt @@ -16,7 +16,7 @@ import xyz.wagyourtail.unimined.api.minecraft.patch.forge.NeoForgedPatcher import xyz.wagyourtail.unimined.api.minecraft.patch.jarmod.JarModAgentPatcher import xyz.wagyourtail.unimined.api.minecraft.patch.rift.RiftPatcher import xyz.wagyourtail.unimined.api.runs.RunConfig -import xyz.wagyourtail.unimined.api.minecraft.task.RemapJarTask +import xyz.wagyourtail.unimined.api.minecraft.task.AbstractRemapJarTask import xyz.wagyourtail.unimined.internal.minecraft.MinecraftProvider import xyz.wagyourtail.unimined.internal.minecraft.patch.AbstractMinecraftTransformer import xyz.wagyourtail.unimined.api.minecraft.MinecraftJar @@ -34,8 +34,6 @@ import xyz.wagyourtail.unimined.internal.minecraft.patch.jarmod.JarModAgentMinec import xyz.wagyourtail.unimined.internal.minecraft.patch.rift.RiftMinecraftTransformer import xyz.wagyourtail.unimined.internal.minecraft.resolver.Library import xyz.wagyourtail.unimined.util.FinalizeOnRead -import xyz.wagyourtail.unimined.util.MustSet -import java.nio.file.FileSystem import java.nio.file.Path class MergedMinecraftTransformer(project: Project, provider: MinecraftProvider): AbstractMinecraftTransformer(project, provider, "merged"), MergedPatcher { @@ -77,7 +75,7 @@ class MergedMinecraftTransformer(project: Project, provider: MinecraftProvider): } } - override fun beforeRemapJarTask(remapJarTask: RemapJarTask, input: Path): Path { + override fun beforeRemapJarTask(remapJarTask: AbstractRemapJarTask, input: Path): Path { return patchers.fold(input) { acc, patcher -> patcher.beforeRemapJarTask(remapJarTask, acc) } @@ -91,7 +89,7 @@ class MergedMinecraftTransformer(project: Project, provider: MinecraftProvider): patchers.forEach { it.afterEvaluate() } } - override fun afterRemapJarTask(remapJarTask: RemapJarTask, output: Path) { + override fun afterRemapJarTask(remapJarTask: AbstractRemapJarTask, output: Path) { patchers.forEach { it.afterRemapJarTask(remapJarTask, output) } } diff --git a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/resolver/AssetsDownloader.kt b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/resolver/AssetsDownloader.kt index 90bf7a44..47eb25a4 100644 --- a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/resolver/AssetsDownloader.kt +++ b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/resolver/AssetsDownloader.kt @@ -13,6 +13,7 @@ import java.nio.file.StandardCopyOption import java.util.concurrent.atomic.AtomicInteger import kotlin.io.path.createDirectories import kotlin.io.path.inputStream +import kotlin.time.Duration object AssetsDownloader { @@ -68,6 +69,8 @@ object AssetsDownloader { size, hash, assetPath, + ignoreShaOnCache = true, + expireTime = Duration.INFINITE ) if (copyToResources) { diff --git a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/task/AbstractRemapJarTaskImpl.kt b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/task/AbstractRemapJarTaskImpl.kt new file mode 100644 index 00000000..b5221d31 --- /dev/null +++ b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/task/AbstractRemapJarTaskImpl.kt @@ -0,0 +1,108 @@ +package xyz.wagyourtail.unimined.internal.minecraft.task + +import org.gradle.api.tasks.Internal +import org.gradle.api.tasks.TaskAction +import xyz.wagyourtail.unimined.api.mapping.mixin.MixinRemapOptions +import xyz.wagyourtail.unimined.api.minecraft.MinecraftConfig +import xyz.wagyourtail.unimined.api.minecraft.task.AbstractRemapJarTask +import xyz.wagyourtail.unimined.mapping.Namespace +import xyz.wagyourtail.unimined.util.FinalizeOnRead +import xyz.wagyourtail.unimined.util.LazyMutable +import xyz.wagyourtail.unimined.util.getField +import xyz.wagyourtail.unimined.util.readZipInputStreamFor +import java.nio.file.Path +import java.nio.file.StandardOpenOption +import javax.inject.Inject +import kotlin.io.path.* + +@Suppress("UNCHECKED_CAST") +abstract class AbstractRemapJarTaskImpl @Inject constructor(@get:Internal val provider: MinecraftConfig): AbstractRemapJarTask() { + + @get:Internal + protected var mixinRemapOptions: MixinRemapOptions.() -> Unit by FinalizeOnRead {} + + override fun devNamespace(namespace: String) { + val delegate: FinalizeOnRead = AbstractRemapJarTask::class.getField("devNamespace")!!.getDelegate(this) as FinalizeOnRead + delegate.setValueIntl(LazyMutable { provider.mappings.checkedNs(namespace) }) + } + + override fun prodNamespace(namespace: String) { + val delegate: FinalizeOnRead = AbstractRemapJarTask::class.getField("prodNamespace")!!.getDelegate(this) as FinalizeOnRead + delegate.setValueIntl(LazyMutable { provider.mappings.checkedNs(namespace) }) + } + + override fun mixinRemap(action: MixinRemapOptions.() -> Unit) { + val delegate: FinalizeOnRead Unit> = AbstractRemapJarTaskImpl::class.getField("mixinRemapOptions")!!.getDelegate(this) as FinalizeOnRead Unit> + val old = delegate.value as MixinRemapOptions.() -> Unit + mixinRemapOptions = { + old() + action() + } + } + + override var allowImplicitWildcards by FinalizeOnRead(false) + + @TaskAction + @Suppress("UNNECESSARY_NOT_NULL_ASSERTION") + fun run() { + val prodNs = prodNamespace ?: provider.mcPatcher.prodNamespace!! + val devNs = devNamespace ?: provider.mappings.devNamespace!! + + val inputFile = provider.mcPatcher.beforeRemapJarTask(this, inputFile.get().asFile.toPath()) + + if (devNs == prodNs) { + project.logger.lifecycle("[Unimined/RemapJar ${this.path}] detected empty remap path, jumping to after remap tasks") + provider.mcPatcher.afterRemapJarTask(this, inputFile) + afterRemap(inputFile) + return + } + + project.logger.lifecycle("[Unimined/RemapJar ${this.path}] remapping output ${inputFile.name} from $devNs to $prodNs") + val prodMapped = temporaryDir.toPath().resolve("${inputFile.nameWithoutExtension}-temp-${prodNs}.jar") + prodMapped.deleteIfExists() + + val mc = provider.getMinecraft(devNs) + + val classpath = provider.mods.getClasspathAs( + devNs, + provider.sourceSet.compileClasspath.files + ).map { it.toPath() }.filter { it.exists() && !provider.isMinecraftJar(it) } + + project.logger.debug("[Unimined/RemapJar ${path}] classpath: ") + classpath.forEach { + project.logger.debug("[Unimined/RemapJar ${path}] $it") + } + + doRemap(inputFile, prodMapped, devNs, prodNs, (classpath + listOf(mc)).toTypedArray()) + + project.logger.info("[Unimined/RemapJar ${path}] after remap tasks started ${System.currentTimeMillis()}") + provider.mcPatcher.afterRemapJarTask(this, prodMapped) + afterRemap(prodMapped) + project.logger.info("[Unimined/RemapJar ${path}] after remap tasks finished ${System.currentTimeMillis()}") + } + + private fun afterRemap(afterRemapJar: Path) { + // merge in manifest from input jar + afterRemapJar.readZipInputStreamFor("META-INF/MANIFEST.MF", false) { inp -> + // write to temp file + val inpTmp = temporaryDir.toPath().resolve("input-manifest.MF") + inpTmp.outputStream(StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING).use { out -> + inp.copyTo(out) + } + this.manifest { + it.from(inpTmp) + } + } + // copy into output + from(project.zipTree(afterRemapJar)) + copy() + } + + protected abstract fun doRemap( + from: Path, + target: Path, + fromNs: Namespace, + toNs: Namespace, + classpathList: Array + ) +} \ No newline at end of file diff --git a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/task/RemapJarTaskImpl.kt b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/task/RemapJarTaskImpl.kt index af820636..17b79a4e 100644 --- a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/task/RemapJarTaskImpl.kt +++ b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/task/RemapJarTaskImpl.kt @@ -19,71 +19,12 @@ import xyz.wagyourtail.unimined.util.* import java.nio.file.Path import java.nio.file.StandardOpenOption import javax.inject.Inject -import kotlin.io.path.* +import kotlin.io.path.createDirectories +import kotlin.io.path.deleteIfExists +import kotlin.io.path.outputStream -abstract class RemapJarTaskImpl @Inject constructor(@get:Internal val provider: MinecraftConfig): RemapJarTask() { - - private var mixinRemapOptions: MixinRemapOptions.() -> Unit by FinalizeOnRead {} - - override fun devNamespace(namespace: String) { - val delegate: FinalizeOnRead = RemapJarTask::class.getField("devNamespace")!!.getDelegate(this) as FinalizeOnRead - delegate.setValueIntl(LazyMutable { provider.mappings.checkedNs(namespace) }) - } - - override fun prodNamespace(namespace: String) { - val delegate: FinalizeOnRead = RemapJarTask::class.getField("prodNamespace")!!.getDelegate(this) as FinalizeOnRead - delegate.setValueIntl(LazyMutable { provider.mappings.checkedNs(namespace) }) - } - - override fun mixinRemap(action: MixinRemapOptions.() -> Unit) { - val delegate: FinalizeOnRead Unit> = RemapJarTaskImpl::class.getField("mixinRemapOptions")!!.getDelegate(this) as FinalizeOnRead Unit> - val old = delegate.value as MixinRemapOptions.() -> Unit - mixinRemapOptions = { - old() - action() - } - } - - override var allowImplicitWildcards by FinalizeOnRead(false) - - @TaskAction - @Suppress("UNNECESSARY_NOT_NULL_ASSERTION") - fun run() { - val prodNs = prodNamespace ?: provider.mcPatcher.prodNamespace!! - val devNs = devNamespace ?: provider.mappings.devNamespace!! - - val inputFile = provider.mcPatcher.beforeRemapJarTask(this, inputFile.get().asFile.toPath()) - - if (devNs == prodNs) { - project.logger.lifecycle("[Unimined/RemapJar ${this.path}] detected empty remap path, jumping to after remap tasks") - provider.mcPatcher.afterRemapJarTask(this, inputFile) - afterRemap(inputFile) - return - } - - project.logger.lifecycle("[Unimined/RemapJar ${this.path}] remapping output ${inputFile.name} from $devNs to $prodNs") - val prodMapped = temporaryDir.toPath().resolve("${inputFile.nameWithoutExtension}-temp-${prodNs}.jar") - prodMapped.deleteIfExists() - - val mc = provider.getMinecraft(devNs) - - val classpath = provider.mods.getClasspathAs( - devNs, - provider.sourceSet.compileClasspath.files - ).map { it.toPath() }.filter { it.exists() && !provider.isMinecraftJar(it) } - - project.logger.debug("[Unimined/RemapJar ${path}] classpath: ") - classpath.forEach { - project.logger.debug("[Unimined/RemapJar ${path}] $it") - } - - remapToInternal(inputFile, prodMapped, devNs, prodNs, (classpath + listOf(mc)).toTypedArray()) - - project.logger.info("[Unimined/RemapJar ${path}] after remap tasks started ${System.currentTimeMillis()}") - provider.mcPatcher.afterRemapJarTask(this, prodMapped) - afterRemap(prodMapped) - project.logger.info("[Unimined/RemapJar ${path}] after remap tasks finished ${System.currentTimeMillis()}") - } +abstract class RemapJarTaskImpl @Inject constructor(provider: MinecraftConfig): + AbstractRemapJarTaskImpl(provider), RemapJarTask { private fun afterRemap(afterRemapJar: Path) { // merge in manifest from input jar @@ -103,13 +44,13 @@ abstract class RemapJarTaskImpl @Inject constructor(@get:Internal val provider: } @Suppress("UNNECESSARY_NOT_NULL_ASSERTION") - protected fun remapToInternal( + override fun doRemap( from: Path, target: Path, fromNs: Namespace, toNs: Namespace, classpathList: Array - ) = runBlocking { + ): Unit = runBlocking { project.logger.info("[Unimined/RemapJar ${path}] remapping $fromNs -> $toNs (start time: ${System.currentTimeMillis()})") val remapperB = TinyRemapper.newRemapper() .withMappings( diff --git a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/task/RemapSourcesJarTaskImpl.kt b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/task/RemapSourcesJarTaskImpl.kt new file mode 100644 index 00000000..aa936717 --- /dev/null +++ b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/task/RemapSourcesJarTaskImpl.kt @@ -0,0 +1,70 @@ +package xyz.wagyourtail.unimined.internal.minecraft.task + +import xyz.wagyourtail.unimined.api.minecraft.MinecraftConfig +import xyz.wagyourtail.unimined.api.minecraft.task.RemapSourcesJarTask +import xyz.wagyourtail.unimined.mapping.Namespace +import xyz.wagyourtail.unimined.util.deleteRecursively +import java.nio.file.Path +import java.util.jar.JarEntry +import java.util.jar.JarOutputStream +import java.util.zip.Deflater +import javax.inject.Inject +import kotlin.io.path.* + +abstract class RemapSourcesJarTaskImpl @Inject constructor(provider: MinecraftConfig): + AbstractRemapJarTaskImpl(provider), RemapSourcesJarTask { + + @OptIn(ExperimentalPathApi::class) + override fun doRemap( + from: Path, + target: Path, + fromNs: Namespace, + toNs: Namespace, + classpathList: Array + ) { + // source-remap seems to be broken when reading/writing from a jar, so copy them to/from temp dirs + val output = temporaryDir.resolve(toNs.name).toPath().apply { + if(this.exists()) deleteRecursively() + createDirectories() + } + + val input = temporaryDir.resolve(fromNs.name).toPath().apply { + if(this.exists()) deleteRecursively() + createDirectories() + + project.copy { + it.from(project.zipTree(from)) + it.into(this) + } + } + + provider.sourceProvider.sourceRemapper.remap( + mapOf(input to output), + project.files(*classpathList), + fromNs, + toNs, + specConfig = { + standardOutput = temporaryDir.resolve("remap-${fromNs}-to-${toNs}.log").outputStream() + } + ) + + // copy non-source files directly + input.walk().filter { it.extension != "java" && it.extension != "kt" }.forEach { file -> + val name = input.relativize(file).toString().replace('\\', '/') + val targetFile = output.resolve(name) + targetFile.parent.createDirectories() + file.copyTo(targetFile, overwrite = true) + } + + JarOutputStream(target.toFile().outputStream()).use { zos -> + zos.setLevel(Deflater.NO_COMPRESSION) + output.walk().forEach { file -> + val name = output.relativize(file).toString().replace('\\', '/') + zos.putNextEntry(JarEntry(name)) + file.inputStream().use { it.copyTo(zos) } + zos.closeEntry() + } + } + } + +} \ No newline at end of file diff --git a/src/source/kotlin/xyz/wagyourtail/unimined/internal/source/remapper/SourceRemapperImpl.kt b/src/source/kotlin/xyz/wagyourtail/unimined/internal/source/remapper/SourceRemapperImpl.kt index 74cefe59..0c6ded75 100644 --- a/src/source/kotlin/xyz/wagyourtail/unimined/internal/source/remapper/SourceRemapperImpl.kt +++ b/src/source/kotlin/xyz/wagyourtail/unimined/internal/source/remapper/SourceRemapperImpl.kt @@ -2,9 +2,9 @@ package xyz.wagyourtail.unimined.internal.source.remapper import kotlinx.coroutines.runBlocking import org.gradle.api.Project -import org.gradle.api.artifacts.Dependency +import org.gradle.api.artifacts.ExternalModuleDependency import org.gradle.api.file.FileCollection -import xyz.wagyourtail.unimined.api.mapping.task.ExportMappingsTask +import org.gradle.process.JavaExecSpec import xyz.wagyourtail.unimined.api.source.remapper.SourceRemapper import xyz.wagyourtail.unimined.api.unimined import xyz.wagyourtail.unimined.internal.mapping.MappingsProvider @@ -16,7 +16,6 @@ import xyz.wagyourtail.unimined.util.withSourceSet import java.io.File import java.nio.file.Path import kotlin.io.path.absolutePathString -import kotlin.io.path.copyTo import kotlin.io.path.createDirectories import kotlin.io.path.exists @@ -24,17 +23,18 @@ class SourceRemapperImpl(val project: Project, val provider: SourceProvider) : S val sourceRemapper = project.configurations.maybeCreate("sourceRemapper".withSourceSet(provider.minecraft.sourceSet)) - override fun remapper(dep: Any, action: Dependency.() -> Unit) { + override fun remapper(dep: Any, action: ExternalModuleDependency.() -> Unit) { sourceRemapper.dependencies.add( project.dependencies.create( if (dep is String && !dep.contains(":")) { + project.unimined.wagYourMaven("snapshots") "xyz.wagyourtail.unimined:source-remap:$dep" } else { dep } ) .also { - action(it) + action(it as ExternalModuleDependency) } ) } @@ -42,7 +42,13 @@ class SourceRemapperImpl(val project: Project, val provider: SourceProvider) : S val tempDir = project.unimined.getLocalCache().resolve("source-remap-cache") - override fun remap(inputOutput: Map, classpath: FileCollection, source: Namespace, target: Namespace) { + override fun remap( + inputOutput: Map, + classpath: FileCollection, + source: Namespace, + target: Namespace, + specConfig: JavaExecSpec.() -> Unit + ) { val mc = provider.minecraft.getMinecraft( source @@ -53,13 +59,14 @@ class SourceRemapperImpl(val project: Project, val provider: SourceProvider) : S classpath, mc, source, - target + target, + specConfig ) } - private fun remapIntl(inputOutput: Map, classpath: FileCollection, minecraft: Path, source: Namespace, target: Namespace) = runBlocking { + private fun remapIntl(inputOutput: Map, classpath: FileCollection, minecraft: Path, source: Namespace, target: Namespace, specConfig: JavaExecSpec.() -> Unit) = runBlocking { if (sourceRemapper.dependencies.isEmpty()) { - remapper("1.0.4-SNAPSHOT") + remapper("1.0.5-SNAPSHOT") } val mappingFile = tempDir.createDirectories().resolve("${provider.minecraft.sourceSet.name}-${source.name}-${target.name}.srg") @@ -92,6 +99,7 @@ class SourceRemapperImpl(val project: Project, val provider: SourceProvider) : S "-m", mappingFile.toFile().absolutePath ) + specConfig(spec) project.logger.info("[Unimined/SourceRemapper] ${spec.args!!.joinToString(" ")}") }.rethrowFailure().assertNormalExitValue() diff --git a/testing/1.21-NeoForged-Fabric/build.gradle b/testing/1.21-NeoForged-Fabric/build.gradle index fe3149de..2464b8dd 100644 --- a/testing/1.21-NeoForged-Fabric/build.gradle +++ b/testing/1.21-NeoForged-Fabric/build.gradle @@ -14,6 +14,8 @@ java { toolchain { languageVersion = JavaLanguageVersion.of(21) } + + withSourcesJar() } // this is just here so we can test the outputs easier and clean between tests diff --git a/testing/1.21-NeoForged-Fabric/gradle/wrapper/gradle-wrapper.properties b/testing/1.21-NeoForged-Fabric/gradle/wrapper/gradle-wrapper.properties index 20db9ad5..09523c0e 100644 --- a/testing/1.21-NeoForged-Fabric/gradle/wrapper/gradle-wrapper.properties +++ b/testing/1.21-NeoForged-Fabric/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/testing/1.21-NeoForged-Fabric/gradlew b/testing/1.21-NeoForged-Fabric/gradlew index 79a61d42..f5feea6d 100755 --- a/testing/1.21-NeoForged-Fabric/gradlew +++ b/testing/1.21-NeoForged-Fabric/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -83,10 +85,9 @@ done # 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"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,10 +134,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -144,7 +148,7 @@ 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 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +156,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -197,11 +201,15 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# 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"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ diff --git a/testing/1.21-NeoForged-Fabric/gradlew.bat b/testing/1.21-NeoForged-Fabric/gradlew.bat index 6689b85b..9b42019c 100644 --- a/testing/1.21-NeoForged-Fabric/gradlew.bat +++ b/testing/1.21-NeoForged-Fabric/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -43,11 +45,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +59,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail