From 4c81fa47e83b02f9f38f7d1cc9b51273fc6db6bc Mon Sep 17 00:00:00 2001 From: Geoff Bourne Date: Thu, 9 Oct 2025 07:46:57 -0500 Subject: [PATCH] Improve the error description of "Unable to find suitable version" --- .../itzg/helpers/curseforge/CurseForgeInstaller.java | 8 ++++++-- .../me/itzg/helpers/errors/ExceptionHandler.java | 12 ++++++++++-- .../java/me/itzg/helpers/forge/ForgeInstaller.java | 3 ++- .../itzg/helpers/forge/ForgeInstallerResolver.java | 5 +++++ .../me/itzg/helpers/forge/InstallerResolver.java | 2 ++ .../helpers/forge/NeoForgeInstallerResolver.java | 5 +++++ .../helpers/forge/ProvidedInstallerResolver.java | 5 +++++ 7 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/main/java/me/itzg/helpers/curseforge/CurseForgeInstaller.java b/src/main/java/me/itzg/helpers/curseforge/CurseForgeInstaller.java index 5c82b1fd..04726149 100644 --- a/src/main/java/me/itzg/helpers/curseforge/CurseForgeInstaller.java +++ b/src/main/java/me/itzg/helpers/curseforge/CurseForgeInstaller.java @@ -971,11 +971,12 @@ private void prepareModLoader(String id, String minecraftVersion) { throw new GenericException("Unknown modloader ID: " + id); } + final String provider = parts[0]; final String loaderVersion = parts.length == 2 ? parts[1] : parts[2]; try (SharedFetch sharedFetch = Fetch.sharedFetch("install-curseforge", sharedFetchOptions)) { - switch (parts[0]) { + switch (provider) { case "forge": prepareForge(sharedFetch, minecraftVersion, loaderVersion); break; @@ -989,8 +990,11 @@ private void prepareModLoader(String id, String minecraftVersion) { break; default: - throw new InvalidParameterException(String.format("ModLoader %s is not yet supported", parts[0])); + throw new InvalidParameterException(String.format("ModLoader %s is not yet supported", provider)); } + } catch (InvalidParameterException e) { + throw new GenericException("Unable to prepare modpack's mod loader " + + provider + " " + loaderVersion + " for Minecraft " + minecraftVersion, e); } } diff --git a/src/main/java/me/itzg/helpers/errors/ExceptionHandler.java b/src/main/java/me/itzg/helpers/errors/ExceptionHandler.java index 3c1f36c5..6cc407e8 100644 --- a/src/main/java/me/itzg/helpers/errors/ExceptionHandler.java +++ b/src/main/java/me/itzg/helpers/errors/ExceptionHandler.java @@ -28,8 +28,8 @@ public int handleExecutionException(Exception e, CommandLine commandLine, ParseR log.debug("Invalid parameter details", e); } else if (e instanceof FailedRequestException) { - logUnexpectedException(e, commandLine); - log.debug("Failed request details: {}", e.toString()); + logExceptionWithoutStacktrace(e, commandLine); + log.debug("Failed request details", e); } else if (e instanceof RateLimitException) { logUnexpectedException(e, commandLine); @@ -55,4 +55,12 @@ private static void logUnexpectedException(Exception e, CommandLine commandLine) e ); } + + private static void logExceptionWithoutStacktrace(Exception e, CommandLine commandLine) { + log.error("'{}' command failed. Version is {}: {}", + commandLine.getCommandName(), + McImageHelper.getVersion(), + ExceptionDetailer.buildCausalMessages(e) + ); + } } diff --git a/src/main/java/me/itzg/helpers/forge/ForgeInstaller.java b/src/main/java/me/itzg/helpers/forge/ForgeInstaller.java index e5e0c67e..a64924f7 100644 --- a/src/main/java/me/itzg/helpers/forge/ForgeInstaller.java +++ b/src/main/java/me/itzg/helpers/forge/ForgeInstaller.java @@ -53,7 +53,8 @@ public void install( final VersionPair resolved = installerResolver.resolve(); if (resolved == null) { - throw new InvalidParameterException("Unable to find suitable version"); + throw new InvalidParameterException("Unable to find suitable version for " + + installerResolver.getDescription()); } log.debug("Resolved installer version={}", resolved); diff --git a/src/main/java/me/itzg/helpers/forge/ForgeInstallerResolver.java b/src/main/java/me/itzg/helpers/forge/ForgeInstallerResolver.java index 5df43bc8..fff7cc81 100644 --- a/src/main/java/me/itzg/helpers/forge/ForgeInstallerResolver.java +++ b/src/main/java/me/itzg/helpers/forge/ForgeInstallerResolver.java @@ -109,6 +109,11 @@ public void cleanup(Path forgeInstallerJar) { } } + @Override + public String getDescription() { + return String.format("Minecraft %s Forge %s", requestedMinecraftVersion, requestedForgeVersion); + } + private PromotionsSlim loadPromotions() { return sharedFetch.fetch(URI.create(promotionsUrl)) .userAgentCommand("forge") diff --git a/src/main/java/me/itzg/helpers/forge/InstallerResolver.java b/src/main/java/me/itzg/helpers/forge/InstallerResolver.java index cb8f3291..d63d9186 100644 --- a/src/main/java/me/itzg/helpers/forge/InstallerResolver.java +++ b/src/main/java/me/itzg/helpers/forge/InstallerResolver.java @@ -9,4 +9,6 @@ public interface InstallerResolver { Path download(String minecraftVersion, String forgeVersion, Path outputDir); void cleanup(Path forgeInstallerJar); + + String getDescription(); } diff --git a/src/main/java/me/itzg/helpers/forge/NeoForgeInstallerResolver.java b/src/main/java/me/itzg/helpers/forge/NeoForgeInstallerResolver.java index 85c0e336..9d2e43e8 100644 --- a/src/main/java/me/itzg/helpers/forge/NeoForgeInstallerResolver.java +++ b/src/main/java/me/itzg/helpers/forge/NeoForgeInstallerResolver.java @@ -223,4 +223,9 @@ public void cleanup(Path forgeInstallerJar) { log.warn("Failed to delete NeoForge installer", e); } } + + @Override + public String getDescription() { + return String.format("Minecraft %s NeoForge %s", requestedMinecraftVersion, requestedNeoForgeVersion); + } } diff --git a/src/main/java/me/itzg/helpers/forge/ProvidedInstallerResolver.java b/src/main/java/me/itzg/helpers/forge/ProvidedInstallerResolver.java index 19008d26..2c05fc0e 100644 --- a/src/main/java/me/itzg/helpers/forge/ProvidedInstallerResolver.java +++ b/src/main/java/me/itzg/helpers/forge/ProvidedInstallerResolver.java @@ -50,6 +50,11 @@ public void cleanup(Path forgeInstallerJar) { // nothing needed } + @Override + public String getDescription() { + return String.format("Provided installer %s", forgeInstaller.toString()); + } + private VersionPair extractVersion(Path forgeInstaller) throws IOException { final VersionPair fromVersionJson = IoStreams.readFileFromZip(forgeInstaller, "version.json",