diff options
Diffstat (limited to 'build.gradle.kts')
-rw-r--r-- | build.gradle.kts | 163 |
1 files changed, 154 insertions, 9 deletions
diff --git a/build.gradle.kts b/build.gradle.kts index d911121..440e815 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,20 @@ import com.github.gmazzo.buildconfig.BuildConfigExtension +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import com.google.gson.Gson import org.apache.commons.lang3.SystemUtils +import proguard.gradle.ProGuardTask import java.io.ByteArrayOutputStream +import java.net.URI +import java.util.zip.ZipInputStream + +buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("com.guardsquare:proguard-gradle:7.6.1") + } +} plugins { idea @@ -18,7 +32,7 @@ fun cmd(vararg args: String): String { standardOutput = baos commandLine(*args) } - return baos.toByteArray().decodeToString().trim() + return baos.toByteArray().decodeToString().trim() } @@ -76,6 +90,7 @@ sourceSets.main { repositories { mavenCentral() + maven("https://repo.nea.moe/releases/") maven("https://repo.spongepowered.org/maven/") maven("https://maven.notenoughupdates.org/releases") maven("https://pkgs.dev.azure.com/djtheredstoner/DevAuth/_packaging/public/maven/v1") @@ -91,6 +106,7 @@ dependencies { forge("net.minecraftforge:forge:1.8.9-11.15.1.2318-1.8.9") shadowImpl(kotlin("stdlib-jdk8")) + implementation("org.jspecify:jspecify:1.0.0") shadowImpl("org.spongepowered:mixin:0.7.11-SNAPSHOT") { isTransitive = false @@ -100,12 +116,18 @@ dependencies { shadowImpl("org.xerial:sqlite-jdbc:3.45.3.0") shadowImpl("org.notenoughupdates.moulconfig:legacy:3.0.0-beta.9") shadowImpl("io.azam.ulidj:ulidj:1.0.4") + shadowImpl("moe.nea:libautoupdate:1.3.1") runtimeOnly("me.djtheredstoner:DevAuth-forge-legacy:1.1.2") testImplementation("org.junit.jupiter:junit-jupiter:5.9.2") } // Tasks: +// Delete default shadow configuration +tasks.shadowJar { + doFirst { error("Incorrect shadow JAR built!") } +} + tasks.test { useJUnitPlatform() } @@ -114,6 +136,111 @@ tasks.withType(JavaCompile::class) { options.encoding = "UTF-8" } +abstract class GenerateItemIds : DefaultTask() { + @get: OutputDirectory + abstract val outputDirectory: DirectoryProperty + + @get: InputDirectory + abstract val repoFiles: DirectoryProperty + + @get: Input + abstract val repoHash: Property<String> + + @get: Input + abstract val packageName: Property<String> + + @get:Internal + val outputFile get() = outputDirectory.asFile.get().resolve(packageName.get().replace(".", "/") + "/ItemIds.java") + + @TaskAction + fun generateItemIds() { + val nonIdName = "[^A-Z0-9_]".toRegex() + + data class Item(val id: String) { + val javaName get() = id.replace(nonIdName, { "__" + it.value.single().code }) + } + + val items = mutableListOf<Item>() + for (listFile in repoFiles.asFile.get().resolve("items").listFiles() ?: emptyArray()) { + listFile ?: continue + if (listFile.extension != "json") { + error("Unknown file $listFile") + } + items.add(Item(listFile.nameWithoutExtension)) + } + items.sortedBy { it.id } + outputFile.parentFile.mkdirs() + val writer = outputFile.writer().buffered() + writer.appendLine("// @generated from " + repoHash.get()) + writer.appendLine("package " + packageName.get() + ";") + writer.appendLine() + writer.appendLine("import moe.nea.ledger.ItemId;") + writer.appendLine() + writer.appendLine("/**") + writer.appendLine(" * Automatically generated {@link ItemId} list.") + writer.appendLine(" */") + writer.appendLine("@org.jspecify.annotations.NullMarked") + writer.appendLine("public class ItemIds {") + val gson = Gson() + for (item in items) { + writer.appendLine("\t/**") + writer.appendLine("\t * @see <a href=${gson.toJson("https://github.com/NotEnoughUpdates/NotEnoughUpdates-REPO/blob/${repoHash.get()}/items/${item.id}.json")}>JSON definition</a>") + writer.appendLine("\t */") + writer.appendLine("\tpublic static final ItemId ${item.javaName} =" + + " ItemId.forName(${gson.toJson(item.id)});") + } + writer.appendLine("}") + writer.close() + } +} + +abstract class RepoDownload : DefaultTask() { + @get:Input + abstract val hash: Property<String> + + @get:OutputDirectory + abstract val outputDirectory: DirectoryProperty + + init { + outputDirectory.convention(project.layout.buildDirectory.dir("extracted-test-repo")) + } + + @TaskAction + fun performDownload() { + val outputDir = outputDirectory.asFile.get().absoluteFile + outputDir.mkdirs() + URI("https://github.com/notEnoughUpdates/notEnoughUpdates-rEPO/archive/${hash.get()}.zip").toURL().openStream() + .let(::ZipInputStream) + .use { zipInput -> + while (true) { + val entry = zipInput.nextEntry ?: break + val destination = outputDir.resolve( + entry.name.substringAfter('/')).absoluteFile + require(outputDir in generateSequence(destination) { it.parentFile }) + if (entry.isDirectory) continue + destination.parentFile.mkdirs() + destination.outputStream().use { output -> + zipInput.copyTo(output) + } + } + } + } +} + +val downloadRepo by tasks.register("downloadRepo", RepoDownload::class) { + hash.set("725ddb8") +} + +val generateItemIds by tasks.register("generateItemIds", GenerateItemIds::class) { + repoHash.set(downloadRepo.hash) + packageName.set("moe.nea.ledger.gen") + outputDirectory.set(layout.buildDirectory.dir("generated/sources/itemIds")) + repoFiles.set(downloadRepo.outputDirectory) +} +sourceSets.main { + java.srcDir(generateItemIds) +} + tasks.withType(Jar::class) { archiveBaseName.set(modid) manifest.attributes.run { @@ -140,10 +267,34 @@ tasks.processResources { } +val proguardOutJar = project.layout.buildDirectory.file("badjars/stripped.jar") +val proguard = tasks.register("proguard", ProGuardTask::class) { + dependsOn(tasks.jar) + injars(tasks.jar.map { it.archiveFile }) + outjars(proguardOutJar) + configuration(file("ledger-rules.pro")) + verbose() + val libJava = javaToolchains.launcherFor(java.toolchain) + .get() + .metadata.installationPath.file("jre/lib/rt.jar") + println(libJava) + libraryjars(libJava) + libraryjars(configurations.compileClasspath) +} + +val shadowJar2 = tasks.register("shadowJar2", ShadowJar::class) { + destinationDirectory.set(layout.buildDirectory.dir("badjars")) + archiveClassifier.set("all-dev") + from(proguardOutJar) + dependsOn(proguard) + configurations = listOf(shadowImpl) + relocate("moe.nea.libautoupdate", "moe.nea.ledger.deps.libautoupdate") + mergeServiceFiles() +} val remapJar by tasks.named<net.fabricmc.loom.task.RemapJarTask>("remapJar") { archiveClassifier.set("") - from(tasks.shadowJar) - input.set(tasks.shadowJar.get().archiveFile) + from(shadowJar2) + input.set(shadowJar2.get().archiveFile) } tasks.jar { @@ -151,12 +302,6 @@ tasks.jar { destinationDirectory.set(layout.buildDirectory.dir("badjars")) } -tasks.shadowJar { - destinationDirectory.set(layout.buildDirectory.dir("badjars")) - archiveClassifier.set("all-dev") - configurations = listOf(shadowImpl) - mergeServiceFiles() -} tasks.assemble.get().dependsOn(tasks.remapJar) |