From 49727a5641877efe8061f3ef00724b48a675098b Mon Sep 17 00:00:00 2001 From: Maik Marschner Date: Wed, 31 Dec 2025 01:08:41 +0100 Subject: [PATCH 1/2] Add a new launcher cli option to select the version to launch and move the release channel into a distinct option. --- .../llbit/chunky/launcher/ChunkyLauncher.java | 50 ++++++++++++++++--- .../llbit/chunky/launcher/UpdateChecker.java | 40 ++++++++++++--- 2 files changed, 75 insertions(+), 15 deletions(-) diff --git a/launcher/src/se/llbit/chunky/launcher/ChunkyLauncher.java b/launcher/src/se/llbit/chunky/launcher/ChunkyLauncher.java index 8d0f4cbf32..caa34584a9 100644 --- a/launcher/src/se/llbit/chunky/launcher/ChunkyLauncher.java +++ b/launcher/src/se/llbit/chunky/launcher/ChunkyLauncher.java @@ -32,6 +32,7 @@ import java.net.*; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; +import java.util.List; import java.util.Scanner; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicReference; @@ -89,9 +90,30 @@ public static Options cliOptionsPublic() { options.addOption(Option.builder() .longOpt("update") + .desc("Update Chunky to the latest release") + .build() + ); + + options.addOption(Option.builder() + .longOpt("releaseChannel") .argName("release channel") .optionalArg(true) - .desc("Update Chunky to the latest release") + .desc("Specify the release channel (for use with --update and --chunkyVersion latest)") + .build() + ); + + options.addOption(Option.builder() + .longOpt("updateSite") + .argName("update site") + .desc("Update site to use for updating") + .build() + ); + + options.addOption(Option.builder() + .longOpt("chunkyVersion") + .argName("chunky version") + .numberOfArgs(1) + .desc("Chunky version to launch (latest for the latest installed version of the specified release channel)") .build() ); @@ -197,15 +219,21 @@ public static void main(String[] args) throws FileNotFoundException { settings.forceGuiConsole = true; } - if (cmd.hasOption("update")) { - ReleaseChannel channel = settings.selectedChannel; + if (cmd.hasOption("updateSite")) { + settings.updateSite = cmd.getOptionValue("updateSite"); + reloadReleaseChannels(settings); + return; + } - String selected = cmd.getOptionValue("update"); + if (cmd.hasOption("releaseChannel")) { + String selected = cmd.getOptionValue("releaseChannel"); if (selected != null) { - channel = settings.releaseChannels.getOrDefault(selected, channel); + settings.selectedChannel = settings.releaseChannels.getOrDefault(selected, settings.selectedChannel); } + } - headlessUpdateChunky(settings, channel); + if (cmd.hasOption("update")) { + headlessUpdateChunky(settings, settings.selectedChannel); return; } @@ -245,6 +273,14 @@ public static void main(String[] args) throws FileNotFoundException { LauncherSettings.disableLibraryValidation = true; } + if (cmd.hasOption("chunkyVersion")) { + settings.version = cmd.getOptionValue("chunkyVersion"); + if ("latest".equals(cmd.getOptionValue("chunkyVersion"))) { + List versions = new UpdateChecker(settings, settings.selectedChannel).getVersions(); + settings.version = versions.stream().findAny().map(version -> version.name).orElse(settings.version); + } + } + headlessOptions = String.join(" ", cmd.getArgList()); if (forceLauncher) { @@ -330,7 +366,7 @@ public static void main(String[] args) throws FileNotFoundException { } e.printStackTrace(System.err); } catch (ParseException e) { - System.out.println(e.getMessage()); + System.out.println(e.getMessage()); } } diff --git a/launcher/src/se/llbit/chunky/launcher/UpdateChecker.java b/launcher/src/se/llbit/chunky/launcher/UpdateChecker.java index e6584aa6fe..fa6d9f81f4 100644 --- a/launcher/src/se/llbit/chunky/launcher/UpdateChecker.java +++ b/launcher/src/se/llbit/chunky/launcher/UpdateChecker.java @@ -17,18 +17,19 @@ */ package se.llbit.chunky.launcher; +import se.llbit.json.JsonParser; +import se.llbit.json.JsonParser.SyntaxError; + import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; +import java.util.Collections; import java.util.Iterator; import java.util.LinkedList; import java.util.List; -import se.llbit.json.JsonParser; -import se.llbit.json.JsonParser.SyntaxError; - /** * Check for update and run update dialog (or just update in headless mode). * @@ -37,12 +38,31 @@ public class UpdateChecker extends Thread { private final LauncherSettings settings; private final UpdateListener listener; - private final String path; + private final ReleaseChannel channel; public UpdateChecker(LauncherSettings settings, ReleaseChannel channel, UpdateListener listener) { this.settings = settings; this.listener = listener; - this.path = channel.path; + this.channel = channel; + } + + public UpdateChecker(LauncherSettings settings, ReleaseChannel channel) { + this(settings, channel, new UpdateListener() { + @Override + public void updateError(String message) { + // ignore + } + + @Override + public void updateAvailable(VersionInfo latest) { + // ignore + } + + @Override + public void noUpdateAvailable() { + // ignore + } + }); } @Override @@ -58,9 +78,7 @@ public void run() { } private boolean tryUpdate() { - List candidates = new LinkedList<>(); - - getVersion(candidates, settings.getResourceUrl(path)); + List candidates = getVersions(); // Filter out corrupt versions. Iterator iter = candidates.iterator(); @@ -98,6 +116,12 @@ private boolean tryUpdate() { return true; } + public List getVersions() { + List candidates = new LinkedList<>(); + getVersion(candidates, settings.getResourceUrl(channel.path)); + return Collections.unmodifiableList(candidates); + } + private void getVersion(List candidates, String url) { try { URL latestJson = new URL(url); From 766312d3751a43f141b81ea2b2bf0c032e4e648d Mon Sep 17 00:00:00 2001 From: Maik Marschner Date: Wed, 31 Dec 2025 02:02:18 +0100 Subject: [PATCH 2/2] Add subcommands for setup and update, do not exit after updating when launching with --update, bump the copyright year in the launcher. --- .../llbit/chunky/launcher/ChunkyLauncher.java | 21 +++++++++---------- lib/src/se/llbit/chunky/HelpCopyright.java | 2 +- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/launcher/src/se/llbit/chunky/launcher/ChunkyLauncher.java b/launcher/src/se/llbit/chunky/launcher/ChunkyLauncher.java index caa34584a9..f217c083ac 100644 --- a/launcher/src/se/llbit/chunky/launcher/ChunkyLauncher.java +++ b/launcher/src/se/llbit/chunky/launcher/ChunkyLauncher.java @@ -117,12 +117,6 @@ public static Options cliOptionsPublic() { .build() ); - options.addOption(Option.builder() - .longOpt("setup") - .desc("Runs the interactive command-line launcher setup") - .build() - ); - options.addOption(Option.builder() .longOpt("javaOptions") .hasArg(true) @@ -190,7 +184,10 @@ public static void main(String[] args) throws FileNotFoundException { CommandLine cmd = parseCli(args); if (cmd.hasOption("help")) { - String header = CliUtil.makeHelpHeader("Chunky Launcher", LAUNCHER_VERSION.toString(), ""); + String header = CliUtil.makeHelpHeader("Chunky Launcher", LAUNCHER_VERSION.toString(), "Commands:\n" + + " setup Runs the interactive command-line launcher setup\n" + + " update Download the latest version\n" + + " (none) Launch the latest version\n\nOptions:"); String footer = "\n" + "Command line options after -- are passed to Chunky.\n" + "For Chunky's command line help, run:\n" + @@ -198,7 +195,7 @@ public static void main(String[] args) throws FileNotFoundException { HelpFormatter help = new HelpFormatter(); help.setWidth(CliUtil.CLI_WIDTH); - help.printHelp("java -jar ChunkyLauncher.jar", header, cliOptionsPublic(), footer); + help.printHelp("java -jar ChunkyLauncher.jar [command] ", header, cliOptionsPublic(), footer); return; } @@ -232,12 +229,14 @@ public static void main(String[] args) throws FileNotFoundException { } } - if (cmd.hasOption("update")) { + if (cmd.hasOption("update") || args[0].equals("update")) { headlessUpdateChunky(settings, settings.selectedChannel); - return; + if (args[0].equals("update")) { + return; + } } - if (cmd.hasOption("setup")) { + if (args[0].equals("setup")) { doSetup(settings); settings.save(); return; diff --git a/lib/src/se/llbit/chunky/HelpCopyright.java b/lib/src/se/llbit/chunky/HelpCopyright.java index 2dd70a6e7d..154a87b050 100644 --- a/lib/src/se/llbit/chunky/HelpCopyright.java +++ b/lib/src/se/llbit/chunky/HelpCopyright.java @@ -22,7 +22,7 @@ * This contains the proper copyright information for various messages */ public class HelpCopyright { - public static final String COPYRIGHT_LINE = "Copyright (c) 2010-2024 Jesper Öqvist and Chunky Contributors"; + public static final String COPYRIGHT_LINE = "Copyright (c) 2010-2026 Jesper Öqvist and Chunky Contributors"; public static final String COPYRIGHT_DISCLAIMER = "Chunky comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it " +