From a4802088eabc842b8854b2a8655ddf1e6b0fc260 Mon Sep 17 00:00:00 2001
From: Username404 <w.iron.zombie@gmail.com>
Date: Wed, 19 May 2021 21:55:49 +0200
Subject: [PATCH] Fix proguard errors by remapping the shrinked .jar files

---
 build.gradle.kts | 115 +++++++++++++++++++++++------------------------
 1 file changed, 56 insertions(+), 59 deletions(-)

diff --git a/build.gradle.kts b/build.gradle.kts
index 0764bd2..a5ae084 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -33,15 +33,52 @@ subprojects {
     group = rootProject.group.toString()
     lateinit var mappingsDep: Dependency
     apply(plugin = "dev.architectury.loom")
+    extensions.configure<net.fabricmc.loom.LoomGradleExtension>("loom") {
+        mappingsDep = officialMojangMappings()
+        silentMojangMappingsLicense()
+        mixinConfig("snowygui-mixins.json")
+        refmapName = "snowygui-common-refmap.json"
+    }
     apply(plugin = "com.github.johnrengelman.shadow")
     val shadowC by configurations.creating
+    repositories { maven(url = "https://jitpack.io"); mavenCentral() }
+    dependencies {
+        implementation("$kotlinX:kotlinx-coroutines-core:1.5.0-RC")
+        listOf(
+            "$kotlinX:kotlinx-datetime:0.2.0",
+            "com.typesafe:config:1.4.1",
+            "io.github.config4k:config4k:0.4.2",
+            "org.jetbrains:annotations:20.1.0"
+        ).forEach { implementation(it); shadowC(it) { isTransitive = false; } }
+        "minecraft"("com.mojang:minecraft:${rootProject.property("minecraft")}")
+        "mappings"(mappingsDep)
+    }
     tasks {
-        withType(ShadowJar::class) { this.configurations = listOf(shadowC) }
+        apply(plugin = "net.kyori.indra.git")
+        withType(Jar::class) {
+            from("$rootDir/LICENSE.txt")
+            indraGit.applyVcsInformationToManifest(manifest)
+            archiveBaseName.set("${rootProject.name}-${rootProject.version}")
+        }
+        withType(ShadowJar::class) {
+            this.configurations = listOf(shadowC)
+            relocate("kotlinx.datetime", "${rootProject.group}.datetime")
+            relocate("org.jetbrains", "${rootProject.group}.jetbrainslibs")
+            relocate("javassist", "${rootProject.group}.javassist")
+            relocate("org.reflections8", "${rootProject.group}.reflectionlib")
+            relocate("com.typesafe.config", "${rootProject.group}.typesafe.config")
+            relocate("io.github.config4k", "${rootProject.group}.config4k")
+            relocate("net.arikia.dev.drpc", "${rootProject.group}.drpc")
+            exclude("**/*.kotlin_metadata")
+            exclude("**/*.kotlin_builtins")
+            exclude("META-INF/maven/**/*")
+            archiveClassifier.set("shadow")
+        }
+        val shadowJar = getByName("shadowJar") as ShadowJar
         val shrinkJar = register("shrinkJar", proguard.gradle.ProGuardTask::class) { group = this@subprojects.group as String
             val dictionariesDir = "$rootDir/obfuscation"
-            val remapJar = this@tasks.getByName("remapJar")
-            injars(remapJar)
-            outjars("$rootDir/shrinkedJars/${remapJar.outputs.files.singleFile.name}")
+            injars(shadowJar)
+            outjars("$rootDir/shrinkedJars/${shadowJar.outputs.files.singleFile.name}")
             keep("class $group.snowygui.mixins.* { * ; }")
             keep("class $group.snowygui.fabric.**")
             keep("class $group.snowygui.forge.**")
@@ -56,7 +93,6 @@ subprojects {
             allowaccessmodification()
             adaptclassstrings()
             "$group.**".also { dontnote(it); dontwarn(it) }
-            dontwarn("net.minecraft.**"); dontwarn("com.mojang.**")
 
             // kotlinx-serialization related configuration:
             dontnote("kotlinx.serialization.AnnotationsKt")
@@ -66,9 +102,11 @@ subprojects {
             keepclasseswithmembers("class $group.snowygui.** { kotlinx.serialization.KSerializer serializer(...); }")
 
             val homeDir = System.getProperty("java.home") as String
-            libraryjars(configurations.runtimeClasspath.get().filterNot { file ->
-                shadowC.contains(file)
-            })
+            doFirst {
+                libraryjars(configurations.runtimeClasspath.get().filterNot { file ->
+                    shadowC.contains(file)
+                })
+            }
             if (JavaVersion.current().isJava9Compatible) {
                 val jmodsLocations = setOf(
                     "$homeDir/jmods/java.base.jmod",
@@ -86,25 +124,14 @@ subprojects {
             overloadaggressively()
             mergeinterfacesaggressively()
         }
-        if (this@subprojects.name != "common") build.get().finalizedBy(shrinkJar)
-    }
-    extensions.configure<net.fabricmc.loom.LoomGradleExtension>("loom") {
-        mappingsDep = officialMojangMappings()
-        silentMojangMappingsLicense()
-        mixinConfig("snowygui-mixins.json")
-        refmapName = "snowygui-common-refmap.json"
-    }
-    repositories { maven(url = "https://jitpack.io") }
-    dependencies {
-        implementation("$kotlinX:kotlinx-coroutines-core:1.5.0-RC")
-        listOf(
-            "$kotlinX:kotlinx-datetime:0.2.0",
-            "com.typesafe:config:1.4.1",
-            "io.github.config4k:config4k:0.4.2",
-            "org.jetbrains:annotations:20.1.0"
-        ).forEach { implementation(it); shadowC(it) { isTransitive = false; } }
-        "minecraft"("com.mojang:minecraft:${rootProject.property("minecraft")}")
-        "mappings"(mappingsDep)
+        withType(net.fabricmc.loom.task.RemapJarTask::class) {
+            dependsOn(shrinkJar)
+            val shrinkedJar = shrinkJar.get().outJarFileCollection.singleFile
+            archiveBaseName.set(shadowJar.archiveBaseName)
+            archiveClassifier.set(this@subprojects.name)
+            input.set(shrinkedJar)
+            if (!archiveFileName.get().contains("common")) destinationDirectory.set(file("$rootDir/remappedJars"))
+        }
     }
 }
 
@@ -143,25 +170,6 @@ allprojects {
         }
     }
     tasks {
-        withType(ShadowJar::class) {
-            relocate("kotlinx.datetime", "${rootProject.group}.datetime")
-            relocate("org.jetbrains", "${rootProject.group}.jetbrainslibs")
-            relocate("javassist", "${rootProject.group}.javassist")
-            relocate("org.reflections8", "${rootProject.group}.reflectionlib")
-            relocate("com.typesafe.config", "${rootProject.group}.typesafe.config")
-            relocate("io.github.config4k", "${rootProject.group}.config4k")
-            relocate("net.arikia.dev.drpc", "${rootProject.group}.drpc")
-            exclude("**/*.kotlin_metadata")
-            exclude("**/*.kotlin_builtins")
-            exclude("META-INF/maven/**/*")
-            archiveClassifier.set("shadow")
-        }
-        apply(plugin = "net.kyori.indra.git")
-        withType(Jar::class) {
-            from("$rootDir/LICENSE.txt")
-            indraGit.applyVcsInformationToManifest(manifest)
-            archiveBaseName.set("${rootProject.name}-${rootProject.version}")
-        }
         withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class) {
             with(kotlinOptions) {
                 freeCompilerArgs = listOf("-Xjvm-default=all", "-Xlambdas=indy")
@@ -182,14 +190,6 @@ allprojects {
                 compilerArgs.addAll(listOf("-Xplugin:jabel", "--release", javaVer))
             }
         }
-        withType(net.fabricmc.loom.task.RemapJarTask::class) {
-            val shadowTask = getByName("shadowJar") as ShadowJar
-            dependsOn(shadowTask)
-            archiveBaseName.set(shadowTask.archiveBaseName)
-            input.set(shadowTask.archiveFile)
-            archiveClassifier.set(this@allprojects.name)
-            if (!archiveFileName.get().contains("common")) destinationDirectory.set(file("$rootDir/remappedJars"))
-        }
         withType(ProcessResources::class) {
             with(project(":common").sourceSets.main.get().resources.srcDirs) {
                 if (!sourceSets.main.get().resources.srcDirs.containsAll(this)) {
@@ -218,10 +218,7 @@ allprojects {
 }
 
 tasks {
-    listOf(
-        file("remappedJars"),
-        file("shrinkedJars")
-    ).forEach { if (it.exists()) clean.get().delete.add(it) }
+    file("remappedJars").let { if (it.exists()) clean.get().delete.add(it) }
     val publishToModrinth = register<com.modrinth.minotaur.TaskModrinthUpload>("publishtoModrinth") {
         val envStr: String? = System.getenv("MODRINTH")
         onlyIf { envStr != null }
@@ -233,7 +230,7 @@ tasks {
         versionType = VersionType.ALPHA
         detectLoaders = false
         versionName = "${project.name} $versionNumber for Minecraft $gameVersions and higher"
-        fileTree("$rootDir/shrinkedJars/").files.forEach {
+        fileTree("$rootDir/remappedJars/").files.forEach {
             with(it.name) {
                 when {
                     contains("fabric") -> uploadFile = it