From fd5bc63afc4f9d9420232e4d41c0bde41a08c9cb Mon Sep 17 00:00:00 2001 From: Wagyourtail Date: Thu, 11 Jul 2024 12:10:58 -0500 Subject: [PATCH 1/7] support merged intermediary format fixes #66 --- .../api/mapping/MappingNamespaceTree.kt | 5 ++ .../fabric/BabricMinecraftTransformer.kt | 34 +------------ .../fabric/FabricMinecraftTransformer.kt | 48 +++++++++++++++++++ 3 files changed, 54 insertions(+), 33 deletions(-) diff --git a/src/api/kotlin/xyz/wagyourtail/unimined/api/mapping/MappingNamespaceTree.kt b/src/api/kotlin/xyz/wagyourtail/unimined/api/mapping/MappingNamespaceTree.kt index f924aaa5..0d049163 100644 --- a/src/api/kotlin/xyz/wagyourtail/unimined/api/mapping/MappingNamespaceTree.kt +++ b/src/api/kotlin/xyz/wagyourtail/unimined/api/mapping/MappingNamespaceTree.kt @@ -144,6 +144,11 @@ open class MappingNamespaceTree { return namespaces[name.lowercase()] ?: throw IllegalArgumentException("Namespace $name does not exist") } + @ApiStatus.Experimental + fun findNamespace(name: String): Namespace? { + return namespaces[name.lowercase()] + } + override fun toString(): String { var s = "MappingNamespaceTree.MappingNamespace: {\n" for (namespace in namespaces.values) { diff --git a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/fabric/BabricMinecraftTransformer.kt b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/fabric/BabricMinecraftTransformer.kt index ba496ed5..9c33fdb2 100644 --- a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/fabric/BabricMinecraftTransformer.kt +++ b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/fabric/BabricMinecraftTransformer.kt @@ -6,6 +6,7 @@ import xyz.wagyourtail.unimined.api.unimined import xyz.wagyourtail.unimined.internal.minecraft.MinecraftProvider import xyz.wagyourtail.unimined.api.minecraft.MinecraftJar import xyz.wagyourtail.unimined.util.FinalizeOnRead +import xyz.wagyourtail.unimined.util.SemVerUtils open class BabricMinecraftTransformer(project: Project, provider: MinecraftProvider): FabricMinecraftTransformer(project, provider) { @@ -25,39 +26,6 @@ open class BabricMinecraftTransformer(project: Project, provider: MinecraftProvi ) } - override fun merge(clientjar: MinecraftJar, serverjar: MinecraftJar): MinecraftJar { - val INTERMEDIARY = provider.mappings.getNamespace("intermediary") - val CLIENT = provider.mappings.getNamespace("client") - val SERVER = provider.mappings.getNamespace("server") - val clientJarFixed = MinecraftJar( - clientjar.parentPath, - clientjar.name, - clientjar.envType, - clientjar.version, - clientjar.patches, - CLIENT, - CLIENT, - clientjar.awOrAt, - clientjar.extension, - clientjar.path - ) - val serverJarFixed = MinecraftJar( - serverjar.parentPath, - serverjar.name, - serverjar.envType, - serverjar.version, - serverjar.patches, - SERVER, - SERVER, - serverjar.awOrAt, - serverjar.extension, - serverjar.path - ) - val intermediaryClientJar = provider.minecraftRemapper.provide(clientJarFixed, INTERMEDIARY, CLIENT) - val intermediaryServerJar = provider.minecraftRemapper.provide(serverJarFixed, INTERMEDIARY, SERVER) - return super.merge(intermediaryClientJar, intermediaryServerJar, true) - } - override fun addMavens() { super.addMavens() project.unimined.glassLauncherMaven("babric") diff --git a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/fabric/FabricMinecraftTransformer.kt b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/fabric/FabricMinecraftTransformer.kt index 4b96a419..5503983c 100644 --- a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/fabric/FabricMinecraftTransformer.kt +++ b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/fabric/FabricMinecraftTransformer.kt @@ -10,6 +10,7 @@ import xyz.wagyourtail.unimined.api.runs.RunConfig import xyz.wagyourtail.unimined.api.unimined import xyz.wagyourtail.unimined.internal.minecraft.MinecraftProvider import xyz.wagyourtail.unimined.api.minecraft.MinecraftJar +import xyz.wagyourtail.unimined.util.SemVerUtils import java.io.InputStreamReader import java.nio.file.Files @@ -31,6 +32,53 @@ abstract class FabricMinecraftTransformer( project.unimined.fabricMaven() } + override fun merge(clientjar: MinecraftJar, serverjar: MinecraftJar): MinecraftJar { + if (canCombine) { + return super.merge(clientjar, serverjar) + } else if (this is BabricMinecraftTransformer || SemVerUtils.matches(fabricDep.version!!, ">=0.16.0")) { + val INTERMEDIARY = provider.mappings.getNamespace("intermediary") + val CLIENT = if (this is BabricMinecraftTransformer) { + provider.mappings.findNamespace("clientOfficial") ?: provider.mappings.getNamespace("client") + } else { + provider.mappings.getNamespace("clientOfficial") + } + val SERVER = if (this is BabricMinecraftTransformer) { + provider.mappings.findNamespace("serverOfficial") ?: provider.mappings.getNamespace("server") + } else { + provider.mappings.getNamespace("serverOfficial") + } + val clientJarFixed = MinecraftJar( + clientjar.parentPath, + clientjar.name, + clientjar.envType, + clientjar.version, + clientjar.patches, + CLIENT, + CLIENT, + clientjar.awOrAt, + clientjar.extension, + clientjar.path + ) + val serverJarFixed = MinecraftJar( + serverjar.parentPath, + serverjar.name, + serverjar.envType, + serverjar.version, + serverjar.patches, + SERVER, + SERVER, + serverjar.awOrAt, + serverjar.extension, + serverjar.path + ) + val intermediaryClientJar = provider.minecraftRemapper.provide(clientJarFixed, INTERMEDIARY, CLIENT) + val intermediaryServerJar = provider.minecraftRemapper.provide(serverJarFixed, INTERMEDIARY, SERVER) + return super.merge(intermediaryClientJar, intermediaryServerJar, true) + } + throw UnsupportedOperationException("Merging is not supported for this version") + } + + override fun addIncludeToModJson(json: JsonObject, dep: Dependency, path: String) { var jars = json.get("jars")?.asJsonArray if (jars == null) { From ee2513861c04edac274880d93125de828def70c2 Mon Sep 17 00:00:00 2001 From: Wagyourtail Date: Thu, 11 Jul 2024 12:11:13 -0500 Subject: [PATCH 2/7] bump --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 95134ac3..fcb4a243 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,4 +5,4 @@ org.gradle.parallel=true maven_group=xyz.wagyourtail.unimined archives_base_name=unimined -version=1.3.1 +version=1.3.2 From 68bcd5a6a48c282edca21f4c615ef1ac387fe55c Mon Sep 17 00:00:00 2001 From: Wagyourtail Date: Fri, 12 Jul 2024 08:46:57 -0500 Subject: [PATCH 3/7] fabric loom compat --- .../extension/mixin/OfficialMixinMetaData.kt | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/mapping/kotlin/xyz/wagyourtail/unimined/internal/mapping/extension/mixin/OfficialMixinMetaData.kt b/src/mapping/kotlin/xyz/wagyourtail/unimined/internal/mapping/extension/mixin/OfficialMixinMetaData.kt index fc600ace..a1aaae18 100644 --- a/src/mapping/kotlin/xyz/wagyourtail/unimined/internal/mapping/extension/mixin/OfficialMixinMetaData.kt +++ b/src/mapping/kotlin/xyz/wagyourtail/unimined/internal/mapping/extension/mixin/OfficialMixinMetaData.kt @@ -10,6 +10,10 @@ import java.nio.file.Path import java.nio.file.StandardOpenOption import java.util.* import java.util.concurrent.CompletableFuture +import java.util.jar.Manifest +import kotlin.io.path.exists +import kotlin.io.path.inputStream +import kotlin.io.path.outputStream import kotlin.io.path.writeText class OfficialMixinMetaData(parent: MixinRemapExtension) : MixinRemapExtension.MixinMetadata(parent) { @@ -111,7 +115,15 @@ class OfficialMixinMetaData(parent: MixinRemapExtension) : MixinRemapExtension.M } override fun writeExtra(fs: FileSystem) { - if (!parent.noRefmap.contains("BaseMixin")) { + val noRefmap = parent.noRefmap.contains("BaseMixin") + val manifest = fs.getPath("META-INF/MANIFEST.MF").let { file -> + if (file.exists()) { + file.inputStream().use { Manifest(it) } + } else { + Manifest() + } + } + if (!noRefmap) { for ((name, json) in refmaps) { if (json.isEmpty()) continue parent.logger.info("[Unimined/MixinMetaData] Writing refmap $name") @@ -123,6 +135,12 @@ class OfficialMixinMetaData(parent: MixinRemapExtension) : MixinRemapExtension.M StandardOpenOption.TRUNCATE_EXISTING ) } + manifest.mainAttributes.putValue("Fabric-Loom-Mixin-Remap-Type", "mixin") + } else { + manifest.mainAttributes.putValue("Fabric-Loom-Mixin-Remap-Type", "static") + } + fs.getPath("META-INF/MANIFEST.MF").outputStream(StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.CREATE).use { + manifest.write(it) } for ((name, json) in mixinJsons) { parent.logger.info("[Unimined/MixinMetaData] Writing mixin config $name") From ae9711434ce96cc91d49953adde73e4f97974345 Mon Sep 17 00:00:00 2001 From: Wagyourtail Date: Fri, 12 Jul 2024 11:01:16 -0500 Subject: [PATCH 4/7] add footgun flag --- .../unimined/api/UniminedExtension.kt | 6 ++++++ .../patch/AbstractMinecraftTransformer.kt | 17 ++++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/api/kotlin/xyz/wagyourtail/unimined/api/UniminedExtension.kt b/src/api/kotlin/xyz/wagyourtail/unimined/api/UniminedExtension.kt index f90fc98d..d6fe01a2 100644 --- a/src/api/kotlin/xyz/wagyourtail/unimined/api/UniminedExtension.kt +++ b/src/api/kotlin/xyz/wagyourtail/unimined/api/UniminedExtension.kt @@ -48,6 +48,12 @@ abstract class UniminedExtension(val project: Project) { var useGlobalCache: Boolean by FinalizeOnRead(true) var forceReload: Boolean by FinalizeOnRead(project.properties["unimined.forceReload"] == "true") + /** + * VERY not recommended to disable + */ + @set:ApiStatus.Experimental + var footgunChecks: Boolean by FinalizeOnRead(true) + var fabricApi = project.extensions.create("fabricApi", FabricLikeApiExtension::class.java) private val sourceSets by lazy { 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 47841b61..9e3ca4b0 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 @@ -278,13 +278,16 @@ abstract class AbstractMinecraftTransformer protected constructor( } // ensure all minecraft ones on same mappings // get current mappings - for ((sourceSet, minecraftConfig) in minecraftConfigs.nonNullValues()) { - if (provider.mappings.devNamespace != minecraftConfig.mappings.devNamespace || - provider.mappings.devFallbackNamespace != minecraftConfig.mappings.devFallbackNamespace) { - throw IllegalArgumentException("All combined minecraft configs must be on the same mappings, found ${provider.sourceSet} on ${provider.mappings.devNamespace}/${provider.mappings.devFallbackNamespace} and $sourceSet on ${minecraftConfig.mappings.devNamespace}/${minecraftConfig.mappings.devFallbackNamespace}") - } - if (provider.version != minecraftConfig.version) { - throw IllegalArgumentException("All combined minecraft configs must be on the same version, found ${provider.sourceSet} on ${provider.version} and $sourceSet on ${minecraftConfig.version}") + if (project.unimined.footgunChecks) { + for ((sourceSet, minecraftConfig) in minecraftConfigs.nonNullValues()) { + if (provider.mappings.devNamespace != minecraftConfig.mappings.devNamespace || + provider.mappings.devFallbackNamespace != minecraftConfig.mappings.devFallbackNamespace + ) { + throw IllegalArgumentException("All combined minecraft configs must be on the same mappings, found ${provider.sourceSet} on ${provider.mappings.devNamespace}/${provider.mappings.devFallbackNamespace} and $sourceSet on ${minecraftConfig.mappings.devNamespace}/${minecraftConfig.mappings.devFallbackNamespace}") + } + if (provider.version != minecraftConfig.version) { + throw IllegalArgumentException("All combined minecraft configs must be on the same version, found ${provider.sourceSet} on ${provider.version} and $sourceSet on ${minecraftConfig.version}") + } } } From f8f0088b297400a91cf117bdc9d6c7d3518a0d43 Mon Sep 17 00:00:00 2001 From: Wagyourtail Date: Sat, 13 Jul 2024 13:08:05 -0500 Subject: [PATCH 5/7] create meta-inf directory if not exists --- .../mapping/extension/mixin/OfficialMixinMetaData.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/mapping/kotlin/xyz/wagyourtail/unimined/internal/mapping/extension/mixin/OfficialMixinMetaData.kt b/src/mapping/kotlin/xyz/wagyourtail/unimined/internal/mapping/extension/mixin/OfficialMixinMetaData.kt index a1aaae18..33b87d1a 100644 --- a/src/mapping/kotlin/xyz/wagyourtail/unimined/internal/mapping/extension/mixin/OfficialMixinMetaData.kt +++ b/src/mapping/kotlin/xyz/wagyourtail/unimined/internal/mapping/extension/mixin/OfficialMixinMetaData.kt @@ -11,10 +11,7 @@ import java.nio.file.StandardOpenOption import java.util.* import java.util.concurrent.CompletableFuture import java.util.jar.Manifest -import kotlin.io.path.exists -import kotlin.io.path.inputStream -import kotlin.io.path.outputStream -import kotlin.io.path.writeText +import kotlin.io.path.* class OfficialMixinMetaData(parent: MixinRemapExtension) : MixinRemapExtension.MixinMetadata(parent) { private val GSON = GsonBuilder().setPrettyPrinting().create() @@ -139,6 +136,7 @@ class OfficialMixinMetaData(parent: MixinRemapExtension) : MixinRemapExtension.M } else { manifest.mainAttributes.putValue("Fabric-Loom-Mixin-Remap-Type", "static") } + fs.getPath("META-INF").createDirectories() fs.getPath("META-INF/MANIFEST.MF").outputStream(StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.CREATE).use { manifest.write(it) } From 66b24763fcd5e59b1cfa1cc69120179b29f6295d Mon Sep 17 00:00:00 2001 From: Wagyourtail Date: Sat, 13 Jul 2024 13:08:14 -0500 Subject: [PATCH 6/7] bump --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index fcb4a243..aec14aa2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,4 +5,4 @@ org.gradle.parallel=true maven_group=xyz.wagyourtail.unimined archives_base_name=unimined -version=1.3.2 +version=1.3.3 From 71a99ec4e840b6b6558f2910eb10d042aa08006c Mon Sep 17 00:00:00 2001 From: Wagyourtail Date: Sat, 13 Jul 2024 13:12:01 -0500 Subject: [PATCH 7/7] fix manifest to include remap info --- .../internal/minecraft/task/RemapJarTaskImpl.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) 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 b0dadcd0..37f31387 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 @@ -69,7 +69,7 @@ abstract class RemapJarTaskImpl @Inject constructor(@get:Internal val provider: if (path.isEmpty()) { project.logger.lifecycle("[Unimined/RemapJar ${this.path}] detected empty remap path, jumping to after remap tasks") provider.mcPatcher.afterRemapJarTask(this, inputFile) - afterRemap(inputFile, inputFile) + afterRemap(inputFile) return } @@ -81,7 +81,7 @@ abstract class RemapJarTaskImpl @Inject constructor(@get:Internal val provider: for (i in path.indices) { val step = path[i] project.logger.info("[Unimined/RemapJar ${this.path}] $step") - val nextTarget = project.buildDir.resolve("tmp").resolve(name).toPath().resolve("${inputFile.nameWithoutExtension}-temp-${step.name}.jar") + val nextTarget = temporaryDir.toPath().resolve("${inputFile.nameWithoutExtension}-temp-${step.name}.jar") nextTarget.deleteIfExists() val mc = provider.getMinecraft( @@ -107,15 +107,15 @@ abstract class RemapJarTaskImpl @Inject constructor(@get:Internal val provider: } project.logger.info("[Unimined/RemapJar ${path}] after remap tasks started ${System.currentTimeMillis()}") provider.mcPatcher.afterRemapJarTask(this, prevTarget) - afterRemap(inputFile, prevTarget) + afterRemap(prevTarget) project.logger.info("[Unimined/RemapJar ${path}] after remap tasks finished ${System.currentTimeMillis()}") } - private fun afterRemap(inputFile: Path, afterRemapJar: Path) { + private fun afterRemap(afterRemapJar: Path) { // merge in manifest from input jar - inputFile.readZipInputStreamFor("META-INF/MANIFEST.MF", false) { inp -> + afterRemapJar.readZipInputStreamFor("META-INF/MANIFEST.MF", false) { inp -> // write to temp file - val inpTmp = project.buildDir.resolve("tmp").resolve(name).toPath().resolve("input-manifest.MF") + val inpTmp = temporaryDir.toPath().resolve("input-manifest.MF") inpTmp.outputStream(StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING).use { out -> inp.copyTo(out) }