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 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.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/** 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/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index f8e1ee31..b1b8ef56 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bad7c246..fdbbd285 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,10 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-all.zip +distributionSha256Sum=61ba77b3ff7167e60962763eb4bae79db7120c189b9544358d0ade3c1e712a83 networkTimeout=10000 +retries=0 +retryBackOffMs=500 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index adff685a..249efbb0 100755 --- a/gradlew +++ b/gradlew @@ -20,7 +20,7 @@ ############################################################################## # -# Gradle start up script for POSIX generated by Gradle. +# gradlew start up script for POSIX generated by Gradle. # # Important for running: # @@ -29,7 +29,7 @@ # bash, then to run this script, type that shell name before the whole # command line, like: # -# ksh Gradle +# ksh gradlew # # Busybox and similar reduced shells will NOT work, because this script # requires all of these POSIX shell features: @@ -57,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/3d91ce3b8caaf77ad09f381f43615b715b53f72c/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. diff --git a/gradlew.bat b/gradlew.bat index c4bdd3ab..a51ec4f5 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -19,12 +19,12 @@ @if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem -@rem Gradle startup script for Windows +@rem gradlew startup script for Windows @rem @rem ########################################################################## -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal +@rem Set local scope for the variables, and ensure extensions are enabled +setlocal EnableExtensions set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. @@ -51,7 +51,7 @@ 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 :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% 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/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/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"); }); } } 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(); 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..294a566b --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,59 @@ +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.1" + ) + + 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( + "--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", + "-cfg={inputLibraries}", + "{input}", + "{output}" + ) + } +}