From 019e5cfb438cc2e66a328f4e50558b10a7db4a94 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Sun, 27 Sep 2026 04:18:42 +0200 Subject: [PATCH 1/2] Build 1.21.11 with Stonecutter from a shared src/ Step 1 of #8. 1.21.11's version-specific code moves from versions/1.21.11/src to the top-level src/, built by Stonecutter as the project :1.21.11. The other versions still build from their own copies as :mc- until they're folded in. - settings.gradle: applies Stonecutter (Groovy controller) with stonecutterVersions = ["1.21.11"] and skips those folders when including the old mc- projects. - The old root build.gradle becomes stonecutter.gradle (the root project's script, with the shared repositories, common wiring and buildAll), and 1.21.11's build.gradle becomes the root build.gradle that Stonecutter runs for each version. versions/1.21.11 keeps its gradle.properties and run/. - The jar has the same 415 entries, fabric.mod.json and mixin configs as before; the only class differences also appear when rebuilding an untouched version today. - scripts/port.sh treats src/ as the active Stonecutter version, so changes port between it and the old copies both ways. - README and VERSION_GUIDE describe the layout, version comments and how to add a version. Co-Authored-By: Claude Opus 5.5 --- README.MD | 4 +- VERSION_GUIDE.md | 42 +++-- build.gradle | 148 +++++++++++------- scripts/port.sh | 64 +++++--- settings.gradle | 27 +++- .../impl/cosmetics/CloakFeatureRenderer.java | 0 .../impl/cosmetics/HatFeatureRenderer.java | 0 .../impl/cosmetics/obj/MtlLoader.java | 0 .../impl/cosmetics/obj/ObjModel.java | 0 .../impl/cosmetics/obj/ObjRenderer.java | 0 .../impl/cosmetics/utils/IdentifierUtils.java | 0 .../impl/cosmetics/utils/ShaderUtils.java | 0 .../entity/CameraOverriddenEntity.java | 0 .../features/entity/EntityFeatureImpl.java | 0 .../features/entity/HealthRenderState.java | 0 .../features/mixins/entity/CameraMixin.java | 0 .../features/mixins/entity/EntityMixin.java | 0 .../render/BackgroundRendererMixin.java | 0 .../mixins/render/GameRendererMixin.java | 0 .../render/LightmapTextureManagerMixin.java | 0 .../render/LivingEntityRenderStateMixin.java | 0 .../render/LivingEntityRendererMixin.java | 0 .../features/mixins/render/RenderMixin.java | 0 .../impl/features/mixins/world/TpsMixin.java | 0 .../features/network/NetworkFeatureImpl.java | 0 .../features/player/PlayerFeatureImpl.java | 0 .../features/render/RenderFeatureImpl.java | 0 .../impl/features/world/WorldFeatureImpl.java | 0 .../impl/mixins/IdentifierMixin.java | 0 .../impl/mixins/ItemStackMixin.java | 0 .../impl/mixins/MinecraftClientMixin.java | 0 .../impl/mixins/QuaternionfMixin.java | 0 .../saturnclient/impl/mixins/SpriteMixin.java | 0 .../impl/mixins/StatusEffectMixin.java | 0 .../saturnclient/impl/mixins/TextMixin.java | 0 .../saturnclient/impl/mixins/WindowMixin.java | 0 .../impl/provider/FeatureProviderFabric.java | 0 .../impl/provider/GLFWProviderImpl.java | 0 .../impl/provider/RefConstructorImpl.java | 0 .../impl/provider/SaturnProviderImpl.java | 0 .../impl/ref/Matrix3x2fStackRef.java | 0 .../impl/ui/EntityDrawerImpl.java | 0 .../saturnclient/impl/ui/RenderScopeImpl.java | 0 .../impl/ui/SaturnScreenFabric.java | 0 .../saturnclient/SaturnClient.java | 0 .../saturnclient/SaturnRenderState.java | 0 .../saturnclient/event/KeyInputHandler.java | 0 .../mixin/DrawContextAccessor.java | 0 .../mixin/PlayerEntityRendererMixin.java | 0 .../saturnclient/mixin/SetScreenMixin.java | 0 .../mixin/SplashOverlayMixin.java | 0 .../saturnclient/mixin/TabListMixin.java | 0 .../saturnclient/mixin/WhoAmI.java | 0 .../main/resources/fabric.mod.json | 0 .../main/resources/features.mixins.json | 0 .../main/resources/impl.mixins.json | 0 .../main/resources/saturnclient.mixins.json | 0 stonecutter.gradle | 73 +++++++++ versions/1.21.11/build.gradle | 101 ------------ versions/1.21.11/settings.gradle | 10 -- 60 files changed, 267 insertions(+), 202 deletions(-) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/cosmetics/CloakFeatureRenderer.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/cosmetics/HatFeatureRenderer.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/cosmetics/obj/MtlLoader.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/cosmetics/obj/ObjModel.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/cosmetics/obj/ObjRenderer.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/cosmetics/utils/IdentifierUtils.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/cosmetics/utils/ShaderUtils.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/features/entity/CameraOverriddenEntity.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/features/entity/EntityFeatureImpl.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/features/entity/HealthRenderState.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/features/mixins/entity/CameraMixin.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/features/mixins/entity/EntityMixin.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/features/mixins/render/BackgroundRendererMixin.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/features/mixins/render/GameRendererMixin.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/features/mixins/render/LightmapTextureManagerMixin.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/features/mixins/render/LivingEntityRenderStateMixin.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/features/mixins/render/LivingEntityRendererMixin.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/features/mixins/render/RenderMixin.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/features/mixins/world/TpsMixin.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/features/network/NetworkFeatureImpl.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/features/player/PlayerFeatureImpl.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/features/render/RenderFeatureImpl.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/features/world/WorldFeatureImpl.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/mixins/IdentifierMixin.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/mixins/ItemStackMixin.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/mixins/MinecraftClientMixin.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/mixins/QuaternionfMixin.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/mixins/SpriteMixin.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/mixins/StatusEffectMixin.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/mixins/TextMixin.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/mixins/WindowMixin.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/provider/FeatureProviderFabric.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/provider/GLFWProviderImpl.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/provider/RefConstructorImpl.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/provider/SaturnProviderImpl.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/ref/Matrix3x2fStackRef.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/ui/EntityDrawerImpl.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/ui/RenderScopeImpl.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/impl/ui/SaturnScreenFabric.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/saturnclient/SaturnClient.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/saturnclient/SaturnRenderState.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/saturnclient/event/KeyInputHandler.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/saturnclient/mixin/DrawContextAccessor.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/saturnclient/mixin/SetScreenMixin.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/saturnclient/mixin/SplashOverlayMixin.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/saturnclient/mixin/TabListMixin.java (100%) rename {versions/1.21.11/src => src}/main/java/org/saturnclient/saturnclient/mixin/WhoAmI.java (100%) rename {versions/1.21.11/src => src}/main/resources/fabric.mod.json (100%) rename {versions/1.21.11/src => src}/main/resources/features.mixins.json (100%) rename {versions/1.21.11/src => src}/main/resources/impl.mixins.json (100%) rename {versions/1.21.11/src => src}/main/resources/saturnclient.mixins.json (100%) create mode 100644 stonecutter.gradle delete mode 100644 versions/1.21.11/build.gradle delete mode 100644 versions/1.21.11/settings.gradle diff --git a/README.MD b/README.MD index 3e5f9a8..578a3d2 100644 --- a/README.MD +++ b/README.MD @@ -47,8 +47,8 @@ git clone --recurse-submodules https://git.selimaj.dev/saturnclientmc/saturnclie cd saturnclient ./gradlew buildAll # every version → build/allJars/ -./gradlew :mc-1.21.11:build # a single version -./gradlew :mc-1.21.11:runClient # launch a development client +./gradlew :1.21.11:build # a single version (versions not on Stonecutter yet: :mc-1.21.10) +./gradlew :1.21.11:runClient # launch a development client ``` Building needs Java 21. diff --git a/VERSION_GUIDE.md b/VERSION_GUIDE.md index 1ce18db..e851152 100644 --- a/VERSION_GUIDE.md +++ b/VERSION_GUIDE.md @@ -4,12 +4,30 @@ How Saturn Client supports several Minecraft versions, and how to change or add ## Layout -- `common/`: all version-independent code (mods, UI, cosmetics, the server client). It has no Minecraft dependency and reaches the game only through the interfaces in `org.saturnclient.common`. -- `versions//`: one module per Minecraft version, implementing those interfaces (providers, refs, mixins). Each is a full copy, and they differ only where Minecraft's API differs. - - `gradle.properties`: the Minecraft, Yarn, Fabric Loader and Fabric API versions. - - `src/`: the version-specific code and the three mixin configs. +Saturn is moving from one full copy of the version-specific code per Minecraft version to a single copy built with [Stonecutter](https://stonecutter.kikugie.dev/) (issue #8). During the move there are two kinds of version: -`settings.gradle` includes every folder under `versions/` automatically, as the Gradle project `:mc-`. +- `common/`: all version-independent code (mods, UI, cosmetics, the server client). It has no Minecraft dependency and reaches the game only through the interfaces in `org.saturnclient.common`. +- `src/`: the version-specific code (providers, refs, mixins and the three mixin configs) for the versions built by Stonecutter, currently **1.21.11**. It's one copy: where Minecraft's API differs between them, the code goes behind version comments (see below). Each of these versions is the Gradle project `:`, and `versions//` holds only its `gradle.properties` (Minecraft, Yarn, Fabric Loader and Fabric API versions), `build/` and `run/`. +- `versions//src/`: the versions not moved yet (1.21.4 to 1.21.10), each a full copy, as the Gradle project `:mc-` with its own `build.gradle`. + +`settings.gradle` lists the Stonecutter versions in `stonecutterVersions` and includes every other folder under `versions/` as `:mc-`. The root `build.gradle` builds each Stonecutter version, and `stonecutter.gradle` configures the root project (shared repositories, the `common` wiring and `buildAll`). + +## Version-specific code with Stonecutter + +The code in `src/` is always plain Java for the **active** version (1.21.11, set in `stonecutter.gradle`). Code for other versions sits in comments that Stonecutter swaps before building each version: + +```java +//? if >=1.21.9 { +public void render(MatrixStack matrices, OrderedRenderCommandQueue queue, int light, PlayerEntityRenderState state, float limbAngle, float limbDistance) { +//?} else +/*public void render(MatrixStack matrices, VertexConsumerProvider consumers, int light, PlayerEntityRenderState state, float limbAngle, float limbDistance) {*/ +``` + +- `./gradlew "Set active project to "` (or the Stonecutter IntelliJ plugin) rewrites `src/` so that version's code is the uncommented one, for editing it in the IDE. +- `./gradlew "Reset active project"` switches back to 1.21.11. **Run it before committing**, so `src/` is always committed with 1.21.11 active. +- Each version's processed copy is compiled from `versions//build/generated/stonecutter/`, which is also where to look when a non-active version fails to compile. + +The `emotes` repository uses the same setup, and its `BentCubeRenderer` and `PlayerModelMixin` are small examples of version comments. ## Porting a change to the other versions @@ -22,13 +40,13 @@ scripts/port.sh --to 1.21.9,1.21.10 # only some versions scripts/port.sh --commit # port what a commit changed instead ``` -The script applies the diff under `versions//src` to each other version with `git apply --3way`: +The script applies the diff under one version's source to each other version with `git apply --3way`. The Stonecutter `src/` counts as one version (1.21.11), so changes port between it and the old copies in both directions: - **applied**: the files matched, and nothing else is needed. - **CONFLICTS**: that version's code really differs. The file gets normal conflict markers, with the version's own code in `ours` and the ported change in `theirs`. Adapt the change to that version's API and resolve. - **already has this change**: nothing to do, which is safe to see when re-running. -Only `src/` is ported. `build.gradle` and `gradle.properties` are version-specific on purpose. Then build everything: +Only source is ported. `build.gradle` and `gradle.properties` are version-specific on purpose. Then build everything: ```sh ./gradlew compileJava @@ -38,7 +56,9 @@ The **Check** workflow runs the same compile on every pull request, so a version ## Adding a Minecraft version -1. Copy the closest existing version: `cp -r versions/1.21.11 versions/`. Delete its `build/`, `.gradle/` and `run/` folders if present. -2. In `versions//gradle.properties`, set `minecraft_version`, `yarn_mappings`, `loader_version` and `fabric_api_version`. The right values are listed at . -3. Build it with `./gradlew :mc-:compileJava` and fix what Minecraft changed. Check the mixin configs in `src/main/resources/*.mixins.json` as well: a mixin whose target changed fails at startup, not at compile time, so launch it with `./gradlew :mc-:runClient`. -4. The release workflow builds every folder under `versions/`, and "Publish to Modrinth" takes the game version from each jar's name, so neither needs changing. +Add new versions to Stonecutter rather than copying a folder: + +1. Create `versions//gradle.properties` with `minecraft_version`, `yarn_mappings`, `loader_version` and `fabric_api_version` (copy 1.21.11's and change the values; they're listed at ). +2. Add `` to `stonecutterVersions` in `settings.gradle`. +3. Build it with `./gradlew ::compileJava` and put what Minecraft changed behind version comments. Check the mixin configs in `src/main/resources/*.mixins.json` as well: a mixin whose target changed fails at startup, not at compile time, so launch it with `./gradlew ::runClient`. +4. The release workflow builds everything through `buildAll`, and "Publish to Modrinth" takes the game version from each jar's name, so neither needs changing. diff --git a/build.gradle b/build.gradle index 1589821..b40015c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,65 +1,101 @@ -subprojects { - apply plugin: "java" +plugins { + id 'net.fabricmc.fabric-loom-remap' version "${loom_version}" + id 'maven-publish' +} - repositories { - maven { url "https://maven.fabricmc.net/" } - maven { url "https://git.selimaj.dev/api/packages/selimaj-dev/maven" } - maven { url "https://git.selimaj.dev/api/packages/saturnclientmc/maven" } - mavenCentral() - } +version = "${project.mod_version}+${project.minecraft_version}" +group = project.maven_group - dependencies { - implementation "de.javagl:obj:0.4.0" - implementation "com.formdev:svgSalamander:1.1.4" - implementation 'com.fasterxml.jackson.core:jackson-databind:2.17.0' - implementation 'com.fasterxml.jackson.core:jackson-annotations:2.17.0' - implementation 'com.fasterxml.jackson.core:jackson-core:2.17.0' +base { + archivesName = project.archives_base_name +} + +repositories { + maven { name = "Selimaj"; url = 'https://git.selimaj.dev/api/packages/selimaj-dev/maven' } +} + +dependencies { + // To change the versions see the gradle.properties file + minecraft "com.mojang:minecraft:${project.minecraft_version}" + mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" + modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" + + // Fabric API. This is technically optional, but you probably want it anyway. + modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_api_version}" + + // Saturn's emote library (limb bending, Emotecraft emotes) + include modImplementation("org.saturnclient:emotes-fabric:${project.emotes_version}+${project.minecraft_version}") + + implementation project(":common") + + include implementation("dev.selimaj:session-java:0.2.0") + include implementation("de.javagl:obj:0.4.0") + include implementation("com.formdev:svgSalamander:1.1.4") + include implementation("com.fasterxml.jackson.core:jackson-databind:2.17.0") + include implementation("com.fasterxml.jackson.core:jackson-annotations:2.17.0") + include implementation("com.fasterxml.jackson.core:jackson-core:2.17.0") +} + +/* + * ================================================================ + * Resource Processing + * ================================================================ + * Injects version values into fabric.mod.json. + */ +processResources { + inputs.property "version", project.version + inputs.property "minecraft_version", project.minecraft_version + inputs.property "loader_version", project.loader_version + filteringCharset "UTF-8" + + filesMatching("fabric.mod.json") { + expand( + "version": project.version, + "minecraft_version": project.minecraft_version, + "loader_version": project.loader_version + ) } } -configure(subprojects.findAll { it.name != "common" }) { - dependencies { - implementation project(":common") - } - - sourceSets { - main { - resources { - srcDir project(":common").file("src/main/resources") - } - } - } +tasks.withType(JavaCompile).configureEach { + it.options.release = 21 } -tasks.register("buildAll") { - group = "build" - description = "Builds all subprojects and collects their remapped jars" +java { + // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task + // if it is present. + // If you remove this line, sources will not be generated. + withSourcesJar() - // Only build remapped jars (not full build) - dependsOn subprojects.collect { proj -> - proj.tasks.matching { it.name == "remapJar" } - } - - doLast { - def outputDir = file("$buildDir/allJars") - outputDir.mkdirs() - - subprojects.each { proj -> - def remapTask = proj.tasks.findByName("remapJar") - - if (remapTask != null) { - def jarFile = remapTask.archiveFile.get().asFile - - if (jarFile.exists() && !jarFile.name.contains("sources")) { - copy { - from jarFile - into outputDir - rename { "${jarFile.name}" } - } - } - } - } - - println "All remapped jars collected in: $outputDir" - } + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } + +jar { + inputs.property "archivesName", project.base.archivesName + + from("LICENSE") { + rename { "${it}_${inputs.properties.archivesName}"} + } + + from project(":common").sourceSets.main.output + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} + +// configure the maven publication +publishing { + publications { + create("mavenJava", MavenPublication) { + artifactId = project.archives_base_name + from components.java + } + } + + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. + repositories { + // Add repositories to publish to here. + // Notice: This block does NOT have the same function as the block in the top level. + // The repositories here will be used for publishing your artifact, not for + // retrieving dependencies. + } +} \ No newline at end of file diff --git a/scripts/port.sh b/scripts/port.sh index a0976e1..5f22636 100755 --- a/scripts/port.sh +++ b/scripts/port.sh @@ -1,11 +1,15 @@ #!/usr/bin/env bash # Port a change made in one Minecraft version's code to the other versions. # -# Takes the diff under versions//src and applies it to versions//src +# Takes the diff under one version's source folder and applies it to the others # with `git apply --3way`: it applies cleanly where the files match, and leaves -# normal merge conflicts only where a version really differs. Only src/ is +# normal merge conflicts only where a version really differs. Only source is # ported; build.gradle and gradle.properties are version-specific on purpose. # +# Versions moved to Stonecutter (stonecutterVersions in settings.gradle) share +# the top-level src/, which counts as one version: the active one set in +# stonecutter.gradle. The others keep their own copy in versions//src. +# # Usage: # scripts/port.sh [--from VERSION] [--to V1,V2,...] [--commit REV] [--dry-run] # @@ -33,25 +37,39 @@ while [ $# -gt 0 ]; do --to) to="$2"; shift 2 ;; --commit) commit="$2"; shift 2 ;; --dry-run) dry_run=true; shift ;; - -h|--help) sed -n '2,20p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;; + -h|--help) sed -n '2,23p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;; *) echo "Unknown option: $1 (see --help)" >&2; exit 2 ;; esac done -all_versions=$(ls -d versions/*/ | xargs -n1 basename | sort -t. -k1,1n -k2,2n -k3,3n) +# Versions sharing the Stonecutter src/, and the one that stands for them. +stonecutter_versions=$(sed -n 's/^def stonecutterVersions = \[\(.*\)\]/\1/p' settings.gradle | tr -d '" ' | tr ',' ' ') +stonecutter_active=$(sed -n 's/^stonecutter\.active "\(.*\)"/\1/p' stonecutter.gradle 2>/dev/null || true) + +is_stonecutter() { + printf '%s\n' $stonecutter_versions | grep -qx "$1" +} + +# Where a version's source lives. +src_of() { + if is_stonecutter "$1"; then echo "src"; else echo "versions/$1/src"; fi +} + +old_versions=$(for d in versions/*/; do [ -d "$d/src" ] && basename "$d"; done) +all_versions=$(printf '%s\n' $old_versions $stonecutter_active | grep . | sort -t. -k1,1n -k2,2n -k3,3n) version_exists() { - [ -d "versions/$1/src" ] + [ -d "$(src_of "$1")" ] } # Versions with changes, from the working tree or from the given commit. changed_versions() { if [ -n "$commit" ]; then - git show --name-only --format= "$commit" -- versions/ + git show --name-only --format= "$commit" -- versions/ src/ else - git diff HEAD --name-only -- versions/ - git ls-files --others --exclude-standard -- versions/ - fi | sed -n 's#^versions/\([^/]*\)/src/.*#\1#p' | sort -u + git diff HEAD --name-only -- versions/ src/ + git ls-files --others --exclude-standard -- versions/ src/ + fi | sed -n -e 's#^versions/\([^/]*\)/src/.*#\1#p' -e "s#^src/.*#${stonecutter_active}#p" | sort -u } if [ -z "$from" ]; then @@ -65,6 +83,10 @@ if [ -z "$from" ]; then fi version_exists "$from" || { echo "No such version: $from" >&2; exit 2; } +if is_stonecutter "$from"; then + from="$stonecutter_active" +fi +from_src=$(src_of "$from") if [ -z "$to" ]; then to=$(printf '%s\n' $all_versions | grep -vx "$from" | paste -sd, -) @@ -72,10 +94,10 @@ fi # New files are only included in `git diff HEAD` once git knows about them. if [ -z "$commit" ]; then - untracked=$(git ls-files --others --exclude-standard -- "versions/$from/src") + untracked=$(git ls-files --others --exclude-standard -- "$from_src") if [ -n "$untracked" ]; then if $dry_run; then - echo "note: new files in versions/$from/src are untracked and won't be ported in a dry run:" >&2 + echo "note: new files in $from_src are untracked and won't be ported in a dry run:" >&2 printf ' %s\n' $untracked >&2 else printf '%s\n' "$untracked" | xargs git add --intent-to-add -- @@ -85,20 +107,20 @@ fi # --full-index gives --3way the real blob ids to merge against. if [ -n "$commit" ]; then - patch=$(git show --full-index --binary --format= "$commit" -- "versions/$from/src") + patch=$(git show --full-index --binary --format= "$commit" -- "$from_src") else - patch=$(git diff HEAD --full-index --binary -- "versions/$from/src") + patch=$(git diff HEAD --full-index --binary -- "$from_src") fi if [ -z "$patch" ]; then - echo "No changes under versions/$from/src to port." >&2 + echo "No changes under $from_src to port." >&2 exit 2 fi files=$(printf '%s\n' "$patch" | grep -c '^diff --git' || true) echo "Porting $files file(s) from $from${commit:+ (commit $commit)}" -from_re=$(printf '%s' "$from" | sed 's/\./\\./g') +from_re=$(printf '%s' "$from_src" | sed 's/\./\\./g') tmp=$(mktemp -d) trap 'rm -rf "$tmp"' EXIT @@ -109,14 +131,20 @@ for target in "${targets[@]}"; do if [ "$target" = "$from" ]; then continue fi + if is_stonecutter "$target" && [ "$target" != "$stonecutter_active" ]; then + printf ' %-8s skipped: shares src/ with %s\n' "$target" "$stonecutter_active" + [ "$from" = "$stonecutter_active" ] || status=1 + continue + fi if ! version_exists "$target"; then printf ' %-8s skipped: no such version\n' "$target" status=1 continue fi - # Point the patch's file headers at the target version. - printf '%s\n' "$patch" | sed -E "/^(diff --git |--- |\+\+\+ |rename (from|to) |copy (from|to) )/ s#versions/${from_re}/#versions/${target}/#g" > "$tmp/$target.patch" + # Point the patch's file headers at the target version's source folder. + target_src=$(src_of "$target") + printf '%s\n' "$patch" | sed -E "/^(diff --git |--- |\+\+\+ |rename (from|to) |copy (from|to) )/ s#([ab]/|(from|to) )${from_re}/#\1${target_src}/#g" > "$tmp/$target.patch" if git apply --check --reverse "$tmp/$target.patch" 2>/dev/null; then printf ' %-8s already has this change\n' "$target" @@ -135,7 +163,7 @@ for target in "${targets[@]}"; do if output=$(git apply --3way "$tmp/$target.patch" 2>&1); then printf ' %-8s applied\n' "$target" else - conflicts=$(git diff --name-only --diff-filter=U -- "versions/$target") + conflicts=$(git diff --name-only --diff-filter=U -- "$target_src") if [ -n "$conflicts" ]; then printf ' %-8s CONFLICTS in:\n' "$target" printf '%s\n' "$conflicts" | sed 's/^/ /' diff --git a/settings.gradle b/settings.gradle index 07bdcaa..95f2676 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,21 +1,40 @@ pluginManagement { repositories { maven { url "https://maven.fabricmc.net/" } + maven { url "https://maven.kikugie.dev/releases" } gradlePluginPortal() mavenCentral() } } +plugins { + id "dev.kikugie.stonecutter" version "0.9.8" +} + rootProject.name = "saturn-client" include("common") -def versionsDir = file("versions") +// Versions built by Stonecutter from the shared src/ (see stonecutter.gradle). Each one's +// versions//gradle.properties holds its Minecraft, Yarn and Fabric API versions. +def stonecutterVersions = ["1.21.11"] -versionsDir.eachDir { dir -> - def version = dir.name - def projectName = "mc-${version}" +stonecutter { + kotlinController = false // stonecutter.gradle configures the root project + centralScript = "build.gradle" // build.gradle configures each version + create(rootProject) { + versions(*stonecutterVersions) + vcsVersion = "1.21.11" + } +} +// Versions not moved to Stonecutter yet still build from their own copy in versions//src, +// as projects named mc-. +file("versions").eachDir { dir -> + if (dir.name in stonecutterVersions) { + return + } + def projectName = "mc-${dir.name}" include(projectName) project(":${projectName}").projectDir = dir } diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/cosmetics/CloakFeatureRenderer.java b/src/main/java/org/saturnclient/impl/cosmetics/CloakFeatureRenderer.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/cosmetics/CloakFeatureRenderer.java rename to src/main/java/org/saturnclient/impl/cosmetics/CloakFeatureRenderer.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/cosmetics/HatFeatureRenderer.java b/src/main/java/org/saturnclient/impl/cosmetics/HatFeatureRenderer.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/cosmetics/HatFeatureRenderer.java rename to src/main/java/org/saturnclient/impl/cosmetics/HatFeatureRenderer.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/cosmetics/obj/MtlLoader.java b/src/main/java/org/saturnclient/impl/cosmetics/obj/MtlLoader.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/cosmetics/obj/MtlLoader.java rename to src/main/java/org/saturnclient/impl/cosmetics/obj/MtlLoader.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/cosmetics/obj/ObjModel.java b/src/main/java/org/saturnclient/impl/cosmetics/obj/ObjModel.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/cosmetics/obj/ObjModel.java rename to src/main/java/org/saturnclient/impl/cosmetics/obj/ObjModel.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/cosmetics/obj/ObjRenderer.java b/src/main/java/org/saturnclient/impl/cosmetics/obj/ObjRenderer.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/cosmetics/obj/ObjRenderer.java rename to src/main/java/org/saturnclient/impl/cosmetics/obj/ObjRenderer.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/cosmetics/utils/IdentifierUtils.java b/src/main/java/org/saturnclient/impl/cosmetics/utils/IdentifierUtils.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/cosmetics/utils/IdentifierUtils.java rename to src/main/java/org/saturnclient/impl/cosmetics/utils/IdentifierUtils.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/cosmetics/utils/ShaderUtils.java b/src/main/java/org/saturnclient/impl/cosmetics/utils/ShaderUtils.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/cosmetics/utils/ShaderUtils.java rename to src/main/java/org/saturnclient/impl/cosmetics/utils/ShaderUtils.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/features/entity/CameraOverriddenEntity.java b/src/main/java/org/saturnclient/impl/features/entity/CameraOverriddenEntity.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/features/entity/CameraOverriddenEntity.java rename to src/main/java/org/saturnclient/impl/features/entity/CameraOverriddenEntity.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/features/entity/EntityFeatureImpl.java b/src/main/java/org/saturnclient/impl/features/entity/EntityFeatureImpl.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/features/entity/EntityFeatureImpl.java rename to src/main/java/org/saturnclient/impl/features/entity/EntityFeatureImpl.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/features/entity/HealthRenderState.java b/src/main/java/org/saturnclient/impl/features/entity/HealthRenderState.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/features/entity/HealthRenderState.java rename to src/main/java/org/saturnclient/impl/features/entity/HealthRenderState.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/features/mixins/entity/CameraMixin.java b/src/main/java/org/saturnclient/impl/features/mixins/entity/CameraMixin.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/features/mixins/entity/CameraMixin.java rename to src/main/java/org/saturnclient/impl/features/mixins/entity/CameraMixin.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/features/mixins/entity/EntityMixin.java b/src/main/java/org/saturnclient/impl/features/mixins/entity/EntityMixin.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/features/mixins/entity/EntityMixin.java rename to src/main/java/org/saturnclient/impl/features/mixins/entity/EntityMixin.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/features/mixins/render/BackgroundRendererMixin.java b/src/main/java/org/saturnclient/impl/features/mixins/render/BackgroundRendererMixin.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/features/mixins/render/BackgroundRendererMixin.java rename to src/main/java/org/saturnclient/impl/features/mixins/render/BackgroundRendererMixin.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/features/mixins/render/GameRendererMixin.java b/src/main/java/org/saturnclient/impl/features/mixins/render/GameRendererMixin.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/features/mixins/render/GameRendererMixin.java rename to src/main/java/org/saturnclient/impl/features/mixins/render/GameRendererMixin.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/features/mixins/render/LightmapTextureManagerMixin.java b/src/main/java/org/saturnclient/impl/features/mixins/render/LightmapTextureManagerMixin.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/features/mixins/render/LightmapTextureManagerMixin.java rename to src/main/java/org/saturnclient/impl/features/mixins/render/LightmapTextureManagerMixin.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/features/mixins/render/LivingEntityRenderStateMixin.java b/src/main/java/org/saturnclient/impl/features/mixins/render/LivingEntityRenderStateMixin.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/features/mixins/render/LivingEntityRenderStateMixin.java rename to src/main/java/org/saturnclient/impl/features/mixins/render/LivingEntityRenderStateMixin.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/features/mixins/render/LivingEntityRendererMixin.java b/src/main/java/org/saturnclient/impl/features/mixins/render/LivingEntityRendererMixin.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/features/mixins/render/LivingEntityRendererMixin.java rename to src/main/java/org/saturnclient/impl/features/mixins/render/LivingEntityRendererMixin.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/features/mixins/render/RenderMixin.java b/src/main/java/org/saturnclient/impl/features/mixins/render/RenderMixin.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/features/mixins/render/RenderMixin.java rename to src/main/java/org/saturnclient/impl/features/mixins/render/RenderMixin.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/features/mixins/world/TpsMixin.java b/src/main/java/org/saturnclient/impl/features/mixins/world/TpsMixin.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/features/mixins/world/TpsMixin.java rename to src/main/java/org/saturnclient/impl/features/mixins/world/TpsMixin.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/features/network/NetworkFeatureImpl.java b/src/main/java/org/saturnclient/impl/features/network/NetworkFeatureImpl.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/features/network/NetworkFeatureImpl.java rename to src/main/java/org/saturnclient/impl/features/network/NetworkFeatureImpl.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/features/player/PlayerFeatureImpl.java b/src/main/java/org/saturnclient/impl/features/player/PlayerFeatureImpl.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/features/player/PlayerFeatureImpl.java rename to src/main/java/org/saturnclient/impl/features/player/PlayerFeatureImpl.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/features/render/RenderFeatureImpl.java b/src/main/java/org/saturnclient/impl/features/render/RenderFeatureImpl.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/features/render/RenderFeatureImpl.java rename to src/main/java/org/saturnclient/impl/features/render/RenderFeatureImpl.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/features/world/WorldFeatureImpl.java b/src/main/java/org/saturnclient/impl/features/world/WorldFeatureImpl.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/features/world/WorldFeatureImpl.java rename to src/main/java/org/saturnclient/impl/features/world/WorldFeatureImpl.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/mixins/IdentifierMixin.java b/src/main/java/org/saturnclient/impl/mixins/IdentifierMixin.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/mixins/IdentifierMixin.java rename to src/main/java/org/saturnclient/impl/mixins/IdentifierMixin.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/mixins/ItemStackMixin.java b/src/main/java/org/saturnclient/impl/mixins/ItemStackMixin.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/mixins/ItemStackMixin.java rename to src/main/java/org/saturnclient/impl/mixins/ItemStackMixin.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/mixins/MinecraftClientMixin.java b/src/main/java/org/saturnclient/impl/mixins/MinecraftClientMixin.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/mixins/MinecraftClientMixin.java rename to src/main/java/org/saturnclient/impl/mixins/MinecraftClientMixin.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/mixins/QuaternionfMixin.java b/src/main/java/org/saturnclient/impl/mixins/QuaternionfMixin.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/mixins/QuaternionfMixin.java rename to src/main/java/org/saturnclient/impl/mixins/QuaternionfMixin.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/mixins/SpriteMixin.java b/src/main/java/org/saturnclient/impl/mixins/SpriteMixin.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/mixins/SpriteMixin.java rename to src/main/java/org/saturnclient/impl/mixins/SpriteMixin.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/mixins/StatusEffectMixin.java b/src/main/java/org/saturnclient/impl/mixins/StatusEffectMixin.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/mixins/StatusEffectMixin.java rename to src/main/java/org/saturnclient/impl/mixins/StatusEffectMixin.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/mixins/TextMixin.java b/src/main/java/org/saturnclient/impl/mixins/TextMixin.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/mixins/TextMixin.java rename to src/main/java/org/saturnclient/impl/mixins/TextMixin.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/mixins/WindowMixin.java b/src/main/java/org/saturnclient/impl/mixins/WindowMixin.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/mixins/WindowMixin.java rename to src/main/java/org/saturnclient/impl/mixins/WindowMixin.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/provider/FeatureProviderFabric.java b/src/main/java/org/saturnclient/impl/provider/FeatureProviderFabric.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/provider/FeatureProviderFabric.java rename to src/main/java/org/saturnclient/impl/provider/FeatureProviderFabric.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/provider/GLFWProviderImpl.java b/src/main/java/org/saturnclient/impl/provider/GLFWProviderImpl.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/provider/GLFWProviderImpl.java rename to src/main/java/org/saturnclient/impl/provider/GLFWProviderImpl.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/provider/RefConstructorImpl.java b/src/main/java/org/saturnclient/impl/provider/RefConstructorImpl.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/provider/RefConstructorImpl.java rename to src/main/java/org/saturnclient/impl/provider/RefConstructorImpl.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/provider/SaturnProviderImpl.java b/src/main/java/org/saturnclient/impl/provider/SaturnProviderImpl.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/provider/SaturnProviderImpl.java rename to src/main/java/org/saturnclient/impl/provider/SaturnProviderImpl.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/ref/Matrix3x2fStackRef.java b/src/main/java/org/saturnclient/impl/ref/Matrix3x2fStackRef.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/ref/Matrix3x2fStackRef.java rename to src/main/java/org/saturnclient/impl/ref/Matrix3x2fStackRef.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/ui/EntityDrawerImpl.java b/src/main/java/org/saturnclient/impl/ui/EntityDrawerImpl.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/ui/EntityDrawerImpl.java rename to src/main/java/org/saturnclient/impl/ui/EntityDrawerImpl.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/ui/RenderScopeImpl.java b/src/main/java/org/saturnclient/impl/ui/RenderScopeImpl.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/ui/RenderScopeImpl.java rename to src/main/java/org/saturnclient/impl/ui/RenderScopeImpl.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/impl/ui/SaturnScreenFabric.java b/src/main/java/org/saturnclient/impl/ui/SaturnScreenFabric.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/impl/ui/SaturnScreenFabric.java rename to src/main/java/org/saturnclient/impl/ui/SaturnScreenFabric.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/saturnclient/SaturnClient.java b/src/main/java/org/saturnclient/saturnclient/SaturnClient.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/saturnclient/SaturnClient.java rename to src/main/java/org/saturnclient/saturnclient/SaturnClient.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/saturnclient/SaturnRenderState.java b/src/main/java/org/saturnclient/saturnclient/SaturnRenderState.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/saturnclient/SaturnRenderState.java rename to src/main/java/org/saturnclient/saturnclient/SaturnRenderState.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/saturnclient/event/KeyInputHandler.java b/src/main/java/org/saturnclient/saturnclient/event/KeyInputHandler.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/saturnclient/event/KeyInputHandler.java rename to src/main/java/org/saturnclient/saturnclient/event/KeyInputHandler.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/saturnclient/mixin/DrawContextAccessor.java b/src/main/java/org/saturnclient/saturnclient/mixin/DrawContextAccessor.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/saturnclient/mixin/DrawContextAccessor.java rename to src/main/java/org/saturnclient/saturnclient/mixin/DrawContextAccessor.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java b/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java rename to src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/saturnclient/mixin/SetScreenMixin.java b/src/main/java/org/saturnclient/saturnclient/mixin/SetScreenMixin.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/saturnclient/mixin/SetScreenMixin.java rename to src/main/java/org/saturnclient/saturnclient/mixin/SetScreenMixin.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/saturnclient/mixin/SplashOverlayMixin.java b/src/main/java/org/saturnclient/saturnclient/mixin/SplashOverlayMixin.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/saturnclient/mixin/SplashOverlayMixin.java rename to src/main/java/org/saturnclient/saturnclient/mixin/SplashOverlayMixin.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/saturnclient/mixin/TabListMixin.java b/src/main/java/org/saturnclient/saturnclient/mixin/TabListMixin.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/saturnclient/mixin/TabListMixin.java rename to src/main/java/org/saturnclient/saturnclient/mixin/TabListMixin.java diff --git a/versions/1.21.11/src/main/java/org/saturnclient/saturnclient/mixin/WhoAmI.java b/src/main/java/org/saturnclient/saturnclient/mixin/WhoAmI.java similarity index 100% rename from versions/1.21.11/src/main/java/org/saturnclient/saturnclient/mixin/WhoAmI.java rename to src/main/java/org/saturnclient/saturnclient/mixin/WhoAmI.java diff --git a/versions/1.21.11/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json similarity index 100% rename from versions/1.21.11/src/main/resources/fabric.mod.json rename to src/main/resources/fabric.mod.json diff --git a/versions/1.21.11/src/main/resources/features.mixins.json b/src/main/resources/features.mixins.json similarity index 100% rename from versions/1.21.11/src/main/resources/features.mixins.json rename to src/main/resources/features.mixins.json diff --git a/versions/1.21.11/src/main/resources/impl.mixins.json b/src/main/resources/impl.mixins.json similarity index 100% rename from versions/1.21.11/src/main/resources/impl.mixins.json rename to src/main/resources/impl.mixins.json diff --git a/versions/1.21.11/src/main/resources/saturnclient.mixins.json b/src/main/resources/saturnclient.mixins.json similarity index 100% rename from versions/1.21.11/src/main/resources/saturnclient.mixins.json rename to src/main/resources/saturnclient.mixins.json diff --git a/stonecutter.gradle b/stonecutter.gradle new file mode 100644 index 0000000..131f357 --- /dev/null +++ b/stonecutter.gradle @@ -0,0 +1,73 @@ +plugins { + id "dev.kikugie.stonecutter" +} + +// The version whose code is uncommented in src/. Switch with "Set active project to ", and run +// "Reset active project" before committing. +stonecutter.active "1.21.11" + +subprojects { + apply plugin: "java" + + repositories { + maven { url "https://maven.fabricmc.net/" } + maven { url "https://git.selimaj.dev/api/packages/selimaj-dev/maven" } + maven { url "https://git.selimaj.dev/api/packages/saturnclientmc/maven" } + mavenCentral() + } + + dependencies { + implementation "de.javagl:obj:0.4.0" + implementation "com.formdev:svgSalamander:1.1.4" + implementation 'com.fasterxml.jackson.core:jackson-databind:2.17.0' + implementation 'com.fasterxml.jackson.core:jackson-annotations:2.17.0' + implementation 'com.fasterxml.jackson.core:jackson-core:2.17.0' + } +} + +configure(subprojects.findAll { it.name != "common" }) { + dependencies { + implementation project(":common") + } + + sourceSets { + main { + resources { + srcDir project(":common").file("src/main/resources") + } + } + } +} + +tasks.register("buildAll") { + group = "build" + description = "Builds all subprojects and collects their remapped jars" + + // Only build remapped jars (not full build) + dependsOn subprojects.collect { proj -> + proj.tasks.matching { it.name == "remapJar" } + } + + doLast { + def outputDir = file("$buildDir/allJars") + outputDir.mkdirs() + + subprojects.each { proj -> + def remapTask = proj.tasks.findByName("remapJar") + + if (remapTask != null) { + def jarFile = remapTask.archiveFile.get().asFile + + if (jarFile.exists() && !jarFile.name.contains("sources")) { + copy { + from jarFile + into outputDir + rename { "${jarFile.name}" } + } + } + } + } + + println "All remapped jars collected in: $outputDir" + } +} diff --git a/versions/1.21.11/build.gradle b/versions/1.21.11/build.gradle deleted file mode 100644 index b40015c..0000000 --- a/versions/1.21.11/build.gradle +++ /dev/null @@ -1,101 +0,0 @@ -plugins { - id 'net.fabricmc.fabric-loom-remap' version "${loom_version}" - id 'maven-publish' -} - -version = "${project.mod_version}+${project.minecraft_version}" -group = project.maven_group - -base { - archivesName = project.archives_base_name -} - -repositories { - maven { name = "Selimaj"; url = 'https://git.selimaj.dev/api/packages/selimaj-dev/maven' } -} - -dependencies { - // To change the versions see the gradle.properties file - minecraft "com.mojang:minecraft:${project.minecraft_version}" - mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" - modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" - - // Fabric API. This is technically optional, but you probably want it anyway. - modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_api_version}" - - // Saturn's emote library (limb bending, Emotecraft emotes) - include modImplementation("org.saturnclient:emotes-fabric:${project.emotes_version}+${project.minecraft_version}") - - implementation project(":common") - - include implementation("dev.selimaj:session-java:0.2.0") - include implementation("de.javagl:obj:0.4.0") - include implementation("com.formdev:svgSalamander:1.1.4") - include implementation("com.fasterxml.jackson.core:jackson-databind:2.17.0") - include implementation("com.fasterxml.jackson.core:jackson-annotations:2.17.0") - include implementation("com.fasterxml.jackson.core:jackson-core:2.17.0") -} - -/* - * ================================================================ - * Resource Processing - * ================================================================ - * Injects version values into fabric.mod.json. - */ -processResources { - inputs.property "version", project.version - inputs.property "minecraft_version", project.minecraft_version - inputs.property "loader_version", project.loader_version - filteringCharset "UTF-8" - - filesMatching("fabric.mod.json") { - expand( - "version": project.version, - "minecraft_version": project.minecraft_version, - "loader_version": project.loader_version - ) - } -} - -tasks.withType(JavaCompile).configureEach { - it.options.release = 21 -} - -java { - // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task - // if it is present. - // If you remove this line, sources will not be generated. - withSourcesJar() - - sourceCompatibility = JavaVersion.VERSION_21 - targetCompatibility = JavaVersion.VERSION_21 -} - -jar { - inputs.property "archivesName", project.base.archivesName - - from("LICENSE") { - rename { "${it}_${inputs.properties.archivesName}"} - } - - from project(":common").sourceSets.main.output - duplicatesStrategy = DuplicatesStrategy.EXCLUDE -} - -// configure the maven publication -publishing { - publications { - create("mavenJava", MavenPublication) { - artifactId = project.archives_base_name - from components.java - } - } - - // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. - repositories { - // Add repositories to publish to here. - // Notice: This block does NOT have the same function as the block in the top level. - // The repositories here will be used for publishing your artifact, not for - // retrieving dependencies. - } -} \ No newline at end of file diff --git a/versions/1.21.11/settings.gradle b/versions/1.21.11/settings.gradle deleted file mode 100644 index 75c4d72..0000000 --- a/versions/1.21.11/settings.gradle +++ /dev/null @@ -1,10 +0,0 @@ -pluginManagement { - repositories { - maven { - name = 'Fabric' - url = 'https://maven.fabricmc.net/' - } - mavenCentral() - gradlePluginPortal() - } -} \ No newline at end of file From eebfe8fa4db294480060f44daea4db28c62fa817 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Sun, 27 Sep 2026 04:51:28 +0200 Subject: [PATCH 2/2] Switch the root build scripts to Kotlin and limit parallel remaps - settings.gradle, stonecutter.gradle and the root build.gradle become .kts. Loom's version for the Stonecutter versions moves to the root gradle.properties (loom_version), read by pluginManagement, since the Kotlin plugins block can't read properties. The old mc- projects keep their Groovy scripts until they're folded in. - buildAll ran all eight remapJar tasks at once. Each loads a Minecraft classpath and remaps a ~50 MB jar, which doesn't fit in the 3 GB daemon heap: a cold build stalled in garbage collection for 40+ minutes, and earlier runs failed. A shared build service now lets two remaps run together; a cold buildAll takes about 2 minutes. - port.sh and VERSION_GUIDE follow the .kts file names. The 1.21.11 jar is the same as with the Groovy scripts. Co-Authored-By: Claude Opus 5.5 --- VERSION_GUIDE.md | 8 +-- build.gradle | 101 ----------------------------- build.gradle.kts | 81 +++++++++++++++++++++++ gradle.properties | 3 + scripts/port.sh | 10 +-- settings.gradle | 40 ------------ settings.gradle.kts | 43 ++++++++++++ stonecutter.gradle | 73 --------------------- stonecutter.gradle.kts | 71 ++++++++++++++++++++ versions/1.21.11/gradle.properties | 1 - 10 files changed, 207 insertions(+), 224 deletions(-) delete mode 100644 build.gradle create mode 100644 build.gradle.kts delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts delete mode 100644 stonecutter.gradle create mode 100644 stonecutter.gradle.kts diff --git a/VERSION_GUIDE.md b/VERSION_GUIDE.md index e851152..444dd1f 100644 --- a/VERSION_GUIDE.md +++ b/VERSION_GUIDE.md @@ -10,11 +10,11 @@ Saturn is moving from one full copy of the version-specific code per Minecraft v - `src/`: the version-specific code (providers, refs, mixins and the three mixin configs) for the versions built by Stonecutter, currently **1.21.11**. It's one copy: where Minecraft's API differs between them, the code goes behind version comments (see below). Each of these versions is the Gradle project `:`, and `versions//` holds only its `gradle.properties` (Minecraft, Yarn, Fabric Loader and Fabric API versions), `build/` and `run/`. - `versions//src/`: the versions not moved yet (1.21.4 to 1.21.10), each a full copy, as the Gradle project `:mc-` with its own `build.gradle`. -`settings.gradle` lists the Stonecutter versions in `stonecutterVersions` and includes every other folder under `versions/` as `:mc-`. The root `build.gradle` builds each Stonecutter version, and `stonecutter.gradle` configures the root project (shared repositories, the `common` wiring and `buildAll`). +`settings.gradle.kts` lists the Stonecutter versions in `stonecutterVersions` and includes every other folder under `versions/` as `:mc-`. The root `build.gradle.kts` builds each Stonecutter version, and `stonecutter.gradle.kts` configures the root project (shared repositories, the `common` wiring and `buildAll`). Loom's version for the Stonecutter versions is `loom_version` in the root `gradle.properties`. ## Version-specific code with Stonecutter -The code in `src/` is always plain Java for the **active** version (1.21.11, set in `stonecutter.gradle`). Code for other versions sits in comments that Stonecutter swaps before building each version: +The code in `src/` is always plain Java for the **active** version (1.21.11, set in `stonecutter.gradle.kts`). Code for other versions sits in comments that Stonecutter swaps before building each version: ```java //? if >=1.21.9 { @@ -58,7 +58,7 @@ The **Check** workflow runs the same compile on every pull request, so a version Add new versions to Stonecutter rather than copying a folder: -1. Create `versions//gradle.properties` with `minecraft_version`, `yarn_mappings`, `loader_version` and `fabric_api_version` (copy 1.21.11's and change the values; they're listed at ). -2. Add `` to `stonecutterVersions` in `settings.gradle`. +1. Create `versions//gradle.properties` with `minecraft_version`, `yarn_mappings`, `loader_version` and `fabric_api_version` (copy 1.21.11's and change the values; they're listed at ). Loom's version is shared, in the root `gradle.properties`. +2. Add `` to `stonecutterVersions` in `settings.gradle.kts`. 3. Build it with `./gradlew ::compileJava` and put what Minecraft changed behind version comments. Check the mixin configs in `src/main/resources/*.mixins.json` as well: a mixin whose target changed fails at startup, not at compile time, so launch it with `./gradlew ::runClient`. 4. The release workflow builds everything through `buildAll`, and "Publish to Modrinth" takes the game version from each jar's name, so neither needs changing. diff --git a/build.gradle b/build.gradle deleted file mode 100644 index b40015c..0000000 --- a/build.gradle +++ /dev/null @@ -1,101 +0,0 @@ -plugins { - id 'net.fabricmc.fabric-loom-remap' version "${loom_version}" - id 'maven-publish' -} - -version = "${project.mod_version}+${project.minecraft_version}" -group = project.maven_group - -base { - archivesName = project.archives_base_name -} - -repositories { - maven { name = "Selimaj"; url = 'https://git.selimaj.dev/api/packages/selimaj-dev/maven' } -} - -dependencies { - // To change the versions see the gradle.properties file - minecraft "com.mojang:minecraft:${project.minecraft_version}" - mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" - modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" - - // Fabric API. This is technically optional, but you probably want it anyway. - modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_api_version}" - - // Saturn's emote library (limb bending, Emotecraft emotes) - include modImplementation("org.saturnclient:emotes-fabric:${project.emotes_version}+${project.minecraft_version}") - - implementation project(":common") - - include implementation("dev.selimaj:session-java:0.2.0") - include implementation("de.javagl:obj:0.4.0") - include implementation("com.formdev:svgSalamander:1.1.4") - include implementation("com.fasterxml.jackson.core:jackson-databind:2.17.0") - include implementation("com.fasterxml.jackson.core:jackson-annotations:2.17.0") - include implementation("com.fasterxml.jackson.core:jackson-core:2.17.0") -} - -/* - * ================================================================ - * Resource Processing - * ================================================================ - * Injects version values into fabric.mod.json. - */ -processResources { - inputs.property "version", project.version - inputs.property "minecraft_version", project.minecraft_version - inputs.property "loader_version", project.loader_version - filteringCharset "UTF-8" - - filesMatching("fabric.mod.json") { - expand( - "version": project.version, - "minecraft_version": project.minecraft_version, - "loader_version": project.loader_version - ) - } -} - -tasks.withType(JavaCompile).configureEach { - it.options.release = 21 -} - -java { - // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task - // if it is present. - // If you remove this line, sources will not be generated. - withSourcesJar() - - sourceCompatibility = JavaVersion.VERSION_21 - targetCompatibility = JavaVersion.VERSION_21 -} - -jar { - inputs.property "archivesName", project.base.archivesName - - from("LICENSE") { - rename { "${it}_${inputs.properties.archivesName}"} - } - - from project(":common").sourceSets.main.output - duplicatesStrategy = DuplicatesStrategy.EXCLUDE -} - -// configure the maven publication -publishing { - publications { - create("mavenJava", MavenPublication) { - artifactId = project.archives_base_name - from components.java - } - } - - // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. - repositories { - // Add repositories to publish to here. - // Notice: This block does NOT have the same function as the block in the top level. - // The repositories here will be used for publishing your artifact, not for - // retrieving dependencies. - } -} \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..5faa9c2 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,81 @@ +// Builds one Minecraft version from the shared src/. Stonecutter runs this for each version in +// stonecutterVersions (settings.gradle.kts), with that version's versions//gradle.properties. +plugins { + id("net.fabricmc.fabric-loom-remap") + `maven-publish` +} + +val minecraftVersion = property("minecraft_version") as String +val loaderVersion = property("loader_version") as String + +version = "${property("mod_version")}+$minecraftVersion" +group = property("maven_group") as String + +base { + archivesName = property("archives_base_name") as String +} + +dependencies { + minecraft("com.mojang:minecraft:$minecraftVersion") + mappings("net.fabricmc:yarn:${property("yarn_mappings")}:v2") + modImplementation("net.fabricmc:fabric-loader:$loaderVersion") + modImplementation("net.fabricmc.fabric-api:fabric-api:${property("fabric_api_version")}") + + // Saturn's emote library (limb bending, Emotecraft emotes) + include(modImplementation("org.saturnclient:emotes-fabric:${property("emotes_version")}+$minecraftVersion")!!) + + implementation(project(":common")) + + for (library in listOf( + "dev.selimaj:session-java:0.2.0", + "de.javagl:obj:0.4.0", + "com.formdev:svgSalamander:1.1.4", + "com.fasterxml.jackson.core:jackson-databind:2.17.0", + "com.fasterxml.jackson.core:jackson-annotations:2.17.0", + "com.fasterxml.jackson.core:jackson-core:2.17.0", + )) { + include(implementation(library)!!) + } +} + +// Injects the version values into fabric.mod.json. +tasks.processResources { + val values = mapOf( + "version" to project.version.toString(), + "minecraft_version" to minecraftVersion, + "loader_version" to loaderVersion, + ) + inputs.properties(values) + filteringCharset = "UTF-8" + filesMatching("fabric.mod.json") { expand(values) } +} + +tasks.withType().configureEach { + options.release = 21 +} + +java { + // Loom attaches the sources jar to remapSourcesJar and build. + withSourcesJar() + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 +} + +tasks.jar { + val archivesName = base.archivesName + inputs.property("archivesName", archivesName) + from("LICENSE") { + rename { "${it}_${archivesName.get()}" } + } + from(project(":common").extensions.getByType()["main"].output) + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} + +publishing { + publications { + create("mavenJava") { + artifactId = property("archives_base_name") as String + from(components["java"]) + } + } +} diff --git a/gradle.properties b/gradle.properties index a898428..947409b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,3 +10,6 @@ mod_version=0.1.1-beta # Saturn's emote library (git.selimaj.dev/saturnclientmc/emotes) emotes_version=0.1.0 + +# Loom, for the Stonecutter versions (settings.gradle.kts). Old mc- projects set their own. +loom_version=1.17.21 diff --git a/scripts/port.sh b/scripts/port.sh index 5f22636..2715fd5 100755 --- a/scripts/port.sh +++ b/scripts/port.sh @@ -6,9 +6,9 @@ # normal merge conflicts only where a version really differs. Only source is # ported; build.gradle and gradle.properties are version-specific on purpose. # -# Versions moved to Stonecutter (stonecutterVersions in settings.gradle) share -# the top-level src/, which counts as one version: the active one set in -# stonecutter.gradle. The others keep their own copy in versions//src. +# Versions moved to Stonecutter (stonecutterVersions in settings.gradle.kts) +# share the top-level src/, which counts as one version: the active one set in +# stonecutter.gradle.kts. The others keep their own copy in versions//src. # # Usage: # scripts/port.sh [--from VERSION] [--to V1,V2,...] [--commit REV] [--dry-run] @@ -43,8 +43,8 @@ while [ $# -gt 0 ]; do done # Versions sharing the Stonecutter src/, and the one that stands for them. -stonecutter_versions=$(sed -n 's/^def stonecutterVersions = \[\(.*\)\]/\1/p' settings.gradle | tr -d '" ' | tr ',' ' ') -stonecutter_active=$(sed -n 's/^stonecutter\.active "\(.*\)"/\1/p' stonecutter.gradle 2>/dev/null || true) +stonecutter_versions=$(sed -n 's/^val stonecutterVersions = listOf(\(.*\))/\1/p' settings.gradle.kts | tr -d '" ' | tr ',' ' ') +stonecutter_active=$(sed -n 's/^stonecutter active "\(.*\)"/\1/p' stonecutter.gradle.kts 2>/dev/null || true) is_stonecutter() { printf '%s\n' $stonecutter_versions | grep -qx "$1" diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index 95f2676..0000000 --- a/settings.gradle +++ /dev/null @@ -1,40 +0,0 @@ -pluginManagement { - repositories { - maven { url "https://maven.fabricmc.net/" } - maven { url "https://maven.kikugie.dev/releases" } - gradlePluginPortal() - mavenCentral() - } -} - -plugins { - id "dev.kikugie.stonecutter" version "0.9.8" -} - -rootProject.name = "saturn-client" - -include("common") - -// Versions built by Stonecutter from the shared src/ (see stonecutter.gradle). Each one's -// versions//gradle.properties holds its Minecraft, Yarn and Fabric API versions. -def stonecutterVersions = ["1.21.11"] - -stonecutter { - kotlinController = false // stonecutter.gradle configures the root project - centralScript = "build.gradle" // build.gradle configures each version - create(rootProject) { - versions(*stonecutterVersions) - vcsVersion = "1.21.11" - } -} - -// Versions not moved to Stonecutter yet still build from their own copy in versions//src, -// as projects named mc-. -file("versions").eachDir { dir -> - if (dir.name in stonecutterVersions) { - return - } - def projectName = "mc-${dir.name}" - include(projectName) - project(":${projectName}").projectDir = dir -} diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..69f2e22 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,43 @@ +pluginManagement { + repositories { + maven("https://maven.fabricmc.net/") + maven("https://maven.kikugie.dev/releases") + gradlePluginPortal() + mavenCentral() + } + + // Loom's version, for the Stonecutter versions' build.gradle.kts (the old mc- projects set + // their own in versions//gradle.properties). + val loom_version: String by settings + plugins { + id("net.fabricmc.fabric-loom-remap") version loom_version + } +} + +plugins { + id("dev.kikugie.stonecutter") version "0.9.8" +} + +rootProject.name = "saturn-client" + +include("common") + +// Versions built by Stonecutter from the shared src/ (see stonecutter.gradle.kts). Each one's +// versions//gradle.properties holds its Minecraft, Yarn and Fabric API versions. +val stonecutterVersions = listOf("1.21.11") + +stonecutter { + create(rootProject) { + versions(stonecutterVersions) + vcsVersion = "1.21.11" + } +} + +// Versions not moved to Stonecutter yet still build from their own copy in versions//src, +// as projects named mc-. +file("versions").listFiles { file -> file.isDirectory && file.name !in stonecutterVersions }!! + .sortedBy { it.name } + .forEach { dir -> + include("mc-${dir.name}") + project(":mc-${dir.name}").projectDir = dir + } diff --git a/stonecutter.gradle b/stonecutter.gradle deleted file mode 100644 index 131f357..0000000 --- a/stonecutter.gradle +++ /dev/null @@ -1,73 +0,0 @@ -plugins { - id "dev.kikugie.stonecutter" -} - -// The version whose code is uncommented in src/. Switch with "Set active project to ", and run -// "Reset active project" before committing. -stonecutter.active "1.21.11" - -subprojects { - apply plugin: "java" - - repositories { - maven { url "https://maven.fabricmc.net/" } - maven { url "https://git.selimaj.dev/api/packages/selimaj-dev/maven" } - maven { url "https://git.selimaj.dev/api/packages/saturnclientmc/maven" } - mavenCentral() - } - - dependencies { - implementation "de.javagl:obj:0.4.0" - implementation "com.formdev:svgSalamander:1.1.4" - implementation 'com.fasterxml.jackson.core:jackson-databind:2.17.0' - implementation 'com.fasterxml.jackson.core:jackson-annotations:2.17.0' - implementation 'com.fasterxml.jackson.core:jackson-core:2.17.0' - } -} - -configure(subprojects.findAll { it.name != "common" }) { - dependencies { - implementation project(":common") - } - - sourceSets { - main { - resources { - srcDir project(":common").file("src/main/resources") - } - } - } -} - -tasks.register("buildAll") { - group = "build" - description = "Builds all subprojects and collects their remapped jars" - - // Only build remapped jars (not full build) - dependsOn subprojects.collect { proj -> - proj.tasks.matching { it.name == "remapJar" } - } - - doLast { - def outputDir = file("$buildDir/allJars") - outputDir.mkdirs() - - subprojects.each { proj -> - def remapTask = proj.tasks.findByName("remapJar") - - if (remapTask != null) { - def jarFile = remapTask.archiveFile.get().asFile - - if (jarFile.exists() && !jarFile.name.contains("sources")) { - copy { - from jarFile - into outputDir - rename { "${jarFile.name}" } - } - } - } - } - - println "All remapped jars collected in: $outputDir" - } -} diff --git a/stonecutter.gradle.kts b/stonecutter.gradle.kts new file mode 100644 index 0000000..ba6ec10 --- /dev/null +++ b/stonecutter.gradle.kts @@ -0,0 +1,71 @@ +plugins { + id("dev.kikugie.stonecutter") +} + +// The version whose code is uncommented in src/. Switch with "Set active project to ", and run +// "Reset active project" before committing. +stonecutter active "1.21.11" + +subprojects { + apply(plugin = "java") + + repositories { + maven("https://maven.fabricmc.net/") + maven("https://git.selimaj.dev/api/packages/selimaj-dev/maven") + maven("https://git.selimaj.dev/api/packages/saturnclientmc/maven") + mavenCentral() + } + + dependencies { + "implementation"("de.javagl:obj:0.4.0") + "implementation"("com.formdev:svgSalamander:1.1.4") + "implementation"("com.fasterxml.jackson.core:jackson-databind:2.17.0") + "implementation"("com.fasterxml.jackson.core:jackson-annotations:2.17.0") + "implementation"("com.fasterxml.jackson.core:jackson-core:2.17.0") + } +} + +// Every Minecraft version builds on common and ships its resources. +configure(subprojects.filter { it.name != "common" }) { + dependencies { + "implementation"(project(":common")) + } + + extensions.configure { + named("main") { + resources.srcDir(project(":common").file("src/main/resources")) + } + } +} + +// remapJar loads a whole Minecraft classpath and remaps a ~50 MB jar. Eight at once don't fit in the +// daemon's heap (org.gradle.jvmargs) and the build stalls in garbage collection, so only two run +// together. Everything else still builds in parallel. +abstract class RemapLimit : BuildService + +val remapLimit = gradle.sharedServices.registerIfAbsent("remapLimit", RemapLimit::class) { + maxParallelUsages = 2 +} + +subprojects { + tasks.matching { it.name == "remapJar" }.configureEach { + usesService(remapLimit) + } +} + +tasks.register("buildAll") { + group = "build" + description = "Builds every Minecraft version's remapped jar and collects them in build/allJars" + + val remapJars = subprojects.flatMap { it.tasks.matching { task -> task.name == "remapJar" } } + dependsOn(remapJars) + + doLast { + val outputDir = layout.buildDirectory.dir("allJars").get().asFile + outputDir.mkdirs() + remapJars.map { (it as AbstractArchiveTask).archiveFile.get().asFile } + .filter { it.exists() && !it.name.contains("sources") } + .forEach { it.copyTo(outputDir.resolve(it.name), overwrite = true) } + println("All remapped jars collected in: $outputDir") + } +} diff --git a/versions/1.21.11/gradle.properties b/versions/1.21.11/gradle.properties index ef10f0c..48f9b6d 100644 --- a/versions/1.21.11/gradle.properties +++ b/versions/1.21.11/gradle.properties @@ -10,7 +10,6 @@ org.gradle.configuration-cache=false minecraft_version=1.21.11 yarn_mappings=1.21.11+build.4 loader_version=0.19.0 -loom_version=1.17.21 fabric_api_version=0.141.3+1.21.11