From fdd61ba7c571071256b910c0cd5dc1afe84f2fba Mon Sep 17 00:00:00 2001 From: williambl Date: Thu, 18 Sep 2025 19:02:50 +0100 Subject: [PATCH] Add `fabric.configFolder` system property to set mod config path As the logic of the new `getConfigDirectory0` function is very similar to the existing `getModsDirectory0`, I abstracted them both into `getConfiguredOrRelativeDirectory`, which I honestly didn't name very well, which retrieves a path from a system property or, as a fallback, as a predefined path relative to the game directory. --- .../fabricmc/loader/impl/FabricLoaderImpl.java | 15 ++++++++++++--- .../loader/impl/util/SystemProperties.java | 2 ++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/fabricmc/loader/impl/FabricLoaderImpl.java b/src/main/java/net/fabricmc/loader/impl/FabricLoaderImpl.java index e4159c3d6..a2ecd2c88 100644 --- a/src/main/java/net/fabricmc/loader/impl/FabricLoaderImpl.java +++ b/src/main/java/net/fabricmc/loader/impl/FabricLoaderImpl.java @@ -35,6 +35,7 @@ import java.util.function.Consumer; import java.util.stream.Collectors; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.VisibleForTesting; import org.objectweb.asm.Opcodes; @@ -135,7 +136,7 @@ public void setGameProvider(GameProvider provider) { private void setGameDir(Path gameDir) { this.gameDir = gameDir.toAbsolutePath().normalize(); - this.configDir = gameDir.resolve("config"); + this.configDir = getConfigDirectory0(); } @Override @@ -617,9 +618,17 @@ public String[] getLaunchArguments(boolean sanitize) { @Override protected Path getModsDirectory0() { - String directory = System.getProperty(SystemProperties.MODS_FOLDER); + return getConfiguredOrRelativeDirectory(SystemProperties.MODS_FOLDER, "mods"); + } + + private Path getConfigDirectory0() { + return getConfiguredOrRelativeDirectory(SystemProperties.CONFIG_FOLDER, "config"); + } + + private @NotNull Path getConfiguredOrRelativeDirectory(String systemProperty, String fallbackName) { + String directory = System.getProperty(systemProperty); - return directory != null ? Paths.get(directory) : gameDir.resolve("mods"); + return directory != null ? Paths.get(directory) : gameDir.resolve(fallbackName); } /** diff --git a/src/main/java/net/fabricmc/loader/impl/util/SystemProperties.java b/src/main/java/net/fabricmc/loader/impl/util/SystemProperties.java index 9e3a08ae3..7353c35ac 100644 --- a/src/main/java/net/fabricmc/loader/impl/util/SystemProperties.java +++ b/src/main/java/net/fabricmc/loader/impl/util/SystemProperties.java @@ -47,6 +47,8 @@ public final class SystemProperties { public static final String LOG_FILE = "fabric.log.file"; // minimum log level for builtin log handler public static final String LOG_LEVEL = "fabric.log.level"; + // a path to a directory to replace the default mod config directory + public static final String CONFIG_FOLDER = "fabric.configFolder"; // a path to a directory to replace the default mod search directory public static final String MODS_FOLDER = "fabric.modsFolder"; // additional mods to load (path separator separated paths, @ prefix for meta-file with each line referencing an actual file)