diff --git a/packages/core/src/shell/is-transient-command-failure.test.ts b/packages/core/src/shell/is-transient-command-failure.test.ts index e22ec0f2..a9820238 100644 --- a/packages/core/src/shell/is-transient-command-failure.test.ts +++ b/packages/core/src/shell/is-transient-command-failure.test.ts @@ -15,6 +15,12 @@ describe("isTransientCommandFailure", () => { expect(isTransientCommandFailure("503 Service Unavailable")).toBe(true); }); + it("should_return_false_when_status_code_is_part_of_a_larger_number", () => { + expect(isTransientCommandFailure("port 4290 is already in use")).toBe(false); + expect(isTransientCommandFailure("test 5030 failed")).toBe(false); + expect(isTransientCommandFailure("build 5023 failed")).toBe(false); + }); + it("should_return_true_when_log_contains_connection_reset", () => { expect(isTransientCommandFailure("ECONNRESET")).toBe(true); }); diff --git a/packages/core/src/shell/is-transient-command-failure.ts b/packages/core/src/shell/is-transient-command-failure.ts index 3ba34de9..9d537a9e 100644 --- a/packages/core/src/shell/is-transient-command-failure.ts +++ b/packages/core/src/shell/is-transient-command-failure.ts @@ -16,7 +16,7 @@ export const NO_RETRY_ERROR_CODES: ReadonlySet = new Set ]); const TRANSIENT_COMMAND_FAILURE_PATTERN = - /timeout|i\/o timeout|econnreset|connection reset|503|502|429|rate limit|temporar|bad gateway|fetch failed|network error|unavailable|tx_?bad_?seq|bad sequence|bad seq/i; + /timeout|i\/o timeout|econnreset|connection reset|\b503\b|\b502\b|\b429\b|rate limit|temporar|bad gateway|fetch failed|network error|unavailable|tx_?bad_?seq|bad sequence|bad seq/i; /** * Decides retryability from raw log text — captured CLI output, as passed by the