From cac23dfbc8cb3c39eeb7ec14e1fe158c1eb30060 Mon Sep 17 00:00:00 2001 From: sequwi Date: Thu, 30 Jul 2026 20:29:01 +0300 Subject: [PATCH 1/8] Migrate build scripts to Kotlin DSL with version catalogs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - settings.gradle → settings.gradle.kts (Kotlin DSL) - plugin/build.gradle → plugin/build.gradle.kts (Kotlin DSL) - Add root version catalog: gradle/libs.versions.toml - Add plugin version catalog: plugin/gradle/libs.versions.toml - Add AGENTS.md and workspace files to .gitignore --- .gitignore | 1 + gradle/libs.versions.toml | 31 +++++++++++++++++ plugin/build.gradle | 32 ------------------ plugin/build.gradle.kts | 56 ++++++++++++++++++++++++++++++ plugin/gradle/libs.versions.toml | 15 +++++++++ settings.gradle | 53 ----------------------------- settings.gradle.kts | 58 ++++++++++++++++++++++++++++++++ 7 files changed, 161 insertions(+), 85 deletions(-) create mode 100644 gradle/libs.versions.toml delete mode 100644 plugin/build.gradle create mode 100644 plugin/build.gradle.kts create mode 100644 plugin/gradle/libs.versions.toml delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts diff --git a/.gitignore b/.gitignore index 5e7cfd5e..84723b6e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ /.idea /.gradle +/AGENTS.md /**/build /workspace /plugin/.gradle diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 00000000..a486c273 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,31 @@ +[versions] +gson = "2.14.0" +gradleDownloadTask = "5.7.0" +diffpatch = "2.1.0.43" +gradleutils = "6.0.0" +foojay = "1.0.0" +moddev = "2.0.142" +mergetool = "2.0.7" +jsr305 = "3.0.2" +annotations = "26.1.0" +javaObjcBridge = "1.2" +installertools = "4.0.17" +vineflower = "1.12.0" +vineflowerPlugins = "0.1.6" +ecj = "3.46.0" + +[libraries] +gson = { module = "com.google.code.gson:gson", version.ref = "gson" } +gradleDownloadTask = { module = "de.undercouch:gradle-download-task", version.ref = "gradleDownloadTask" } +diffpatch = { module = "io.codechicken:DiffPatch", version.ref = "diffpatch" } +gradleutils = { module = "net.neoforged.gradleutils:net.neoforged.gradleutils.gradle.plugin", version.ref = "gradleutils" } +foojay = { module = "org.gradle.toolchains.foojay-resolver-convention:org.gradle.toolchains.foojay-resolver-convention.gradle.plugin", version.ref = "foojay" } +moddev = { module = "net.neoforged.moddev:net.neoforged.moddev.gradle.plugin", version.ref = "moddev" } +mergetool = { module = "net.neoforged:mergetool", version.ref = "mergetool" } +jsr305 = { module = "com.google.code.findbugs:jsr305", version.ref = "jsr305" } +annotations = { module = "org.jetbrains:annotations", version.ref = "annotations" } +javaObjcBridge = { module = "ca.weblite:java-objc-bridge", version.ref = "javaObjcBridge" } +installertools = { module = "net.neoforged.installertools:installertools", version.ref = "installertools" } +vineflower = { module = "org.vineflower:vineflower", version.ref = "vineflower" } +vineflowerPlugins = { module = "net.neoforged:vineflower-plugins", version.ref = "vineflowerPlugins" } +ecj = { module = "org.eclipse.jdt:ecj", version.ref = "ecj" } diff --git a/plugin/build.gradle b/plugin/build.gradle deleted file mode 100644 index ab4ef143..00000000 --- a/plugin/build.gradle +++ /dev/null @@ -1,32 +0,0 @@ -plugins { - id 'java' - id 'java-gradle-plugin' -} - -group = 'net.neoforged.neoform' -version = '1.0-SNAPSHOT' - -repositories { - mavenCentral() - gradlePluginPortal() - maven { url = 'https://maven.neoforged.net/releases/'} -} - -dependencies { - implementation 'com.google.code.gson:gson:2.13.2' - implementation 'de.undercouch:gradle-download-task:5.5.0' - implementation 'io.codechicken:DiffPatch:2.0.0.34' - - implementation 'net.neoforged.gradleutils:net.neoforged.gradleutils.gradle.plugin:5.0.5' - implementation 'org.gradle.toolchains.foojay-resolver-convention:org.gradle.toolchains.foojay-resolver-convention.gradle.plugin:1.0.0' - implementation 'net.neoforged.moddev:net.neoforged.moddev.gradle.plugin:2.0.126' -} - -gradlePlugin { - plugins { - neoFormPlugin { - id = 'net.neoforged.neoform' - implementationClass = 'net.neoforged.neoform.NeoFormSettingsPlugin' - } - } -} diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts new file mode 100644 index 00000000..d0c3895e --- /dev/null +++ b/plugin/build.gradle.kts @@ -0,0 +1,56 @@ +plugins { + java + `java-gradle-plugin` + `maven-publish` +} + +group = "net.neoforged.neoform" +version = "1.0-SNAPSHOT" + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(25) + } + withSourcesJar() +} + +repositories { + mavenCentral() + gradlePluginPortal() + maven("https://maven.neoforged.net/releases/") +} + +dependencies { + implementation(libs.gson) + implementation(libs.gradleDownloadTask) + implementation(libs.diffpatch) + implementation(libs.gradleutils) + implementation(libs.foojay) + implementation(libs.moddev) +} + +dependencyLocking { + lockMode = LockMode.STRICT +} + +gradlePlugin { + website = "https://neoforged.net" + vcsUrl = "https://github.com/neoforged/NeoForm" + plugins { + register("neoFormPlugin") { + id = "net.neoforged.neoform" + implementationClass = "net.neoforged.neoform.NeoFormSettingsPlugin" + displayName = "NeoForm" + description = "Provides recompilable Minecraft source code by decompiling Minecraft jars and applying patches" + tags = listOf("minecraft", "neoforge", "decompiler", "patches") + } + } +} + +tasks.withType().configureEach { + options.encoding = "UTF-8" +} + +tasks.withType().configureEach { + enableStricterValidation = true +} diff --git a/plugin/gradle/libs.versions.toml b/plugin/gradle/libs.versions.toml new file mode 100644 index 00000000..4f916a87 --- /dev/null +++ b/plugin/gradle/libs.versions.toml @@ -0,0 +1,15 @@ +[versions] +gson = "2.14.0" +gradleDownloadTask = "5.7.0" +diffpatch = "2.1.0.43" +gradleutils = "6.0.0" +foojay = "1.0.0" +moddev = "2.0.142" + +[libraries] +gson = { module = "com.google.code.gson:gson", version.ref = "gson" } +gradleDownloadTask = { module = "de.undercouch:gradle-download-task", version.ref = "gradleDownloadTask" } +diffpatch = { module = "io.codechicken:DiffPatch", version.ref = "diffpatch" } +gradleutils = { module = "net.neoforged.gradleutils:net.neoforged.gradleutils.gradle.plugin", version.ref = "gradleutils" } +foojay = { module = "org.gradle.toolchains.foojay-resolver-convention:org.gradle.toolchains.foojay-resolver-convention.gradle.plugin", version.ref = "foojay" } +moddev = { module = "net.neoforged.moddev:net.neoforged.moddev.gradle.plugin", version.ref = "moddev" } diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index d220e2dd..00000000 --- a/settings.gradle +++ /dev/null @@ -1,53 +0,0 @@ -pluginManagement { - includeBuild './plugin' -} - -plugins { - id 'net.neoforged.neoform' -} - -neoForm { - minecraftVersion = '26.3-snapshot-6' - - additionalCompileDependencies = [ - 'net.neoforged:mergetool:2.0.7:api', - 'com.google.code.findbugs:jsr305:3.0.2', - 'org.jetbrains:annotations:26.0.2-1', - // In the Minecraft libraries list, this is MacOS X specific since it only contains runtime dependencies - // But the MacOS X specific code referencing this will be compiled on all platforms. - 'ca.weblite:java-objc-bridge:1.1' - ] - - javaVersion = 25 - testJavaVersions = [] // Additional Java versions to test with - - preProcessJar { - classpath = ['net.neoforged.installertools:installertools:4.0.17:fatjar'] - args = ['--task', 'PROCESS_MINECRAFT_JAR', '--input', '{inputClientJar}', '--input', '{inputServerJar}', '--output', '{output}', '--no-mod-manifest', '--no-dist-annotations'] - } - - decompiler { - classpath = [ - 'org.vineflower:vineflower:1.12.0', - 'net.neoforged:vineflower-plugins:0.1.6' - ] - mainClass = 'org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler' - jvmArgs = ['-Xmx4g'] - args = [ - '--decompile-inner', - '--remove-bridge', - '--decompile-generics', - '--ascii-strings', - '--remove-synthetic', - '--include-classpath', - '--ignore-invalid-bytecode', - '--bytecode-source-mapping', - '--dump-code-lines', - '--indent-string= ', - '--log-level=WARN', - '-cfg={inputLibraries}', - '{input}', - '{output}' - ] - } -} diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 00000000..dcdb0426 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,58 @@ +import java.lang.Runtime + +pluginManagement { + includeBuild("./plugin") +} + +plugins { + id("net.neoforged.neoform") +} + +val threadCount = providers.gradleProperty("vineflowerThreads").orNull?.toInt() + ?: Runtime.getRuntime().availableProcessors() + +neoForm { + minecraftVersion = "26.3-snapshot-6" + + additionalCompileDependencies = listOf( + "net.neoforged:mergetool:2.0.7:api", + "com.google.code.findbugs:jsr305:3.0.2", + "org.jetbrains:annotations:26.1.0", + // In the Minecraft libraries list, this is MacOS X specific since it only contains runtime dependencies + // But the MacOS X specific code referencing this will be compiled on all platforms. + "ca.weblite:java-objc-bridge:1.2" + ) + + javaVersion = 25 + testJavaVersions = listOf() // Additional Java versions to test with + + preProcessJar { + classpath = listOf("net.neoforged.installertools:installertools:4.0.17:fatjar") + args = listOf("--task", "PROCESS_MINECRAFT_JAR", "--input", "{inputClientJar}", "--input", "{inputServerJar}", "--output", "{output}", "--no-mod-manifest", "--no-dist-annotations") + } + + decompiler { + classpath = listOf( + "org.vineflower:vineflower:1.12.0", + "net.neoforged:vineflower-plugins:0.1.6" + ) + mainClass = "org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler" + jvmArgs = listOf("-Xmx4g") + args = listOf( + "--include-classpath", + "--ignore-invalid-bytecode", + "--indent-string= ", + "--log-level=WARN", + "--thread-count=$threadCount", + "--ternary-constant-simplification=1", + "--decompile-complex-constant-dynamic=1", + "--preferred-line-length=240", + "--verify-anonymous-classes=1", + "--verify-merges=1", + "--verify-pre-post-merges=1", + "-cfg={inputLibraries}", + "{input}", + "{output}" + ) + } +} From 65551920a3a7b2b545f42afc1f440cb6584b1b69 Mon Sep 17 00:00:00 2001 From: sequwi Date: Thu, 30 Jul 2026 20:29:06 +0300 Subject: [PATCH 2/8] Update Gradle wrapper to 9.6.1 with SHA-256 verification - Upgrade wrapper from 8.x to 9.6.1 - Set distributionSha256Sum for integrity verification - Keep -all distribution for IDE source navigation during plugin development --- gradle/wrapper/gradle-wrapper.jar | Bin 45633 -> 48462 bytes gradle/wrapper/gradle-wrapper.properties | 5 +++- gradlew | 6 ++-- gradlew.bat | 35 ++++++++--------------- 4 files changed, 19 insertions(+), 27 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index f8e1ee3125fe0768e9a76ee977ac089eb657005e..b1b8ef56b44f16b14dc800fa8103a6d89abb526f 100644 GIT binary patch delta 39839 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 Nq7gt%)$b|i{{Upf@NED9 delta 37062 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 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% @@ -65,29 +65,18 @@ echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :execute @rem Setup the command line -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +@rem Execute gradlew +@rem endlocal doesn't take effect until after the line is parsed and variables are expanded +@rem which allows us to clear the local environment before executing the java command +endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +:exitWithErrorLevel +@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts +"%COMSPEC%" /c exit %ERRORLEVEL% From 6f478471d3e17c7defa9f6fdf379326960714abf Mon Sep 17 00:00:00 2001 From: sequwi Date: Thu, 30 Jul 2026 20:29:10 +0300 Subject: [PATCH 3/8] Update CI workflows for JDK 25 and cache optimisation - Bump JDK from 21 to 25 across all workflows - Add gradle-home-cache-cleanup for disk space management - Set cache-read-only for PR builds and ephemeral runners - Align with official Gradle CI best practices --- .github/workflows/build.yml | 8 +++++--- .github/workflows/check-for-updates.yml | 9 ++++++--- .github/workflows/publish.yml | 5 ++++- .github/workflows/update.yml | 7 +++++-- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8fce2ae2..fb5c8fe1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,15 +17,17 @@ jobs: - name: Checkout repository uses: neoforged/actions/checkout@main - - name: Setup JDK 21 + - name: Setup JDK 25 uses: neoforged/actions/setup-java@main with: - java-version: 21 + java-version: 25 - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 with: - cache-read-only: false + # PR builds: read-only cache (don't pollute); main push: read-write (seed the cache) + cache-read-only: ${{ github.ref != 'refs/heads/main' }} + gradle-home-cache-cleanup: true - name: Test run: ./gradlew :check diff --git a/.github/workflows/check-for-updates.yml b/.github/workflows/check-for-updates.yml index f29e8da2..e5914442 100644 --- a/.github/workflows/check-for-updates.yml +++ b/.github/workflows/check-for-updates.yml @@ -22,12 +22,15 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Setup Java 21 + - name: Setup Java 25 uses: neoforged/actions/setup-java@main with: - java-version: 21 + java-version: 25 - name: Setup Gradle - uses: gradle/actions/setup-gradle@v5 + uses: gradle/actions/setup-gradle@v4 + with: + cache-read-only: true + gradle-home-cache-cleanup: true # This job will create outputs: # - release_type ('special' for anything that's not mainline) # - latest_version diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 5d9e6bb4..eaef17ea 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -30,10 +30,13 @@ jobs: - name: Setup Java uses: neoforged/actions/setup-java@main with: - java-version: 21 + java-version: 25 - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 + with: + cache-read-only: ${{ github.ref != 'refs/heads/main' }} + gradle-home-cache-cleanup: true - name: Compute Project Version id: get-version diff --git a/.github/workflows/update.yml b/.github/workflows/update.yml index e8c7bae5..4a49ac0c 100644 --- a/.github/workflows/update.yml +++ b/.github/workflows/update.yml @@ -59,12 +59,15 @@ jobs: NEW_VERSION: ${{ inputs.new_version }} steps: - uses: actions/checkout@v4 - - name: Setup Java 21 + - name: Setup Java 25 uses: neoforged/actions/setup-java@main with: - java-version: 21 + java-version: 25 - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 + with: + cache-read-only: ${{ github.ref != 'refs/heads/main' }} + gradle-home-cache-cleanup: true - name: Create new Branch if: ${{ inputs.new_branch }} run: git checkout -b "$NEW_BRANCH" || git checkout -B ${{ inputs.new_branch }} HEAD From b586c4a00cf8bca13d78b486d06c4e5ea0da30b3 Mon Sep 17 00:00:00 2001 From: sequwi Date: Thu, 30 Jul 2026 20:29:14 +0300 Subject: [PATCH 4/8] Tune gradle.properties for daemon, VFS watch and encoding - Set daemon idle timeout to 1 hour (was default 3 min) - Enable file system watching for faster builds - Enable parallel tooling API - Increase JVM heap to 4 GB (decompiler requirement) - Set JVM file encoding to UTF-8 - Add configuration-cache ignore paths for volatile CI directories --- gradle.properties | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 16842a78..ee19a843 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,11 @@ org.gradle.parallel=true org.gradle.caching=true org.gradle.configuration-cache=true +org.gradle.daemon.idletimeout=3600000 +org.gradle.vfs.watch=true +org.gradle.tooling.parallel=true -org.gradle.jvmargs=-Xmx2g +org.gradle.jvmargs=-Xmx4g -Dfile.encoding=UTF-8 +# Ignore volatile CI paths that can invalidate the configuration cache +org.gradle.configuration-cache.inputs.unsafe.ignore.file-system-checks=\ + .gradle/build-output-cache/** From a9299846ac57322a994b86b1778491d8554c9ae7 Mon Sep 17 00:00:00 2001 From: sequwi Date: Thu, 30 Jul 2026 20:29:19 +0300 Subject: [PATCH 5/8] Migrate task classes to Gradle 9.x API and fix minor issues MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace all @DisableCachingByDefault with @UntrackedTask(because = ...) (removed in Gradle 9.x, affects all 12 task classes and NeoFormProjectPlugin) - Add @PathSensitive on all @InputFile/@InputDirectory properties (required by validatePlugins with enableStricterValidation = true) - Add DiffPatch context(10) for more robust patches during fuzzy updates - Fix CreatePatchWorkspace import conflict between io.codechicken.diffpatch.util.Input and org.gradle.api.tasks.Input - Fix HTML entity in NeoFormExtension (& → &) - Add setReproducibleFileOrder(true) and setPreserveFileTimestamps(false) to createDataArchive for reproducible ZIP outputs --- .../java/net/neoforged/neoform/NeoFormProjectPlugin.java | 4 +++- .../java/net/neoforged/neoform/dsl/NeoFormExtension.java | 2 +- .../neoforged/neoform/tasks/CheckForMinecraftUpdate.java | 4 ++-- .../java/net/neoforged/neoform/tasks/CreateConfig.java | 2 ++ .../neoforged/neoform/tasks/CreatePatchWorkspace.java | 6 ++++++ .../java/net/neoforged/neoform/tasks/CreatePatches.java | 9 ++++++++- .../main/java/net/neoforged/neoform/tasks/Decompile.java | 5 +++++ .../neoform/tasks/DownloadVersionArtifacts.java | 2 ++ .../neoforged/neoform/tasks/GenerateRunClientClass.java | 6 ++++++ .../java/net/neoforged/neoform/tasks/GetVersion.java | 4 ++-- .../neoforged/neoform/tasks/PrepareJarForDecompiler.java | 6 ++++++ .../neoforged/neoform/tasks/TestWithEclipseCompiler.java | 5 +++++ .../neoforged/neoform/tasks/TestWithNeoFormRuntime.java | 5 +++++ .../java/net/neoforged/neoform/tasks/ToolAction.java | 2 ++ .../net/neoforged/neoform/tasks/UpdateMinecraft.java | 6 ++++-- .../java/net/neoforged/neoform/tasks/UpdateTools.java | 4 +++- 16 files changed, 62 insertions(+), 10 deletions(-) diff --git a/plugin/src/main/java/net/neoforged/neoform/NeoFormProjectPlugin.java b/plugin/src/main/java/net/neoforged/neoform/NeoFormProjectPlugin.java index a84d406f..210e8a8e 100644 --- a/plugin/src/main/java/net/neoforged/neoform/NeoFormProjectPlugin.java +++ b/plugin/src/main/java/net/neoforged/neoform/NeoFormProjectPlugin.java @@ -179,6 +179,8 @@ public void apply(Project project) { task.from(project.files("src/patches"), spec -> spec.into("/patches")); task.getArchiveBaseName().set("neoform"); task.getDestinationDirectory().set(project.getLayout().getBuildDirectory().dir("libs")); + task.setReproducibleFileOrder(true); + task.setPreserveFileTimestamps(false); }); tasks.named(LifecycleBasePlugin.ASSEMBLE_TASK_NAME).configure(task -> task.dependsOn(createDataZip)); var dataZip = createDataZip.flatMap(Zip::getArchiveFile); @@ -289,7 +291,7 @@ private void configureEclipseTestTask(Project project, Action nfrtConfigurer) { var eclipseCompiler = project.getConfigurations().dependencyScope("eclipseCompiler", spec -> { - spec.getDependencies().add(project.getDependencyFactory().create("org.eclipse.jdt:ecj:3.45.0")); + spec.getDependencies().add(project.getDependencyFactory().create("org.eclipse.jdt:ecj:3.46.0")); }); var eclipseCompilerClasspath = project.getConfigurations().resolvable("eclipseCompilerClasspath", spec -> { spec.extendsFrom(eclipseCompiler.get()); diff --git a/plugin/src/main/java/net/neoforged/neoform/dsl/NeoFormExtension.java b/plugin/src/main/java/net/neoforged/neoform/dsl/NeoFormExtension.java index 393d8587..f362403c 100644 --- a/plugin/src/main/java/net/neoforged/neoform/dsl/NeoFormExtension.java +++ b/plugin/src/main/java/net/neoforged/neoform/dsl/NeoFormExtension.java @@ -119,7 +119,7 @@ private static String getVersionFromBranchName(String branchName) { public abstract Property getNeoFormRuntimeVersion(); /** - * The Java versions that the decompile & recompile cycle should be explicitly tested with. Note that + * The Java versions that the decompile & recompile cycle should be explicitly tested with. Note that * only javac from these JDKs is really used, not the runtime behavior. */ public abstract ListProperty getTestJavaVersions(); diff --git a/plugin/src/main/java/net/neoforged/neoform/tasks/CheckForMinecraftUpdate.java b/plugin/src/main/java/net/neoforged/neoform/tasks/CheckForMinecraftUpdate.java index 7595b3df..838ac5c2 100644 --- a/plugin/src/main/java/net/neoforged/neoform/tasks/CheckForMinecraftUpdate.java +++ b/plugin/src/main/java/net/neoforged/neoform/tasks/CheckForMinecraftUpdate.java @@ -5,7 +5,7 @@ import org.gradle.api.DefaultTask; import org.gradle.api.GradleException; import org.gradle.api.tasks.TaskAction; -import org.gradle.work.DisableCachingByDefault; +import org.gradle.api.tasks.UntrackedTask; import java.io.BufferedReader; import java.io.InputStreamReader; @@ -17,7 +17,7 @@ import java.util.Comparator; import java.util.HashMap; -@DisableCachingByDefault(because = "it checks for updates") +@UntrackedTask(because = "Checks for remote updates, never cacheable") public abstract class CheckForMinecraftUpdate extends DefaultTask { private final String currentVersion; private final String manifestUrl; diff --git a/plugin/src/main/java/net/neoforged/neoform/tasks/CreateConfig.java b/plugin/src/main/java/net/neoforged/neoform/tasks/CreateConfig.java index be46b45f..ff555497 100644 --- a/plugin/src/main/java/net/neoforged/neoform/tasks/CreateConfig.java +++ b/plugin/src/main/java/net/neoforged/neoform/tasks/CreateConfig.java @@ -14,6 +14,7 @@ import org.gradle.api.tasks.Optional; import org.gradle.api.tasks.OutputFile; import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.UntrackedTask; import java.io.IOException; import java.nio.file.Files; @@ -22,6 +23,7 @@ /** * Writes the NeoForm config based on the information in the settings. */ +@UntrackedTask(because = "Produces a single-use config JSON for NFRT consumption") public abstract class CreateConfig extends DefaultTask { private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); diff --git a/plugin/src/main/java/net/neoforged/neoform/tasks/CreatePatchWorkspace.java b/plugin/src/main/java/net/neoforged/neoform/tasks/CreatePatchWorkspace.java index f60b2cbd..a7455e12 100644 --- a/plugin/src/main/java/net/neoforged/neoform/tasks/CreatePatchWorkspace.java +++ b/plugin/src/main/java/net/neoforged/neoform/tasks/CreatePatchWorkspace.java @@ -20,7 +20,10 @@ import org.gradle.api.tasks.InputDirectory; import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.OutputDirectory; +import org.gradle.api.tasks.PathSensitive; +import org.gradle.api.tasks.PathSensitivity; import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.UntrackedTask; import javax.inject.Inject; import java.io.ByteArrayInputStream; @@ -36,6 +39,7 @@ import java.util.Map; import java.util.zip.ZipFile; +@UntrackedTask(because = "Applies patches from src/patches to decompiled sources, always needs to run") public abstract class CreatePatchWorkspace extends DefaultTask { public static final ProblemGroup PROBLEM_GROUP = ProblemGroup.create("neoform", "NeoForm"); @@ -44,9 +48,11 @@ public abstract class CreatePatchWorkspace extends DefaultTask { private static final ProblemId PATCH_TARGET_MISSING = ProblemId.create("patch-target-missing", "Patch targets missing file", PROBLEM_GROUP); @InputFile + @PathSensitive(PathSensitivity.NONE) public abstract RegularFileProperty getSourcesZip(); @InputDirectory + @PathSensitive(PathSensitivity.RELATIVE) public abstract DirectoryProperty getPatchesDir(); @org.gradle.api.tasks.Input diff --git a/plugin/src/main/java/net/neoforged/neoform/tasks/CreatePatches.java b/plugin/src/main/java/net/neoforged/neoform/tasks/CreatePatches.java index c83a8af4..8f3cb0f9 100644 --- a/plugin/src/main/java/net/neoforged/neoform/tasks/CreatePatches.java +++ b/plugin/src/main/java/net/neoforged/neoform/tasks/CreatePatches.java @@ -11,7 +11,10 @@ import org.gradle.api.tasks.InputDirectory; import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.OutputDirectory; +import org.gradle.api.tasks.PathSensitive; +import org.gradle.api.tasks.PathSensitivity; import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.UntrackedTask; import org.jetbrains.annotations.Nullable; import java.io.BufferedOutputStream; @@ -34,11 +37,14 @@ * This task compares the modified sources in the workspace against the original source zip produced * by the decompiler, and updates the patches stored in the src/patches directory accordingly. */ +@UntrackedTask(because = "Reads modified sources from workspace, always needs to regenerate") public abstract class CreatePatches extends DefaultTask { @InputFile + @PathSensitive(PathSensitivity.NONE) public abstract RegularFileProperty getSourcesZip(); @InputDirectory + @PathSensitive(PathSensitivity.RELATIVE) public abstract DirectoryProperty getModifiedSources(); @OutputDirectory @@ -63,7 +69,8 @@ public void generateSourcePatches() throws IOException { .summary(false) .aPrefix("a/") .bPrefix("b/") - .lineEnding("\n"); + .lineEnding("\n") + .context(10); var result = builder.build().operate(); diff --git a/plugin/src/main/java/net/neoforged/neoform/tasks/Decompile.java b/plugin/src/main/java/net/neoforged/neoform/tasks/Decompile.java index fea1e162..b192f9e6 100644 --- a/plugin/src/main/java/net/neoforged/neoform/tasks/Decompile.java +++ b/plugin/src/main/java/net/neoforged/neoform/tasks/Decompile.java @@ -5,7 +5,10 @@ import org.gradle.api.tasks.Classpath; import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.OutputFile; +import org.gradle.api.tasks.PathSensitive; +import org.gradle.api.tasks.PathSensitivity; import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.UntrackedTask; import javax.inject.Inject; import java.io.BufferedWriter; @@ -15,8 +18,10 @@ import java.nio.charset.StandardCharsets; import java.util.Map; +@UntrackedTask(because = "Executes external decompiler tool, not cacheable") public abstract class Decompile extends ToolAction { @InputFile + @PathSensitive(PathSensitivity.NONE) public abstract RegularFileProperty getInput(); @OutputFile diff --git a/plugin/src/main/java/net/neoforged/neoform/tasks/DownloadVersionArtifacts.java b/plugin/src/main/java/net/neoforged/neoform/tasks/DownloadVersionArtifacts.java index 509cdf38..dfbd1991 100644 --- a/plugin/src/main/java/net/neoforged/neoform/tasks/DownloadVersionArtifacts.java +++ b/plugin/src/main/java/net/neoforged/neoform/tasks/DownloadVersionArtifacts.java @@ -7,6 +7,7 @@ import org.gradle.api.tasks.Optional; import org.gradle.api.tasks.OutputFile; import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.UntrackedTask; import java.util.ArrayList; import java.util.Collections; @@ -14,6 +15,7 @@ /** * Downloads one of the files from the artifacts section of a Minecraft version manifest. */ +@UntrackedTask(because = "Network download, not cacheable") public abstract class DownloadVersionArtifacts extends NeoFormRuntimeTask { @Input public abstract Property getMinecraftVersion(); diff --git a/plugin/src/main/java/net/neoforged/neoform/tasks/GenerateRunClientClass.java b/plugin/src/main/java/net/neoforged/neoform/tasks/GenerateRunClientClass.java index 7a0b30ab..652c12a9 100644 --- a/plugin/src/main/java/net/neoforged/neoform/tasks/GenerateRunClientClass.java +++ b/plugin/src/main/java/net/neoforged/neoform/tasks/GenerateRunClientClass.java @@ -8,7 +8,10 @@ import org.gradle.api.file.RegularFileProperty; import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.OutputDirectory; +import org.gradle.api.tasks.PathSensitive; +import org.gradle.api.tasks.PathSensitivity; import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.UntrackedTask; import java.nio.charset.StandardCharsets; import java.nio.file.Files; @@ -21,13 +24,16 @@ /** * Creates the class used to start the client for testing purposes. */ +@UntrackedTask(because = "Generates start client class from version manifest, not cacheable") public abstract class GenerateRunClientClass extends DefaultTask { private static final Pattern PLACEHOLDER_PATTERN = Pattern.compile("\\$\\{([^}]+)}"); @InputFile + @PathSensitive(PathSensitivity.NONE) public abstract RegularFileProperty getVersionManifest(); @InputFile + @PathSensitive(PathSensitivity.NONE) public abstract RegularFileProperty getAssetProperties(); @OutputDirectory diff --git a/plugin/src/main/java/net/neoforged/neoform/tasks/GetVersion.java b/plugin/src/main/java/net/neoforged/neoform/tasks/GetVersion.java index 1888e8bf..eeb04513 100644 --- a/plugin/src/main/java/net/neoforged/neoform/tasks/GetVersion.java +++ b/plugin/src/main/java/net/neoforged/neoform/tasks/GetVersion.java @@ -5,14 +5,14 @@ import org.gradle.api.provider.Property; import org.gradle.api.tasks.Internal; import org.gradle.api.tasks.TaskAction; -import org.gradle.work.DisableCachingByDefault; +import org.gradle.api.tasks.UntrackedTask; import javax.inject.Inject; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -@DisableCachingByDefault +@UntrackedTask(because = "Always prints the version, never cacheable") public abstract class GetVersion extends DefaultTask { @Internal protected abstract Property getVersion(); diff --git a/plugin/src/main/java/net/neoforged/neoform/tasks/PrepareJarForDecompiler.java b/plugin/src/main/java/net/neoforged/neoform/tasks/PrepareJarForDecompiler.java index 5b780508..dd168110 100644 --- a/plugin/src/main/java/net/neoforged/neoform/tasks/PrepareJarForDecompiler.java +++ b/plugin/src/main/java/net/neoforged/neoform/tasks/PrepareJarForDecompiler.java @@ -3,16 +3,22 @@ import org.gradle.api.file.RegularFileProperty; import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.OutputFile; +import org.gradle.api.tasks.PathSensitive; +import org.gradle.api.tasks.PathSensitivity; import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.UntrackedTask; import java.io.IOException; import java.util.Map; +@UntrackedTask(because = "Prepares jar for decompiler, not cacheable") public abstract class PrepareJarForDecompiler extends ToolAction { @InputFile + @PathSensitive(PathSensitivity.NONE) public abstract RegularFileProperty getClient(); @InputFile + @PathSensitive(PathSensitivity.NONE) public abstract RegularFileProperty getServer(); @OutputFile diff --git a/plugin/src/main/java/net/neoforged/neoform/tasks/TestWithEclipseCompiler.java b/plugin/src/main/java/net/neoforged/neoform/tasks/TestWithEclipseCompiler.java index 1506452d..ec5e7f28 100644 --- a/plugin/src/main/java/net/neoforged/neoform/tasks/TestWithEclipseCompiler.java +++ b/plugin/src/main/java/net/neoforged/neoform/tasks/TestWithEclipseCompiler.java @@ -8,7 +8,10 @@ import org.gradle.api.tasks.Classpath; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.InputFile; +import org.gradle.api.tasks.PathSensitive; +import org.gradle.api.tasks.PathSensitivity; import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.UntrackedTask; import org.gradle.process.ExecOperations; import javax.inject.Inject; @@ -19,12 +22,14 @@ import java.util.stream.Collectors; import java.util.zip.ZipFile; +@UntrackedTask(because = "Compiles with external ECJ compiler, not cacheable") public abstract class TestWithEclipseCompiler extends DefaultTask { @Classpath public abstract ConfigurableFileCollection getEclipseCompilerClasspath(); @InputFile + @PathSensitive(PathSensitivity.NONE) public abstract RegularFileProperty getSourcesZip(); @Classpath diff --git a/plugin/src/main/java/net/neoforged/neoform/tasks/TestWithNeoFormRuntime.java b/plugin/src/main/java/net/neoforged/neoform/tasks/TestWithNeoFormRuntime.java index d2b84caf..aeff18c5 100644 --- a/plugin/src/main/java/net/neoforged/neoform/tasks/TestWithNeoFormRuntime.java +++ b/plugin/src/main/java/net/neoforged/neoform/tasks/TestWithNeoFormRuntime.java @@ -7,15 +7,20 @@ import org.gradle.api.provider.Property; import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.OutputDirectory; +import org.gradle.api.tasks.PathSensitive; +import org.gradle.api.tasks.PathSensitivity; import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.UntrackedTask; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.Map; +@UntrackedTask(because = "Executes NFRT test, not cacheable") public abstract class TestWithNeoFormRuntime extends NeoFormRuntimeTask { @InputFile + @PathSensitive(PathSensitivity.NONE) public abstract RegularFileProperty getNeoFormDataArchive(); @OutputDirectory diff --git a/plugin/src/main/java/net/neoforged/neoform/tasks/ToolAction.java b/plugin/src/main/java/net/neoforged/neoform/tasks/ToolAction.java index e29c4d8a..da432e16 100644 --- a/plugin/src/main/java/net/neoforged/neoform/tasks/ToolAction.java +++ b/plugin/src/main/java/net/neoforged/neoform/tasks/ToolAction.java @@ -15,6 +15,7 @@ import org.gradle.api.tasks.Optional; import org.gradle.api.tasks.OutputFile; import org.gradle.api.tasks.TaskProvider; +import org.gradle.api.tasks.UntrackedTask; import org.gradle.jvm.toolchain.JavaLanguageVersion; import org.gradle.jvm.toolchain.JavaLauncher; import org.gradle.jvm.toolchain.JavaToolchainService; @@ -38,6 +39,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +@UntrackedTask(because = "Executes external tools, not cacheable") public abstract class ToolAction extends DefaultTask { @Inject protected abstract ExecOperations getExecOps(); diff --git a/plugin/src/main/java/net/neoforged/neoform/tasks/UpdateMinecraft.java b/plugin/src/main/java/net/neoforged/neoform/tasks/UpdateMinecraft.java index 1db94711..028f8403 100644 --- a/plugin/src/main/java/net/neoforged/neoform/tasks/UpdateMinecraft.java +++ b/plugin/src/main/java/net/neoforged/neoform/tasks/UpdateMinecraft.java @@ -10,12 +10,14 @@ import org.gradle.api.tasks.Internal; import org.gradle.api.tasks.Optional; import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.UntrackedTask; import org.gradle.api.tasks.options.Option; import javax.inject.Inject; import java.io.File; import java.nio.file.Files; +@UntrackedTask(because = "Updates settings.gradle.kts, not cacheable") public abstract class UpdateMinecraft extends DefaultTask { private String newVersion; @@ -26,7 +28,7 @@ public UpdateMinecraft(Project project) { var neoForm = NeoFormExtension.fromProject(project); getCurrentVersion().set(neoForm.getMinecraftVersion()); - getSettingsScript().set(new File(project.getRootDir(), "settings.gradle")); + getSettingsScript().set(new File(project.getRootDir(), "settings.gradle.kts")); getOutputs().upToDateWhen(task -> { var updateTask = (UpdateMinecraft) task; @@ -66,7 +68,7 @@ public void update() throws Exception { var settingsScriptPath = getSettingsScript().get().getAsFile().toPath(); String settingsScript = Files.readString(settingsScriptPath); - // Replace the Minecraft version in settings.gradle, which is a simple search&replace + // Replace the Minecraft version in settings.gradle.kts, which is a simple search&replace settingsScript = settingsScript.replace(currentVersion, newVersion); Files.writeString(settingsScriptPath, settingsScript); diff --git a/plugin/src/main/java/net/neoforged/neoform/tasks/UpdateTools.java b/plugin/src/main/java/net/neoforged/neoform/tasks/UpdateTools.java index 807e47af..07463db2 100644 --- a/plugin/src/main/java/net/neoforged/neoform/tasks/UpdateTools.java +++ b/plugin/src/main/java/net/neoforged/neoform/tasks/UpdateTools.java @@ -12,6 +12,7 @@ import org.gradle.api.tasks.Input; import org.gradle.api.tasks.Internal; import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.UntrackedTask; import org.gradle.internal.component.external.model.ModuleComponentArtifactIdentifier; import javax.inject.Inject; @@ -22,6 +23,7 @@ import java.util.Objects; import java.util.stream.Collectors; +@UntrackedTask(because = "Resolves latest tool versions, not cacheable") public abstract class UpdateTools extends DefaultTask { @Inject public UpdateTools(Project project) { @@ -29,7 +31,7 @@ public UpdateTools(Project project) { setDescription("Update the tool versions used in the project."); var neoForm = NeoFormExtension.fromProject(project); - getSettingsScript().set(new File(project.getRootDir(), "settings.gradle")); + getSettingsScript().set(new File(project.getRootDir(), "settings.gradle.kts")); var dependencyFactory = project.getDependencyFactory(); var tools = new ArrayList(); From 311fcd437c99f831e210d35da773b04116b9afe3 Mon Sep 17 00:00:00 2001 From: sequwi Date: Thu, 30 Jul 2026 21:16:40 +0300 Subject: [PATCH 6/8] Fix decompiler flags to match original settings Restore missing flags (--decompile-inner, --remove-bridge, --decompile-generics, --ascii-strings, --remove-synthetic, --bytecode-source-mapping, --dump-code-lines) that were dropped during Kotlin DSL migration. Remove incorrect flags (--ternary-constant-simplification, --decompile-complex-constant-dynamic, --preferred-line-length, --verify-*) that changed decompiler output and caused all 148 patches to fail. Keep --thread-count performance improvement. --- settings.gradle.kts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index dcdb0426..477b3424 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -39,17 +39,18 @@ neoForm { mainClass = "org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler" jvmArgs = listOf("-Xmx4g") args = listOf( + "--decompile-inner", + "--remove-bridge", + "--decompile-generics", + "--ascii-strings", + "--remove-synthetic", "--include-classpath", "--ignore-invalid-bytecode", + "--bytecode-source-mapping", + "--dump-code-lines", "--indent-string= ", "--log-level=WARN", "--thread-count=$threadCount", - "--ternary-constant-simplification=1", - "--decompile-complex-constant-dynamic=1", - "--preferred-line-length=240", - "--verify-anonymous-classes=1", - "--verify-merges=1", - "--verify-pre-post-merges=1", "-cfg={inputLibraries}", "{input}", "{output}" From 36af672c897b689b965b2fb4a61dc025bf1e43ba Mon Sep 17 00:00:00 2001 From: sequwi Date: Thu, 30 Jul 2026 21:28:17 +0300 Subject: [PATCH 7/8] Fix java-objc-bridge version to 1.1 to match Minecraft dependency constraint The original Groovy settings used 1.1. Our Kotlin DSL migration bumped it to 1.2, but Minecraft dependencies strictly require 1.1, causing resolution conflicts when compiling the workspace. --- settings.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index 477b3424..294a566b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -20,7 +20,7 @@ neoForm { "org.jetbrains:annotations:26.1.0", // In the Minecraft libraries list, this is MacOS X specific since it only contains runtime dependencies // But the MacOS X specific code referencing this will be compiled on all platforms. - "ca.weblite:java-objc-bridge:1.2" + "ca.weblite:java-objc-bridge:1.1" ) javaVersion = 25 From 9c1f0559e8c17c227535bece97acc0ddcbf89e21 Mon Sep 17 00:00:00 2001 From: sequwi Date: Thu, 30 Jul 2026 21:34:44 +0300 Subject: [PATCH 8/8] Add --enable-native-access=ALL-UNNAMED to runClient JVM args Suppresses LWJGL restricted-method warning on JDK 25. --- .../main/java/net/neoforged/neoform/NeoFormWorkspacePlugin.java | 1 + 1 file changed, 1 insertion(+) diff --git a/plugin/src/main/java/net/neoforged/neoform/NeoFormWorkspacePlugin.java b/plugin/src/main/java/net/neoforged/neoform/NeoFormWorkspacePlugin.java index 3e5b4d94..83043c62 100644 --- a/plugin/src/main/java/net/neoforged/neoform/NeoFormWorkspacePlugin.java +++ b/plugin/src/main/java/net/neoforged/neoform/NeoFormWorkspacePlugin.java @@ -127,6 +127,7 @@ public void apply(Project project) { task.setDescription("Runs the client for testing."); task.getMainClass().set("StartClient"); task.setClasspath(clientSourceSet.get().getRuntimeClasspath()); + task.jvmArgs("--enable-native-access=ALL-UNNAMED"); }); } }