From 1daaf73554cca6bccff4a36382004c9bd0619622 Mon Sep 17 00:00:00 2001 From: JFronny Date: Sat, 22 Jun 2024 13:36:45 +0200 Subject: [PATCH] feat: implement concept of scan stages to support deferring update checks until after critical information --- .../inceptum/cli/commands/ModCommand.java | 13 +++++----- .../gtk/window/settings/instance/ModsTab.kt | 14 +++++------ .../inceptum/imgui/window/AddModWindow.java | 4 +++- .../inceptum/imgui/window/edit/ExportTab.java | 3 ++- .../inceptum/imgui/window/edit/ModsTab.java | 4 ++-- .../launcher/model/inceptum/ModMeta.java | 24 +++++++++---------- .../system/exporter/CurseForgeExporter.java | 2 +- .../launcher/system/exporter/Exporter.java | 5 ++-- .../system/exporter/ModrinthExporter.java | 2 +- .../system/exporter/MultiMCExporter.java | 2 +- .../system/importer/CurseForgeImporter.java | 2 +- .../launcher/system/instance/Instance.java | 6 ++--- .../launcher/system/instance/ModManager.java | 3 ++- .../system/launch/InstanceLauncher.java | 5 ++-- .../system/{instance => mds}/Mod.java | 4 +++- .../launcher/system/mds/ModsDirScanner.java | 5 ++-- .../launcher/system/mds/ScanStage.java | 24 +++++++++++++++++++ .../launcher/system/mds/noop/NoopMds.java | 7 +++--- .../launcher/system/mds/noop/NoopMod.java | 10 ++++++-- .../system/mds/threaded/FileScanTask.java | 6 ++--- .../launcher/system/mds/threaded/MdsMod.java | 7 ++++++ .../system/mds/threaded/ThreadedMds.java | 9 ++++--- .../system/setup/steps/RunMdsStep.java | 3 ++- packaging/arch-linux | 2 +- 24 files changed, 103 insertions(+), 63 deletions(-) rename launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/{instance => mds}/Mod.java (91%) create mode 100644 launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/ScanStage.java diff --git a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/ModCommand.java b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/ModCommand.java index 9996703..3d364f4 100644 --- a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/ModCommand.java +++ b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/ModCommand.java @@ -5,8 +5,7 @@ import io.gitlab.jfronny.commons.throwable.ThrowingBiFunction; import io.gitlab.jfronny.inceptum.cli.*; import io.gitlab.jfronny.inceptum.common.Utils; import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance; -import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod; -import io.gitlab.jfronny.inceptum.launcher.system.mds.ModsDirScanner; +import io.gitlab.jfronny.inceptum.launcher.system.mds.*; import io.gitlab.jfronny.inceptum.launcher.util.Unchecked; import java.io.FileNotFoundException; @@ -51,7 +50,7 @@ public class ModCommand extends Command { return; } System.out.println("Scanning installed mods, this might take a while"); - instance.mds().runOnce((path, mod) -> { + instance.mds().runOnce(ScanStage.UPDATE, (path, mod) -> { boolean hasSources = !mod.getMetadata().sources().isEmpty(); boolean updatable = hasSources && mod.getMetadata().sources().values().stream().anyMatch(Optional::isPresent); if (filterUpdatable && !updatable) return; @@ -107,9 +106,9 @@ public class ModCommand extends Command { mods.add(p); } ModsDirScanner mds = instance.mds(); - if (!ignoreDependencies && !mds.isComplete()) { + if (!ignoreDependencies && !mds.isComplete(ScanStage.DISCOVER)) { Utils.LOGGER.error("Scanning mods dir to search for dependencies. This might take a while"); - mds.runOnce((path, mod) -> System.out.println("Scanned " + path)); + mds.runOnce(ScanStage.DISCOVER, (path, mod) -> System.out.println("Scanned " + path)); } for (Path mod : mods) { try { @@ -157,9 +156,9 @@ public class ModCommand extends Command { } Set mods = pathSupplier.apply(args, instance.path()); ModsDirScanner mds = instance.mds(); - if (!mds.isComplete()) { + if (!mds.isComplete(ScanStage.UPDATE)) { Utils.LOGGER.error("Scanning mods dir to search for dependencies. This might take a while"); - mds.runOnce((path, mod) -> System.out.println("Scanned " + path)); + mds.runOnce(ScanStage.UPDATE, (path, mod) -> System.out.println("Scanned " + path)); } for (Path mod : mods) { try { diff --git a/launcher-gtk/src/main/kotlin/io/gitlab/jfronny/inceptum/gtk/window/settings/instance/ModsTab.kt b/launcher-gtk/src/main/kotlin/io/gitlab/jfronny/inceptum/gtk/window/settings/instance/ModsTab.kt index 6763a1f..67c73a6 100644 --- a/launcher-gtk/src/main/kotlin/io/gitlab/jfronny/inceptum/gtk/window/settings/instance/ModsTab.kt +++ b/launcher-gtk/src/main/kotlin/io/gitlab/jfronny/inceptum/gtk/window/settings/instance/ModsTab.kt @@ -13,10 +13,11 @@ import io.gitlab.jfronny.inceptum.launcher.api.CurseforgeApi import io.gitlab.jfronny.inceptum.launcher.api.ModrinthApi import io.gitlab.jfronny.inceptum.launcher.model.modrinth.ModrinthProjectType import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance -import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod +import io.gitlab.jfronny.inceptum.launcher.system.mds.Mod import io.gitlab.jfronny.inceptum.launcher.system.instance.ModManager import io.gitlab.jfronny.inceptum.launcher.system.instance.ModPath import io.gitlab.jfronny.inceptum.launcher.system.mds.ModsDirScanner +import io.gitlab.jfronny.inceptum.launcher.system.mds.ScanStage import io.gitlab.jfronny.inceptum.launcher.system.source.CurseforgeModSource import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource import io.gitlab.jfronny.inceptum.launcher.system.source.ModrinthModSource @@ -30,8 +31,8 @@ import java.util.concurrent.ForkJoinPool import kotlin.jvm.optionals.getOrNull class ModsTab(window: InstanceSettingsWindow) : SettingsTab(window, Leaflet()) { - private val instance: Instance - private val mds: ModsDirScanner + private val instance: Instance = window.instance + private val mds: ModsDirScanner = instance.mds private val listModel: StringList private val loadingRevealer = LoadingRevealer() private val descriptionLabel: ILabel @@ -42,9 +43,6 @@ class ModsTab(window: InstanceSettingsWindow) : SettingsTab val toShow = mutableListOf() if (page == Page.LOCAL) { - loadingRevealer.setRunning(!mds.isComplete) + loadingRevealer.setRunning(!mds.isComplete(ScanStage.DISCOVER)) val mods = window.instance.mds.mods // avoid instance.mods to allow rendering before MDS is finished loadingRevealer.setProgress((mods.filter { mds.hasScanned(it) }.size.toDouble() / mods.size)) for (mod in mods) { @@ -99,7 +97,7 @@ class ModsTab(window: InstanceSettingsWindow) : SettingsTab s instanceof ModrinthModSource ms && ms.getModId().equals(projectId)); if (alreadyPresent) diff --git a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/ExportTab.java b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/ExportTab.java index 85d6046..25e9a93 100644 --- a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/ExportTab.java +++ b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/ExportTab.java @@ -9,6 +9,7 @@ import io.gitlab.jfronny.inceptum.imgui.window.dialog.ProcessStateWatcherWindow; import io.gitlab.jfronny.inceptum.launcher.LauncherEnv; import io.gitlab.jfronny.inceptum.launcher.system.exporter.Exporter; import io.gitlab.jfronny.inceptum.launcher.system.exporter.Exporters; +import io.gitlab.jfronny.inceptum.launcher.system.mds.ScanStage; import io.gitlab.jfronny.inceptum.launcher.util.ProcessState; import java.nio.file.Path; @@ -29,7 +30,7 @@ public class ExportTab extends Tab { window.instance.meta().instanceVersion = instanceVersion.get(); window.instance.writeMeta(); } - if (window.instance.mds().isComplete()) { + if (window.instance.mds().isComplete(ScanStage.DOWNLOAD)) { for (Exporter exporter : Exporters.EXPORTERS) { if (ImGui.button(exporter.getName())) { String defaultName = exporter.getDefaultFileName(window.instance); diff --git a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/ModsTab.java b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/ModsTab.java index 43c1ebc..5da2e2c 100644 --- a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/ModsTab.java +++ b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/ModsTab.java @@ -7,7 +7,7 @@ import io.gitlab.jfronny.inceptum.imgui.GuiMain; import io.gitlab.jfronny.inceptum.imgui.control.Tab; import io.gitlab.jfronny.inceptum.imgui.window.AddModWindow; import io.gitlab.jfronny.inceptum.launcher.LauncherEnv; -import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod; +import io.gitlab.jfronny.inceptum.launcher.system.mds.Mod; import io.gitlab.jfronny.inceptum.launcher.system.instance.ModPath; import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource; @@ -49,7 +49,7 @@ public class ModsTab extends Tab { Utils.openFile(window.instance.getConfigDir().toFile()); } try { - Set modSet = window.instance.getMods(); + Set modSet = window.instance.mds().getMods(); boolean updatesFound = false; float scannedPercentage = 0; boolean hasUnScanned = false; diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/inceptum/ModMeta.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/inceptum/ModMeta.java index c8250dd..f091ea4 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/inceptum/ModMeta.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/inceptum/ModMeta.java @@ -62,7 +62,7 @@ public record ModMeta( @GPrefer public ModMeta {} - public static ModMeta of(Path mod) { + public static ModMeta fromJar(Path mod) { String sha1 = null; Long murmur2 = null; if (!Files.isDirectory(mod)) { @@ -84,32 +84,32 @@ public record ModMeta( ); } - public static ModMeta of(String sha1, Long murmur2, @Nullable ModSource knownSource, String gameVersion) { + public static ModMeta fromDownload(ModDownload download, @Nullable ModSource knownSource, String gameVersion) { ModMeta res = new ModMeta( new Sources(), - sha1, - murmur2, + download.sha1(), + download.murmur2(), new ArrayList<>(), new ArrayList<>(), true ); - if (knownSource != null) res.addSource(knownSource, gameVersion); - res.initialize(gameVersion); + if (knownSource != null) res.checkAndAddSource(knownSource, gameVersion); + res.updateCheck(gameVersion); return res; } - public boolean initialize(String gameVersion) { + public boolean updateCheck(String gameVersion) { boolean modrinth = false; boolean curseforge = false; for (ModSource source : sources.keySet().toArray(ModSource[]::new)) { if (source instanceof ModrinthModSource) modrinth = true; if (source instanceof CurseforgeModSource) curseforge = true; - addSource(source, gameVersion); + checkAndAddSource(source, gameVersion); } boolean changed = false; if (!modrinth) { try { - addSource(new ModrinthModSource(ModrinthApi.getVersionByHash(sha1).id()), gameVersion); + checkAndAddSource(new ModrinthModSource(ModrinthApi.getVersionByHash(sha1).id()), gameVersion); changed = true; } catch (IOException e) { // not found @@ -119,8 +119,8 @@ public record ModMeta( try { FingerprintMatchesResponse.Result cf = CurseforgeApi.checkFingerprint(murmur2); if (!cf.exactMatches().isEmpty()) { - FingerprintMatchesResponse.Result.Match f = cf.exactMatches().get(0); - addSource(new CurseforgeModSource(f.id(), f.file().id()), gameVersion); + FingerprintMatchesResponse.Result.Match f = cf.exactMatches().getFirst(); + checkAndAddSource(new CurseforgeModSource(f.id(), f.file().id()), gameVersion); changed = true; } } catch (IOException | URISyntaxException e) { @@ -130,7 +130,7 @@ public record ModMeta( return changed; } - public void addSource(ModSource source, String gameVersion) { + private void checkAndAddSource(ModSource source, String gameVersion) { try { sources.put(source, source.getUpdate(gameVersion)); } catch (IOException e) { diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/CurseForgeExporter.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/CurseForgeExporter.java index 3f33ca3..6f76830 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/CurseForgeExporter.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/CurseForgeExporter.java @@ -5,7 +5,7 @@ import io.gitlab.jfronny.inceptum.common.InceptumConfig; import io.gitlab.jfronny.inceptum.launcher.model.curseforge.CurseforgeModpackManifest; import io.gitlab.jfronny.inceptum.launcher.model.curseforge.GC_CurseforgeModpackManifest; import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance; -import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod; +import io.gitlab.jfronny.inceptum.launcher.system.mds.Mod; import io.gitlab.jfronny.inceptum.launcher.system.source.CurseforgeModSource; import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource; diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/Exporter.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/Exporter.java index 31af3a5..06aa09b 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/Exporter.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/Exporter.java @@ -3,7 +3,8 @@ package io.gitlab.jfronny.inceptum.launcher.system.exporter; import io.gitlab.jfronny.commons.StreamIterable; import io.gitlab.jfronny.inceptum.common.Utils; import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance; -import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod; +import io.gitlab.jfronny.inceptum.launcher.system.mds.Mod; +import io.gitlab.jfronny.inceptum.launcher.system.mds.ScanStage; import io.gitlab.jfronny.inceptum.launcher.util.ProcessState; import io.gitlab.jfronny.inceptum.launcher.util.gitignore.IgnoringWalk; @@ -36,7 +37,7 @@ public abstract class Exporter { Manifest manifest = generateManifests(root, instance, instance.meta().instanceVersion); if (instance.isFabric()) { state.incrementStep("Adding mods"); - addMods(root, instance, instance.getMods().stream().filter(mod -> { + addMods(root, instance, instance.getMods(ScanStage.CROSSREFERENCE).stream().filter(mod -> { if (!mod.isEnabled()) return false; state.updateStep(mod.getName()); return true; diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/ModrinthExporter.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/ModrinthExporter.java index 772dc61..d67a597 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/ModrinthExporter.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/ModrinthExporter.java @@ -4,7 +4,7 @@ import io.gitlab.jfronny.inceptum.common.GsonPreset; import io.gitlab.jfronny.inceptum.launcher.model.modrinth.GC_ModrinthModpackManifest; import io.gitlab.jfronny.inceptum.launcher.model.modrinth.ModrinthModpackManifest; import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance; -import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod; +import io.gitlab.jfronny.inceptum.launcher.system.mds.Mod; import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource; import io.gitlab.jfronny.inceptum.launcher.system.source.ModrinthModSource; diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/MultiMCExporter.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/MultiMCExporter.java index 25b7a14..8a6207b 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/MultiMCExporter.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/MultiMCExporter.java @@ -4,7 +4,7 @@ import io.gitlab.jfronny.inceptum.common.GsonPreset; import io.gitlab.jfronny.inceptum.launcher.model.multimc.GC_MMCPackMeta; import io.gitlab.jfronny.inceptum.launcher.model.multimc.MMCPackMeta; import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance; -import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod; +import io.gitlab.jfronny.inceptum.launcher.system.mds.Mod; import java.io.IOException; import java.nio.file.Files; diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/importer/CurseForgeImporter.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/importer/CurseForgeImporter.java index e9d0be7..488b12b 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/importer/CurseForgeImporter.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/importer/CurseForgeImporter.java @@ -46,7 +46,7 @@ public class CurseForgeImporter extends Importer { CurseforgeModSource source = new CurseforgeModSource(file.projectID(), file.fileID()); state.updateStep("Downloading " + source.getName()); ModDownload download = source.download(); - ModMeta imod = ModMeta.of(download.sha1(), download.murmur2(), source, manifest.minecraft().version()); + ModMeta imod = ModMeta.fromDownload(download, source, manifest.minecraft().version()); Files.createDirectories(modsPath); GC_ModMeta.serialize(imod, modsPath.resolve(source.getShortName() + ModPath.EXT_IMOD), GsonPreset.CONFIG); } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/Instance.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/Instance.java index b83ab26..2fe8681 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/Instance.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/Instance.java @@ -5,7 +5,7 @@ import io.gitlab.jfronny.inceptum.common.GsonPreset; import io.gitlab.jfronny.inceptum.common.Utils; import io.gitlab.jfronny.inceptum.launcher.model.inceptum.GC_InstanceMeta; import io.gitlab.jfronny.inceptum.launcher.model.inceptum.InstanceMeta; -import io.gitlab.jfronny.inceptum.launcher.system.mds.ModsDirScanner; +import io.gitlab.jfronny.inceptum.launcher.system.mds.*; import io.gitlab.jfronny.inceptum.launcher.util.GameVersionParser; import io.gitlab.jfronny.inceptum.launcher.util.ProcessUtils; import org.jetbrains.annotations.NotNull; @@ -75,8 +75,8 @@ public record Instance(String id, Path path, InstanceMeta meta, ModsDirScanner m return path.resolve("config"); } - public Set getMods() throws IOException { - mds.runOnce(R::nop); + public Set getMods(ScanStage stage) throws IOException { + mds.runOnce(stage, R::nop); return mds.getMods(); } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/ModManager.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/ModManager.java index 0e27cc4..6cfc7e7 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/ModManager.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/ModManager.java @@ -3,6 +3,7 @@ package io.gitlab.jfronny.inceptum.launcher.system.instance; import io.gitlab.jfronny.inceptum.common.GsonPreset; import io.gitlab.jfronny.inceptum.launcher.model.inceptum.GC_ModMeta; import io.gitlab.jfronny.inceptum.launcher.model.inceptum.ModMeta; +import io.gitlab.jfronny.inceptum.launcher.system.mds.Mod; import io.gitlab.jfronny.inceptum.launcher.system.mds.ModsDirScanner; import io.gitlab.jfronny.inceptum.launcher.system.source.ModDownload; import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource; @@ -20,7 +21,7 @@ public class ModManager { } } ModDownload md = ms.download(); - ModMeta manifest = ModMeta.of(md.sha1(), md.murmur2(), ms, mds.getGameVersion()); + ModMeta manifest = ModMeta.fromDownload(md, ms, mds.getGameVersion()); for (ModSource depSrc : ms.getDependencies(mds.getGameVersion())) { DownloadMeta depMeta = download(depSrc, metaFile.getParent().resolve(depSrc.getShortName() + ModPath.EXT_IMOD), mds); depMeta.meta.dependents().add(metaFile.getFileName().toString()); diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/launch/InstanceLauncher.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/launch/InstanceLauncher.java index 5555025..4901ad1 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/launch/InstanceLauncher.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/launch/InstanceLauncher.java @@ -11,7 +11,8 @@ import io.gitlab.jfronny.inceptum.launcher.api.account.AuthInfo; import io.gitlab.jfronny.inceptum.launcher.model.inceptum.ArtifactInfo; import io.gitlab.jfronny.inceptum.launcher.model.mojang.*; import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance; -import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod; +import io.gitlab.jfronny.inceptum.launcher.system.mds.Mod; +import io.gitlab.jfronny.inceptum.launcher.system.mds.ScanStage; import io.gitlab.jfronny.inceptum.launcher.system.setup.steps.DownloadLibrariesStep; import io.gitlab.jfronny.inceptum.launcher.util.ProcessState; import io.gitlab.jfronny.inceptum.launcher.util.VersionInfoLibraryResolver; @@ -100,7 +101,7 @@ public class InstanceLauncher { // Fabric imods if (instance.isFabric()) { StringBuilder fabricAddMods = new StringBuilder("-Dfabric.addMods="); - for (Mod mod : instance.getMods()) { + for (Mod mod : instance.getMods(ScanStage.DOWNLOAD)) { if (mod.isEnabled() && mod.getNeedsInject()) { fabricAddMods.append(mod.getJarPath()); fabricAddMods.append(File.pathSeparatorChar); diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/Mod.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/Mod.java similarity index 91% rename from launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/Mod.java rename to launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/Mod.java index 0e89b8f..c4db8a8 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/Mod.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/Mod.java @@ -1,4 +1,4 @@ -package io.gitlab.jfronny.inceptum.launcher.system.instance; +package io.gitlab.jfronny.inceptum.launcher.system.mds; import io.gitlab.jfronny.inceptum.launcher.model.inceptum.ModMeta; import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource; @@ -15,6 +15,8 @@ public abstract class Mod implements Comparable { public abstract Path getJarPath(); public abstract Path getMetadataPath(); + public abstract ScanStage getScanStage(); + public abstract void delete() throws IOException; public abstract Path update(ModSource update) throws IOException; public abstract Set getDependencies(); diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/ModsDirScanner.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/ModsDirScanner.java index b624252..6911f2f 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/ModsDirScanner.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/ModsDirScanner.java @@ -1,7 +1,6 @@ package io.gitlab.jfronny.inceptum.launcher.system.mds; import io.gitlab.jfronny.inceptum.launcher.model.inceptum.InstanceMeta; -import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod; import io.gitlab.jfronny.inceptum.launcher.system.mds.noop.NoopMds; import io.gitlab.jfronny.inceptum.launcher.system.mds.threaded.ThreadedMds; import io.gitlab.jfronny.inceptum.launcher.util.GameVersionParser; @@ -23,7 +22,7 @@ public interface ModsDirScanner extends Closeable { ThreadedMds.closeAll(); } - boolean isComplete(); + boolean isComplete(ScanStage stage); void start(); @@ -45,5 +44,5 @@ public interface ModsDirScanner extends Closeable { return hasScanned(mod.getMetadataPath()); } - void runOnce(BiConsumer discovered); + void runOnce(ScanStage targetStage, BiConsumer discovered); } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/ScanStage.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/ScanStage.java new file mode 100644 index 0000000..b9416a2 --- /dev/null +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/ScanStage.java @@ -0,0 +1,24 @@ +package io.gitlab.jfronny.inceptum.launcher.system.mds; + +public enum ScanStage { + /** + * The scanner has been initialized and is ready to start scanning + */ + INITIALIZE, + /** + * The mod(s) have been discovered and their metadata has been loaded + */ + DISCOVER, + /** + * The mod(s) have been validated (and downloaded if necessary) and are ready to be used + */ + DOWNLOAD, + /** + * The mod(s) have been cross-referenced with the mod sources + */ + CROSSREFERENCE, + /** + * The mod(s) have been checked for updates + */ + UPDATE +} diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/noop/NoopMds.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/noop/NoopMds.java index 8dd6486..722b08d 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/noop/NoopMds.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/noop/NoopMds.java @@ -1,7 +1,6 @@ package io.gitlab.jfronny.inceptum.launcher.system.mds.noop; -import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod; -import io.gitlab.jfronny.inceptum.launcher.system.mds.ModsDirScanner; +import io.gitlab.jfronny.inceptum.launcher.system.mds.*; import java.io.IOException; import java.nio.file.Path; @@ -14,7 +13,7 @@ public record NoopMds(String gameVersion) implements ModsDirScanner { } @Override - public boolean isComplete() { + public boolean isComplete(ScanStage stage) { return true; } @@ -47,6 +46,6 @@ public record NoopMds(String gameVersion) implements ModsDirScanner { } @Override - public void runOnce(BiConsumer discovered) { + public void runOnce(ScanStage targetStage, BiConsumer discovered) { } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/noop/NoopMod.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/noop/NoopMod.java index 07b0797..3ea6a2e 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/noop/NoopMod.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/noop/NoopMod.java @@ -1,7 +1,8 @@ package io.gitlab.jfronny.inceptum.launcher.system.mds.noop; import io.gitlab.jfronny.inceptum.launcher.model.inceptum.ModMeta; -import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod; +import io.gitlab.jfronny.inceptum.launcher.system.mds.Mod; +import io.gitlab.jfronny.inceptum.launcher.system.mds.ScanStage; import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource; import java.io.IOException; @@ -14,7 +15,7 @@ public class NoopMod extends Mod { public NoopMod(Path path) { this.path = path; - this.meta = ModMeta.of(path); + this.meta = ModMeta.fromJar(path); } @Override @@ -45,6 +46,11 @@ public class NoopMod extends Mod { return path; } + @Override + public ScanStage getScanStage() { + return ScanStage.UPDATE; + } + @Override public void delete() throws IOException { } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/threaded/FileScanTask.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/threaded/FileScanTask.java index 6ae5c11..d4c3beb 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/threaded/FileScanTask.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/threaded/FileScanTask.java @@ -6,7 +6,7 @@ import io.gitlab.jfronny.inceptum.launcher.model.fabric.FabricModJson; import io.gitlab.jfronny.inceptum.launcher.model.fabric.GC_FabricModJson; import io.gitlab.jfronny.inceptum.launcher.model.inceptum.GC_ModMeta; import io.gitlab.jfronny.inceptum.launcher.model.inceptum.ModMeta; -import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod; +import io.gitlab.jfronny.inceptum.launcher.system.mds.Mod; import io.gitlab.jfronny.inceptum.launcher.system.instance.ModPath; import io.gitlab.jfronny.inceptum.launcher.system.mds.noop.NoopMod; import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource; @@ -35,11 +35,11 @@ public record FileScanTask(ProtoInstance instance, Path file, BiConsumer discovered) { + public void runOnce(ScanStage targetStage, BiConsumer discovered) { try { if (!Files.isDirectory(instance.modsDir())) { return; diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/RunMdsStep.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/RunMdsStep.java index b89afab..1f4a50a 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/RunMdsStep.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/RunMdsStep.java @@ -5,6 +5,7 @@ import io.gitlab.jfronny.inceptum.common.MetaHolder; import io.gitlab.jfronny.inceptum.launcher.model.inceptum.GC_InstanceMeta; import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance; import io.gitlab.jfronny.inceptum.launcher.system.mds.ModsDirScanner; +import io.gitlab.jfronny.inceptum.launcher.system.mds.ScanStage; import io.gitlab.jfronny.inceptum.launcher.system.setup.SetupStepInfo; import io.gitlab.jfronny.inceptum.launcher.system.setup.Step; @@ -17,7 +18,7 @@ public class RunMdsStep implements Step { info.setState("Running MDS"); Path instance = MetaHolder.INSTANCE_DIR.resolve(info.name()); ModsDirScanner.get(instance.resolve("mods"), GC_InstanceMeta.deserialize(instance.resolve(Instance.CONFIG_NAME), GsonPreset.CONFIG)) - .runOnce((path, iwModDescription) -> info.setState("Scanned " + path)); + .runOnce(ScanStage.DOWNLOAD, (path, iwModDescription) -> info.setState("Scanned " + path)); } @Override diff --git a/packaging/arch-linux b/packaging/arch-linux index 51000ec..2159562 160000 --- a/packaging/arch-linux +++ b/packaging/arch-linux @@ -1 +1 @@ -Subproject commit 51000ec505afe15dafc6c9476382a302c5093fd2 +Subproject commit 2159562d3cf32e48814e0913481f88e204ba27e9