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

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


The following commit(s) were added to refs/heads/main by this push:
     new 55aef62e0131 CAMEL-26931: camel-jbang - a file that does not exist 
exits 66 in camel export, camel dependency and camel transform route (#29941)
55aef62e0131 is described below

commit 55aef62e01314ee7633a5fad9f4247c43e01b6fc
Author: Claus Ibsen <[email protected]>
AuthorDate: Sat Nov 14 19:30:26 2026 +0100

    CAMEL-26931: camel-jbang - a file that does not exist exits 66 in camel 
export, camel dependency and camel transform route (#29941)
    
    camel export and camel dependency list, copy and sbom printed 'Path does 
not exist' on stdout
    and exited 1, and camel transform route exited 1 without naming the file 
(except with
    --format=java). They exit 66 with the message on stderr, as camel run.
    
    Co-Authored-By: Claude Opus 5.5 <[email protected]>
---
 .../ROOT/pages/camel-4x-upgrade-guide-4_24.adoc    |  5 +++--
 .../dsl/jbang/core/commands/TransformRoute.java    |  8 ++++++++
 .../jbang/core/commands/TransformRouteTest.java    | 24 +++++++++++-----------
 .../commands/kubernetes/KubernetesRunTest.java     |  4 +++-
 .../dsl/jbang/run/export/ProjectExporter.java      |  6 ++++--
 .../dsl/jbang/run/export/ProjectExporterTest.java  |  7 +++++--
 6 files changed, 35 insertions(+), 19 deletions(-)

diff --git 
a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc 
b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc
index 11304a49a80c..92eaa8b11639 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc
@@ -2798,8 +2798,9 @@ A script that checks the exit code of a command must take 
these changes into acc
   `--brief` or `--description`, as the text output: these options were ignored 
with `--json`. A filter that matches no
   route exits with `3` instead of `0` with all the routes.
 * A file or directory that does not exist exits with `66` instead of `1`: a 
source file or `--source-dir` of
-  `camel run`, the route file of `camel explain` and `camel harden` (checked 
before the LLM is contacted), and the
-  `pom.xml` of `camel dependency runtime`.
+  `camel run`, the route file of `camel explain` and `camel harden` (checked 
before the LLM is contacted), the
+  `pom.xml` of `camel dependency runtime`, a file of `camel export`, `camel 
kubernetes run` and `camel dependency list`, `copy` and `sbom`
+  (whose "Path does not exist" is now on stderr), and a file of `camel 
transform route`, which now names it.
 * A name that does not exist exits with `3` instead of `1`: the Kamelet of 
`camel init --from-kamelet`, the service of
   `camel infra run`, the key of `camel config get`, the name given to `camel 
doc`, and the plugin of
   `camel plugin delete`.
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformRoute.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformRoute.java
index 9007c4785b10..de3be039f90c 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformRoute.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformRoute.java
@@ -38,6 +38,7 @@ import 
org.apache.camel.dsl.jbang.core.common.CommandLineHelper;
 import org.apache.camel.dsl.jbang.core.common.CompletionCandidates;
 import org.apache.camel.dsl.jbang.run.common.CamelJBangConstants;
 import org.apache.camel.main.KameletMain;
+import org.apache.camel.support.ResourceHelper;
 import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.StopWatch;
 
@@ -114,6 +115,13 @@ public class TransformRoute extends CamelCommand {
         if (!"xml".equals(format) && !"yaml".equals(format) && 
!"java".equals(format)) {
             throw CliException.usage("--format must be xml, yaml or java, was: 
" + format);
         }
+        for (String file : files) {
+            // the file it cannot find by its name: it exited 1 without saying 
which file, except for --format=java
+            // (CAMEL-26931)
+            if (!ResourceHelper.hasScheme(file) && !file.startsWith("github:") 
&& !Files.exists(Path.of(file))) {
+                throw CliException.fileNotFound("File does not exist: " + 
file);
+            }
+        }
         if ("java".equals(format)) {
             return transformToJava();
         }
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/TransformRouteTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/TransformRouteTest.java
index 54aa9bb0f516..5d76b0704a88 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/TransformRouteTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/TransformRouteTest.java
@@ -17,22 +17,21 @@
 package org.apache.camel.dsl.jbang.core.commands;
 
 import java.nio.file.Files;
-import java.nio.file.NoSuchFileException;
 import java.nio.file.Path;
 import java.util.Arrays;
 import java.util.List;
 
-import 
org.apache.camel.dsl.jbang.core.commands.exceptionhandler.CliExecutionExceptionHandler;
 import org.apache.camel.dsl.jbang.core.common.CliException;
 import org.apache.camel.dsl.jbang.core.common.CliExitCode;
 import org.apache.camel.dsl.jbang.core.common.CommandLineTestHelper;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.io.TempDir;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.assertj.core.api.Assertions.catchThrowable;
 
 /**
  * camel transform route: a route in another DSL, printed or written to a file 
or directory.
@@ -124,16 +123,17 @@ class TransformRouteTest extends 
CamelCommandBaseTestSupport {
                 .hasMessage("--format must be xml, yaml or java, was: json");
     }
 
-    @Test
-    void aFileThatDoesNotExistIsNotFound() {
-        TransformRoute command = 
command(List.of(dir.resolve("nope.camel.yaml").toString()), "--format=java");
-
-        Throwable e = catchThrowable(command::doCall);
+    @ParameterizedTest
+    @ValueSource(strings = { "--format=java", "--format=xml", "--format=yaml" 
})
+    void aFileThatDoesNotExistIsNotFound(String format) {
+        // for xml and yaml it exited 1 without saying which file (CAMEL-26931)
+        String file = dir.resolve("nope.camel.yaml").toString();
+        TransformRoute command = command(List.of(file), format);
 
-        assertThat(e).isInstanceOf(NoSuchFileException.class);
-        // which the CLI ends with exit code 66
-        assertThat(new CliExecutionExceptionHandler(new 
CamelJBangMain()).getExitCode(e))
-                .isEqualTo(CliExitCode.FILE_NOT_FOUND);
+        assertThatThrownBy(command::doCall)
+                .isInstanceOfSatisfying(CliException.class,
+                        e -> 
assertThat(e.getExitCode()).isEqualTo(CliExitCode.FILE_NOT_FOUND))
+                .hasMessage("File does not exist: " + file);
     }
 
     @Test
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRunTest.java
 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRunTest.java
index 572a504b621a..f614356670d7 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRunTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRunTest.java
@@ -75,9 +75,11 @@ class KubernetesRunTest extends KubernetesBaseTestSupport {
                 "--disable-auto=true", "--output=yaml", "--runtime=" + 
rt.runtime(), "--java-version=21");
         int exit = command.doCall();
 
-        Assertions.assertEquals(1, exit);
+        // a file that does not exist, as camel export and camel run say it 
(CAMEL-26931)
+        Assertions.assertEquals(66, exit);
 
         Assertions.assertTrue(printer.getOutput().contains("ERROR: Project 
export failed!"));
+        Assertions.assertTrue(printer.getStderr().contains("Path does not 
exist: mickey-mouse.groovy"), printer.getStderr());
     }
 
     @Test
diff --git 
a/dsl/camel-jbang/camel-jbang-run/src/main/java/org/apache/camel/dsl/jbang/run/export/ProjectExporter.java
 
b/dsl/camel-jbang/camel-jbang-run/src/main/java/org/apache/camel/dsl/jbang/run/export/ProjectExporter.java
index 17ec601ece7b..1bd51b2222cd 100644
--- 
a/dsl/camel-jbang/camel-jbang-run/src/main/java/org/apache/camel/dsl/jbang/run/export/ProjectExporter.java
+++ 
b/dsl/camel-jbang/camel-jbang-run/src/main/java/org/apache/camel/dsl/jbang/run/export/ProjectExporter.java
@@ -23,6 +23,7 @@ import java.nio.file.Paths;
 import java.util.List;
 import java.util.Properties;
 
+import org.apache.camel.dsl.jbang.run.RunPipeline;
 import org.apache.camel.dsl.jbang.run.common.CamelJBangConstants;
 import org.apache.camel.dsl.jbang.run.common.ExportHelper;
 import org.apache.camel.dsl.jbang.run.common.MavenResolver;
@@ -173,8 +174,9 @@ public class ProjectExporter {
         try {
             verifyExportFiles(request.files);
         } catch (FileNotFoundException ex) {
-            printer().println(ex.getMessage());
-            return 1;
+            // as camel run: on stderr, and exit 66; it was on stdout, with 
exit 1 (CAMEL-26931)
+            printer().printErr(ex.getMessage());
+            return RunPipeline.FILE_NOT_FOUND;
         }
 
         ExportRequest copy = new ExportRequest(request);
diff --git 
a/dsl/camel-jbang/camel-jbang-run/src/test/java/org/apache/camel/dsl/jbang/run/export/ProjectExporterTest.java
 
b/dsl/camel-jbang/camel-jbang-run/src/test/java/org/apache/camel/dsl/jbang/run/export/ProjectExporterTest.java
index 796f798f2e9a..65379af23339 100644
--- 
a/dsl/camel-jbang/camel-jbang-run/src/test/java/org/apache/camel/dsl/jbang/run/export/ProjectExporterTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-run/src/test/java/org/apache/camel/dsl/jbang/run/export/ProjectExporterTest.java
@@ -35,6 +35,7 @@ import java.util.stream.Stream;
 
 import javax.xml.xpath.XPathFactory;
 
+import org.apache.camel.dsl.jbang.run.RunPipeline;
 import org.apache.camel.dsl.jbang.run.common.CamelHome;
 import org.apache.camel.dsl.jbang.run.common.ExportHelper;
 import org.apache.camel.dsl.jbang.run.common.MavenResolver;
@@ -465,8 +466,10 @@ class ProjectExporterTest {
         int exit = new ProjectExporter(new 
ExportContext().withPrinter(printer).withDependencyResolver(resolver))
                 .export(request);
 
-        assertThat(exit).isEqualTo(1);
-        assertThat(printer.getOutput()).contains("Path does not exist");
+        // as camel run: exit 66 and the message on stderr; it was 1 on stdout 
(CAMEL-26931)
+        assertThat(exit).isEqualTo(RunPipeline.FILE_NOT_FOUND);
+        assertThat(printer.getStderr()).contains("Path does not exist");
+        assertThat(printer.getStdout()).isEmpty();
         assertThat(resolved).isEmpty();
     }
 

Reply via email to