Skip to content

Commit f8ee505

Browse files
committed
Allow patching unpick definitions
1 parent bb64e4c commit f8ee505

File tree

9 files changed

+211
-10
lines changed

9 files changed

+211
-10
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,5 @@
2121
/staging
2222
/input
2323
/repo
24+
25+
/definitions.unpick

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ dependencies {
9292
}
9393

9494
unpick {
95+
disablePatch = false
9596
intermediaryMcVersion = intermediaryVersion
9697
remapIntermediaryDefinitions = true
9798
}

buildSrc/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,6 @@ dependencies {
4141

4242
implementation("net.fabricmc.unpick:unpick:3.0.0-beta.11")
4343
implementation("net.fabricmc.unpick:unpick-format-utils:3.0.0-beta.11")
44+
45+
implementation("io.codechicken:DiffPatch:2.0.1.40")
4446
}

buildSrc/src/main/kotlin/org/parchmentmc/BlackstonePlugin.kt

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.parchmentmc
22

3+
import io.codechicken.diffpatch.util.PatchMode
34
import org.gradle.api.Plugin
45
import org.gradle.api.Project
56
import org.gradle.api.publish.PublishingExtension
@@ -12,8 +13,12 @@ import org.parchmentmc.compass.tasks.SanitizeData
1213
import org.parchmentmc.compass.tasks.ValidateData
1314
import org.parchmentmc.lodestone.LodestoneExtension
1415
import org.parchmentmc.lodestone.tasks.*
16+
import org.parchmentmc.tasks.ApplyFilePatch
1517
import org.parchmentmc.tasks.DownloadSingleVersionDownload
18+
import org.parchmentmc.tasks.RebuildFilePatch
1619
import org.parchmentmc.tasks.RemapUnpickDefinitions
20+
import org.parchmentmc.util.fileExists
21+
import java.io.File
1722

1823
class BlackstonePlugin : Plugin<Project> {
1924
companion object {
@@ -76,12 +81,40 @@ class BlackstonePlugin : Plugin<Project> {
7681
output.set(project.layout.buildDirectory.file("intermediary-mojmap.txt"))
7782
versionManifest.set(downloadIntermediaryVersionMeta.flatMap { it.output })
7883
}
79-
target.tasks.register<RemapUnpickDefinitions>("remapUnpickDefinitions") {
84+
val remap = target.tasks.register<RemapUnpickDefinitions>("remapUnpickDefinitions") {
8085
inputDefinitionsJar.setFrom(defs)
8186
outputDefinitionsFile.set(target.layout.buildDirectory.file("definitions.unpick"))
8287
intermediaryJar.setFrom(intermediary)
8388
mojangMappings.set(dlMaps.flatMap { it.output })
8489
}
90+
val patchUnpickDefinitions = target.tasks.register<ApplyFilePatch>("applyUnpickDefinitionsPatch") {
91+
patchFile.convention(project.provider { project.layout.projectDirectory.file("definitions.unpick.patch") }.fileExists())
92+
targetFile.convention(remap.flatMap { it.outputDefinitionsFile })
93+
mode.convention(PatchMode.OFFSET)
94+
minFuzz.convention("0.5")
95+
outputFile.convention(target.layout.projectDirectory.file("definitions.unpick"))
96+
rejectsFile.convention(target.layout.projectDirectory.file("definitions.unpick.rej"))
97+
}
98+
val rebuildUnpickPatch = target.tasks.register<RebuildFilePatch>("rebuildUnpickDefinitionsPatch") {
99+
originalFile.convention(remap.flatMap { it.outputDefinitionsFile })
100+
modifiedFile.convention(target.layout.projectDirectory.file("definitions.unpick"))
101+
patchFile.convention(project.layout.projectDirectory.file("definitions.unpick.patch"))
102+
}
103+
target.afterEvaluate {
104+
if (!ext.remapIntermediaryDefinitions.get()) {
105+
patchUnpickDefinitions {
106+
targetFile.convention(target.layout.file(defs.map { it.singleFile }))
107+
}
108+
rebuildUnpickPatch {
109+
originalFile.convention(target.layout.file(defs.map { it.singleFile }) )
110+
}
111+
}
112+
if (ext.disablePatch.get()) {
113+
patchUnpickDefinitions {
114+
patchFile.set(null as File?)
115+
}
116+
}
117+
}
85118
}
86119

87120
private fun registerTasks(target: Project, mcVersion: String): TaskProvider<Zip> {
Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package org.parchmentmc
22

3+
import org.gradle.api.file.RegularFileProperty
34
import org.gradle.api.provider.Property
45
import org.gradle.api.tasks.bundling.AbstractArchiveTask
56
import org.gradle.kotlin.dsl.named
7+
import org.parchmentmc.tasks.ApplyFilePatch
68
import org.parchmentmc.tasks.RemapUnpickDefinitions
79

810
abstract class UnpickExtension {
11+
abstract val disablePatch: Property<Boolean>
912
abstract val remapIntermediaryDefinitions: Property<Boolean>
1013
abstract val intermediaryMcVersion: Property<String>
1114

@@ -14,19 +17,14 @@ abstract class UnpickExtension {
1417
}
1518

1619
fun init() {
20+
disablePatch.convention(false)
1721
remapIntermediaryDefinitions.convention(true)
1822
}
1923

2024
fun includeDefinitions(task: AbstractArchiveTask) {
21-
if (remapIntermediaryDefinitions.get()) {
22-
task.from(task.project.tasks.named<RemapUnpickDefinitions>("remapUnpickDefinitions")) {
23-
into("extras")
24-
}
25-
} else {
26-
task.from(task.project.configurations.named("unpickDefinitions")) {
27-
into("extras")
28-
rename(".*", "definitions.unpick")
29-
}
25+
task.from(task.project.tasks.named<ApplyFilePatch>("applyUnpickDefinitionsPatch").flatMap { it.outputFile }) {
26+
into("extras")
27+
rename(".*", "definitions.unpick")
3028
}
3129
}
3230
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package org.parchmentmc.tasks
2+
3+
import io.codechicken.diffpatch.cli.DiffPatchCli
4+
import io.codechicken.diffpatch.cli.PatchOperation
5+
import io.codechicken.diffpatch.patch.Patcher
6+
import io.codechicken.diffpatch.util.Input.SingleInput
7+
import io.codechicken.diffpatch.util.LogLevel
8+
import io.codechicken.diffpatch.util.Output
9+
import io.codechicken.diffpatch.util.PatchMode
10+
import org.gradle.api.DefaultTask
11+
import org.gradle.api.file.RegularFileProperty
12+
import org.gradle.api.provider.Property
13+
import org.gradle.api.tasks.Input
14+
import org.gradle.api.tasks.InputFile
15+
import org.gradle.api.tasks.Optional
16+
import org.gradle.api.tasks.OutputFile
17+
import org.gradle.api.tasks.PathSensitive
18+
import org.gradle.api.tasks.PathSensitivity
19+
import org.gradle.api.tasks.TaskAction
20+
import org.parchmentmc.util.path
21+
import java.io.PrintStream
22+
import java.nio.file.StandardOpenOption
23+
import kotlin.io.path.copyTo
24+
import kotlin.io.path.createParentDirectories
25+
import kotlin.io.path.deleteIfExists
26+
import kotlin.io.path.exists
27+
28+
abstract class ApplyFilePatch : DefaultTask() {
29+
@get:InputFile
30+
@get:Optional
31+
@get:PathSensitive(PathSensitivity.NONE)
32+
abstract val patchFile: RegularFileProperty
33+
34+
@get:InputFile
35+
@get:PathSensitive(PathSensitivity.NONE)
36+
abstract val targetFile: RegularFileProperty
37+
38+
@get:OutputFile
39+
abstract val outputFile: RegularFileProperty
40+
41+
@get:OutputFile
42+
abstract val rejectsFile: RegularFileProperty
43+
44+
@get:Input
45+
abstract val mode: Property<PatchMode>
46+
47+
@get:Input
48+
abstract val minFuzz: Property<String>
49+
50+
@TaskAction
51+
fun patch() {
52+
outputFile.path.createParentDirectories()
53+
rejectsFile.path.createParentDirectories()
54+
val log = temporaryDir.resolve("log.txt")
55+
log.toPath().createParentDirectories().deleteIfExists()
56+
57+
if (!patchFile.isPresent) {
58+
targetFile.path.copyTo(outputFile.path)
59+
return
60+
}
61+
62+
val result = PrintStream(log, Charsets.UTF_8).use { logger ->
63+
PatchOperation.builder()
64+
.logTo(logger)
65+
.level(LogLevel.ALL)
66+
.mode(PatchMode.OFFSET)
67+
.minFuzz(minFuzz.get().toFloat())
68+
.summary(false)
69+
.baseInput(SingleInput.path(targetFile.path))
70+
.patchesInput(SingleInput.path(patchFile.path))
71+
.patchedOutput(Output.SingleOutput.path(outputFile.path, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.CREATE))
72+
.rejectsOutput(Output.SingleOutput.path(rejectsFile.path, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.CREATE))
73+
.build()
74+
.operate()
75+
}
76+
77+
if (result.exit != 0) {
78+
throw RuntimeException("Failed to apply patch, exit code ${result.exit}, see log at ${log.absolutePath}")
79+
}
80+
}
81+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package org.parchmentmc.tasks
2+
3+
import io.codechicken.diffpatch.cli.DiffOperation
4+
import io.codechicken.diffpatch.util.Input.SingleInput
5+
import io.codechicken.diffpatch.util.LogLevel
6+
import io.codechicken.diffpatch.util.Output
7+
import org.gradle.api.DefaultTask
8+
import org.gradle.api.file.RegularFileProperty
9+
import org.gradle.api.provider.Property
10+
import org.gradle.api.tasks.Input
11+
import org.gradle.api.tasks.InputFile
12+
import org.gradle.api.tasks.OutputFile
13+
import org.gradle.api.tasks.PathSensitive
14+
import org.gradle.api.tasks.PathSensitivity
15+
import org.gradle.api.tasks.TaskAction
16+
import org.parchmentmc.util.path
17+
import java.io.PrintStream
18+
import java.nio.file.StandardOpenOption
19+
import kotlin.io.path.copyTo
20+
import kotlin.io.path.createParentDirectories
21+
import kotlin.io.path.deleteIfExists
22+
import kotlin.io.path.name
23+
24+
abstract class RebuildFilePatch : DefaultTask() {
25+
@get:InputFile
26+
@get:PathSensitive(PathSensitivity.NONE)
27+
abstract val originalFile: RegularFileProperty
28+
29+
@get:InputFile
30+
@get:PathSensitive(PathSensitivity.NONE)
31+
abstract val modifiedFile: RegularFileProperty
32+
33+
@get:OutputFile
34+
abstract val patchFile: RegularFileProperty
35+
36+
@TaskAction
37+
fun rebuild() {
38+
patchFile.path.createParentDirectories()
39+
val log = temporaryDir.resolve("log.txt")
40+
log.toPath().createParentDirectories().deleteIfExists()
41+
42+
val aDir = temporaryDir.resolve("a")
43+
aDir.deleteRecursively()
44+
val bDir = temporaryDir.resolve("b")
45+
bDir.deleteRecursively()
46+
val patchDir = temporaryDir.resolve("patch")
47+
patchDir.deleteRecursively()
48+
49+
val aFile = aDir.resolve(originalFile.path.name).toPath().createParentDirectories()
50+
originalFile.path.copyTo(aFile)
51+
val bFile = bDir.resolve(modifiedFile.path.name).toPath().createParentDirectories()
52+
modifiedFile.path.copyTo(bFile)
53+
54+
val result = PrintStream(log, Charsets.UTF_8).use { logger ->
55+
DiffOperation.builder()
56+
.logTo(logger)
57+
.level(LogLevel.ALL)
58+
.summary(false)
59+
.lineEnding("\n")
60+
.autoHeader(true)
61+
.baseInput(io.codechicken.diffpatch.util.Input.MultiInput.folder(aDir.toPath()))
62+
.changedInput(io.codechicken.diffpatch.util.Input.MultiInput.folder(bDir.toPath()))
63+
.patchesOutput(Output.SingleOutput.path(patchFile.path, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.CREATE))
64+
.build()
65+
.operate()
66+
}
67+
}
68+
}

buildSrc/src/main/kotlin/org/parchmentmc/util/util.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import java.util.stream.Stream
1616
import java.util.stream.StreamSupport
1717
import kotlin.reflect.KClass
1818

19+
import kotlin.io.path.exists
20+
1921
val json = Json {
2022
ignoreUnknownKeys = true
2123
prettyPrint = true
@@ -46,6 +48,10 @@ val Provider<out FileSystemLocation>.path: Path
4648
val Provider<out FileSystemLocation>.pathOrNull: Path?
4749
get() = orNull?.path
4850

51+
fun <T : FileSystemLocation> Provider<out T>.fileExists(): Provider<out T> {
52+
return map { it.takeIf { f -> f.path.exists() } }
53+
}
54+
4955
private fun Path.jarUri(): URI {
5056
return URI.create("jar:${toUri()}")
5157
}

definitions.unpick.patch

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
--- a/definitions.unpick
2+
+++ b/definitions.unpick
3+
@@ -1646,6 +_,7 @@
4+
return s2c_animation_id
5+
6+
group int s2c_game_state_demo_value
7+
+ @scope class net.minecraft.server.level.DemoMode
8+
net.minecraft.network.protocol.game.ClientboundGameEventPacket.DEMO_PARAM_INTRO
9+
net.minecraft.network.protocol.game.ClientboundGameEventPacket.DEMO_PARAM_HINT_1
10+
net.minecraft.network.protocol.game.ClientboundGameEventPacket.DEMO_PARAM_HINT_2

0 commit comments

Comments
 (0)