diff --git a/build.gradle.kts b/build.gradle.kts index 3d292914..b671f65a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -143,6 +143,7 @@ subprojects { } tasks.named("remapJar") { + from("${rootProject.projectDir}/LICENSE") val shadowJar = project.tasks.named("shadowJar").get() inputFile.set(shadowJar.archiveFile) injectAccessWidener = true diff --git a/buildSrc/src/main/kotlin/dev/ithundxr/numismaticsgradle/NumismaticsGradlePlugin.kt b/buildSrc/src/main/kotlin/dev/ithundxr/numismaticsgradle/NumismaticsGradlePlugin.kt index 7d59675a..14c1c620 100644 --- a/buildSrc/src/main/kotlin/dev/ithundxr/numismaticsgradle/NumismaticsGradlePlugin.kt +++ b/buildSrc/src/main/kotlin/dev/ithundxr/numismaticsgradle/NumismaticsGradlePlugin.kt @@ -18,16 +18,58 @@ package dev.ithundxr.numismaticsgradle -import dev.ithundxr.numismaticsgradle.asm.internal.SubprojectType -import dev.ithundxr.numismaticsgradle.transformer.PostCompileTransformer +import dev.ithundxr.numismaticsgradle.asm.NumismaticsGradleASM +import groovy.json.JsonOutput +import groovy.json.JsonSlurper import org.gradle.api.Plugin import org.gradle.api.Project +import java.util.jar.JarEntry +import java.util.jar.JarFile +import java.util.jar.JarOutputStream +import java.util.zip.Deflater class NumismaticsGradlePlugin : Plugin { override fun apply(project: Project) { project.tasks.named("remapJar").configure { doLast { - PostCompileTransformer().transformJar(project, outputs.files.singleFile) + val jar = outputs.files.singleFile + + var architecturyInjectableName = project.name + if (project.rootProject != project) + architecturyInjectableName = project.rootProject.name + "_" + architecturyInjectableName + + val contents = linkedMapOf() + JarFile(jar).use { + it.entries().asIterator().forEach { entry -> + if (!entry.isDirectory) { + contents[entry.name] = it.getInputStream(entry).readAllBytes() + } + } + } + + jar.delete() + + JarOutputStream(jar.outputStream()).use { out -> + out.setLevel(Deflater.BEST_COMPRESSION) + + contents.forEach { var (name, data) = it + if (name.contains("architectury_inject_${architecturyInjectableName}_common")) + return@forEach + + if (name.endsWith(".json") || name.endsWith(".mcmeta")) { + data = (JsonOutput.toJson(JsonSlurper().parse(data)).toByteArray()) + } else if (name.endsWith(".class")) { + data = NumismaticsGradleASM().transformClass(project, data) + } + + out.putNextEntry(JarEntry(name)) + out.write(data) + out.closeEntry() + } + + out.finish() + out.close() + } } } } diff --git a/buildSrc/src/main/kotlin/dev/ithundxr/numismaticsgradle/asm/NumismaticsGradleASM.kt b/buildSrc/src/main/kotlin/dev/ithundxr/numismaticsgradle/asm/NumismaticsGradleASM.kt index 6e1fc630..46cead6c 100644 --- a/buildSrc/src/main/kotlin/dev/ithundxr/numismaticsgradle/asm/NumismaticsGradleASM.kt +++ b/buildSrc/src/main/kotlin/dev/ithundxr/numismaticsgradle/asm/NumismaticsGradleASM.kt @@ -19,7 +19,7 @@ package dev.ithundxr.numismaticsgradle.asm import dev.ithundxr.numismaticsgradle.asm.internal.SubprojectType -import dev.ithundxr.numismaticsgradle.asm.transformers.CCCapabilitiesASM +import dev.ithundxr.numismaticsgradle.asm.transformers.CCCapabilitiesTransformer import org.gradle.api.Project import org.objectweb.asm.ClassReader import org.objectweb.asm.ClassWriter @@ -35,7 +35,7 @@ class NumismaticsGradleASM { ClassReader(bytes).accept(node, 0) // Transformers - node = CCCapabilitiesASM().transform(projectType, node) + node = CCCapabilitiesTransformer().transform(projectType, node) // Verify the bytecode is valid val byteArray = ClassWriter(0).also { node.accept(it) }.toByteArray() diff --git a/buildSrc/src/main/kotlin/dev/ithundxr/numismaticsgradle/asm/transformers/CCCapabilitiesASM.kt b/buildSrc/src/main/kotlin/dev/ithundxr/numismaticsgradle/asm/transformers/CCCapabilitiesTransformer.kt similarity index 99% rename from buildSrc/src/main/kotlin/dev/ithundxr/numismaticsgradle/asm/transformers/CCCapabilitiesASM.kt rename to buildSrc/src/main/kotlin/dev/ithundxr/numismaticsgradle/asm/transformers/CCCapabilitiesTransformer.kt index 24b52977..625ce9b4 100644 --- a/buildSrc/src/main/kotlin/dev/ithundxr/numismaticsgradle/asm/transformers/CCCapabilitiesASM.kt +++ b/buildSrc/src/main/kotlin/dev/ithundxr/numismaticsgradle/asm/transformers/CCCapabilitiesTransformer.kt @@ -23,7 +23,7 @@ import org.objectweb.asm.Label import org.objectweb.asm.Opcodes import org.objectweb.asm.tree.ClassNode -class CCCapabilitiesASM { +class CCCapabilitiesTransformer { @Suppress("LocalVariableName") fun transform(project: SubprojectType, node: ClassNode): ClassNode { if (node.invisibleAnnotations != null && project == SubprojectType.FORGE) { diff --git a/buildSrc/src/main/kotlin/dev/ithundxr/numismaticsgradle/transformer/PostCompileTransformer.kt b/buildSrc/src/main/kotlin/dev/ithundxr/numismaticsgradle/transformer/PostCompileTransformer.kt deleted file mode 100644 index 4231802c..00000000 --- a/buildSrc/src/main/kotlin/dev/ithundxr/numismaticsgradle/transformer/PostCompileTransformer.kt +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Numismatics - * Copyright (c) 2024 The Railways Team - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package dev.ithundxr.numismaticsgradle.transformer - -import dev.ithundxr.numismaticsgradle.asm.NumismaticsGradleASM -import groovy.json.JsonOutput -import groovy.json.JsonSlurper -import org.gradle.api.Project -import java.io.File -import java.util.jar.JarEntry -import java.util.jar.JarFile -import java.util.jar.JarOutputStream -import java.util.zip.Deflater - -class PostCompileTransformer { - fun transformJar(project: Project, jar: File) { - var architecturyInjectableName = project.name - if (project.rootProject != project) - architecturyInjectableName = project.rootProject.name + "_" + architecturyInjectableName - - val contents = linkedMapOf() - JarFile(jar).use { - it.entries().asIterator().forEach { entry -> - if (!entry.isDirectory) { - contents[entry.name] = it.getInputStream(entry).readAllBytes() - } - } - } - - jar.delete() - - JarOutputStream(jar.outputStream()).use { out -> - out.setLevel(Deflater.BEST_COMPRESSION) - contents.forEach { var (name, data) = it - if (name.contains("architectury_inject_${architecturyInjectableName}_common")) - return@forEach - - if (name.endsWith(".json") || name.endsWith(".mcmeta")) { - data = (JsonOutput.toJson(JsonSlurper().parse(data)).toByteArray()) - } else if (name.endsWith(".class")) { - data = NumismaticsGradleASM().transformClass(project, data) - } - - out.putNextEntry(JarEntry(name)) - out.write(data) - out.closeEntry() - } - out.finish() - out.close() - } - } - -} \ No newline at end of file