From 301ad93e2f21e0528172adfc3c6c90b870842f53 Mon Sep 17 00:00:00 2001
From: rmoff <robin@decodable.co>
Date: Wed, 2 Oct 2024 11:52:00 +0100
Subject: [PATCH] Catch Vale runtime errors properly

---
 lib/main.js | 13 +++++++++++--
 src/main.ts | 14 ++++++++++++--
 2 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/lib/main.js b/lib/main.js
index 35ccae93..3a67af43 100644
--- a/lib/main.js
+++ b/lib/main.js
@@ -48,7 +48,7 @@ function run(actionInput) {
         const workdir = core.getInput('workdir') || '.';
         const cwd = path.relative(process.env['GITHUB_WORKSPACE'] || process.cwd(), workdir);
         try {
-            const code = yield core.group('Running vale with reviewdog 🐶 ...', () => __awaiter(this, void 0, void 0, function* () {
+            const code = yield core.group('Running vale...', () => __awaiter(this, void 0, void 0, function* () {
                 // Vale output ...
                 const output = yield exec.getExecOutput(actionInput.exePath, actionInput.args, {
                     cwd,
@@ -58,8 +58,17 @@ function run(actionInput) {
                     }
                 });
                 const vale_code = output.exitCode;
+                'Vale return code: ${vale_code}';
+                // Check for fatal runtime errors only (exit code 2)
+                // These aren't linting errors, but ones that will come
+                // about from missing or bad configuration files, etc.
+                if (vale_code === 2) {
+                    core.setFailed(`Vale encountered a fatal error with status code: ${vale_code}`);
+                    return 2; // Exit the function early
+                }
                 const should_fail = core.getInput('fail_on_error');
                 // Pipe to reviewdog ...
+                core.info('Calling reviewdog 🐶');
                 process.env['REVIEWDOG_GITHUB_API_TOKEN'] = core.getInput('token');
                 return yield exec.exec(actionInput.reviewdogPath, [
                     '-f=rdjsonl',
@@ -75,7 +84,7 @@ function run(actionInput) {
                 });
             }));
             if (code !== 0) {
-                core.setFailed(`reviewdog exited with status code: ${code}`);
+                core.setFailed(`Vale and reviewdog exited with status code: ${code}`);
             }
         }
         catch (error) {
diff --git a/src/main.ts b/src/main.ts
index 73922cd8..adacc40d 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -21,7 +21,7 @@ export async function run(actionInput: input.Input): Promise<void> {
 
   try {
     const code = await core.group(
-      'Running vale with reviewdog 🐶 ...',
+      'Running vale...',
       async (): Promise<number> => {
         // Vale output ...
         const output = await exec.getExecOutput(
@@ -37,9 +37,19 @@ export async function run(actionInput: input.Input): Promise<void> {
         );
 
         const vale_code = output.exitCode;
+        'Vale return code: ${vale_code}'
+        // Check for fatal runtime errors only (exit code 2)
+        // These aren't linting errors, but ones that will come
+        // about from missing or bad configuration files, etc.
+        if (vale_code === 2) {
+          core.setFailed(`Vale encountered a fatal error with status code: ${vale_code}`);
+          return 2; // Exit the function early
+        }
+
         const should_fail = core.getInput('fail_on_error');
 
         // Pipe to reviewdog ...
+        core.info('Calling reviewdog 🐶');
         process.env['REVIEWDOG_GITHUB_API_TOKEN'] = core.getInput('token');
         return await exec.exec(
           actionInput.reviewdogPath,
@@ -62,7 +72,7 @@ export async function run(actionInput: input.Input): Promise<void> {
     );
 
     if (code !== 0) {
-      core.setFailed(`reviewdog exited with status code: ${code}`);
+      core.setFailed(`Vale and reviewdog exited with status code: ${code}`);
     }
   } catch (error) {
     if (error instanceof Error) {