This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch vl
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 66c9376d8583b87d2a158851a1caf044d90a64e3
Author: Claus Ibsen <[email protected]>
AuthorDate: Tue Jan 6 11:34:50 2026 +0100

    CAMEL-22093: camel-jbang - version list to show when list was last updated
---
 .../jbang/core/commands/version/VersionList.java   | 105 ++++++++++++++++++++-
 1 file changed, 103 insertions(+), 2 deletions(-)

diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/version/VersionList.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/version/VersionList.java
index 45322a1620ad..ed595831bca1 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/version/VersionList.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/version/VersionList.java
@@ -16,12 +16,16 @@
  */
 package org.apache.camel.dsl.jbang.core.commands.version;
 
+import java.io.IOException;
 import java.io.LineNumberReader;
 import java.io.StringReader;
 import java.net.URI;
 import java.net.http.HttpClient;
 import java.net.http.HttpRequest;
 import java.net.http.HttpResponse;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
 import java.text.SimpleDateFormat;
 import java.time.Duration;
 import java.time.LocalDate;
@@ -41,6 +45,7 @@ import org.apache.camel.catalog.CamelCatalog;
 import org.apache.camel.catalog.DefaultCamelCatalog;
 import org.apache.camel.dsl.jbang.core.commands.CamelCommand;
 import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
+import org.apache.camel.dsl.jbang.core.common.CommandLineHelper;
 import org.apache.camel.dsl.jbang.core.common.RuntimeCompletionCandidates;
 import org.apache.camel.dsl.jbang.core.common.RuntimeType;
 import org.apache.camel.dsl.jbang.core.common.RuntimeTypeConverter;
@@ -51,6 +56,8 @@ import 
org.apache.camel.main.download.MavenDependencyDownloader;
 import org.apache.camel.tooling.maven.RepositoryResolver;
 import org.apache.camel.tooling.model.ReleaseModel;
 import org.apache.camel.util.StringHelper;
+import org.apache.camel.util.json.JsonArray;
+import org.apache.camel.util.json.JsonObject;
 import org.apache.camel.util.json.Jsoner;
 import picocli.CommandLine;
 
@@ -60,6 +67,8 @@ import static 
org.apache.camel.dsl.jbang.core.common.CamelCommandHelper.CAMEL_IN
                      sortOptions = false, showDefaultValues = true)
 public class VersionList extends CamelCommand {
 
+    private static final String VERSION_LIST_CHECKER = 
".camel-jbang-version-list.json";
+
     private static final String YYYY_MM_DD = "yyyy-MM-dd";
 
     private static final String GIT_CAMEL_URL
@@ -127,6 +136,10 @@ public class VersionList extends CamelCommand {
                         defaultValue = "false")
     boolean fresh;
 
+    @CommandLine.Option(names = { "--download" }, defaultValue = "true",
+                        description = "Whether to allow automatic downloading 
JAR dependencies (over the internet)")
+    boolean download = true;
+
     @CommandLine.Option(names = { "--json" }, description = "Output in JSON 
Format", defaultValue = "false")
     boolean jsonOutput;
 
@@ -154,7 +167,7 @@ public class VersionList extends CamelCommand {
 
         // only download if fresh, using a custom repo, or special runtime 
based
         List<String[]> versions = new ArrayList<>();
-        if (fresh || repositories != null || runtime != RuntimeType.main) {
+        if (download || fresh || repositories != null || runtime != 
RuntimeType.main) {
             downloadReleases(versions);
         }
 
@@ -203,6 +216,11 @@ public class VersionList extends CamelCommand {
             }
         }
 
+        JsonObject checker = loadCheckerFile();
+        if (fresh && download) {
+            checker = updateCheckerFile(checker, runtime.runtime(), 
repositories);
+        }
+
         if (jsonOutput) {
             printer().println(
                     Jsoner.serialize(
@@ -231,16 +249,99 @@ public class VersionList extends CamelCommand {
                             
.headerAlign(HorizontalAlign.CENTER).dataAlign(HorizontalAlign.RIGHT).with(this::eolDate),
                     new Column().header("DAYS").visible(days)
                             
.headerAlign(HorizontalAlign.CENTER).dataAlign(HorizontalAlign.RIGHT).with(this::daysAgo))));
+            String date = null;
+            if (checker != null) {
+                JsonArray arr = checker.getCollection("checker");
+                if (repositories == null) {
+                    repositories = "";
+                }
+                for (int i = 0; i < arr.size(); i++) {
+                    JsonObject e = arr.getMap(i);
+                    boolean match = 
e.getString("runtime").equals(runtime.runtime())
+                            && e.getStringOrDefault("repo", 
"").equals(repositories);
+                    if (match) {
+                        date = e.getString("lastUpdated");
+                        break;
+                    }
+                }
+            }
+            if (date != null) {
+                printer().println("Last updated: " + date + " (use --fresh to 
update list from internet)");
+            } else {
+                printer().println("Last updated: none (use --fresh to update 
list from internet)");
+            }
         }
 
         return 0;
     }
 
+    public static JsonObject updateCheckerFile(JsonObject root, String 
runtime, String repositories) {
+        if (repositories == null) {
+            repositories = "";
+        }
+        if (root == null) {
+            root = new JsonObject();
+        }
+        JsonArray arr = root.getCollection("checker");
+        if (arr == null) {
+            arr = new JsonArray();
+            root.put("checker", arr);
+        }
+
+        JsonObject target = null;
+        for (int i = 0; i < arr.size(); i++) {
+            JsonObject e = arr.getMap(i);
+            boolean match = e.getString("runtime").equals(runtime)
+                    && e.getStringOrDefault("repo", "").equals(repositories);
+            if (match) {
+                target = e;
+                break;
+            }
+        }
+        String today = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
+        if (target == null) {
+            target = new JsonObject();
+            target.put("runtime", runtime);
+            if (!repositories.isBlank()) {
+                target.put("repo", repositories);
+            }
+            arr.add(target);
+        }
+        target.put("lastUpdated", today);
+
+        String json = Jsoner.serialize(root);
+        try {
+            Path f = 
CommandLineHelper.getHomeDir().resolve(VERSION_LIST_CHECKER);
+            Files.writeString(f, json,
+                    StandardOpenOption.CREATE,
+                    StandardOpenOption.WRITE,
+                    StandardOpenOption.TRUNCATE_EXISTING);
+        } catch (IOException e) {
+            // ignore
+        }
+        return root;
+    }
+
+    static JsonObject loadCheckerFile() {
+        try {
+            Path f = 
CommandLineHelper.getHomeDir().resolve(VERSION_LIST_CHECKER);
+            if (Files.exists(f)) {
+                String json = Files.readString(f);
+                return (JsonObject) Jsoner.deserialize(json);
+            }
+        } catch (Exception e) {
+            // ignore
+        }
+
+        return null;
+    }
+
     protected Integer downloadReleases(List<String[]> answer) {
         KameletMain main = new KameletMain(CAMEL_INSTANCE_TYPE);
 
         try {
             main.setFresh(fresh);
+            main.setDownload(download);
             main.setRepositories(repositories);
             main.start();
 
@@ -317,7 +418,7 @@ public class VersionList extends CamelCommand {
                 // enrich with details from catalog (if we can find any)
                 String catalogVersion = RuntimeType.quarkus == runtime ? v[1] 
: v[0];
                 ReleaseModel rm = releases.stream().filter(r -> 
catalogVersion.equals(r.getVersion())).findFirst().orElse(null);
-                if (rm == null) {
+                if (download && rm == null) {
                     // unknown release but if it's an Apache Camel release we 
can grab from online
                     int dots = StringHelper.countChar(v[0], '.');
                     if (dots == 2) {

Reply via email to