From a99aded26d7b37418565942311e866ef398457b9 Mon Sep 17 00:00:00 2001 From: "jason.woltje" Date: Sat, 11 Jul 2026 09:23:46 +0000 Subject: [PATCH] fix(tools/git): -h/--help now exits 0 across 7 wrappers (#702) --- .../framework/tools/git/issue-assign.sh | 4 +- .../framework/tools/git/issue-create.sh | 4 +- .../mosaic/framework/tools/git/issue-list.sh | 4 +- .../framework/tools/git/milestone-create.sh | 4 +- .../mosaic/framework/tools/git/pr-create.sh | 4 +- .../mosaic/framework/tools/git/pr-list.sh | 4 +- .../mosaic/framework/tools/git/pr-merge.sh | 4 +- .../tools/git/test-help-exit-code.sh | 53 +++++++++++++++++++ 8 files changed, 67 insertions(+), 14 deletions(-) create mode 100755 packages/mosaic/framework/tools/git/test-help-exit-code.sh diff --git a/packages/mosaic/framework/tools/git/issue-assign.sh b/packages/mosaic/framework/tools/git/issue-assign.sh index 6151b0e..48d5c04 100755 --- a/packages/mosaic/framework/tools/git/issue-assign.sh +++ b/packages/mosaic/framework/tools/git/issue-assign.sh @@ -33,7 +33,7 @@ Examples: $(basename "$0") -i 42 -l "in-progress" -m "0.2.0" $(basename "$0") -i 42 -a @me EOF - exit 1 + exit "${1:-1}" } # Parse arguments @@ -60,7 +60,7 @@ while [[ $# -gt 0 ]]; do shift ;; -h|--help) - usage + usage 0 ;; *) echo "Unknown option: $1" >&2 diff --git a/packages/mosaic/framework/tools/git/issue-create.sh b/packages/mosaic/framework/tools/git/issue-create.sh index d516ed0..f92f976 100755 --- a/packages/mosaic/framework/tools/git/issue-create.sh +++ b/packages/mosaic/framework/tools/git/issue-create.sh @@ -72,7 +72,7 @@ Examples: $(basename "$0") -t "Fix login bug" -l "bug,priority-high" $(basename "$0") -t "Add dark mode" -b "Implement theme switching" -m "0.2.0" EOF - exit 1 + exit "${1:-1}" } # Parse arguments @@ -95,7 +95,7 @@ while [[ $# -gt 0 ]]; do shift 2 ;; -h|--help) - usage + usage 0 ;; *) echo "Unknown option: $1" >&2 diff --git a/packages/mosaic/framework/tools/git/issue-list.sh b/packages/mosaic/framework/tools/git/issue-list.sh index dd7b73d..b6f9bc1 100755 --- a/packages/mosaic/framework/tools/git/issue-list.sh +++ b/packages/mosaic/framework/tools/git/issue-list.sh @@ -36,7 +36,7 @@ Examples: $(basename "$0") -m "0.2.0" # Issues in milestone 0.2.0 $(basename "$0") --repo ddk/ai-bma # List issues from anywhere EOF - exit 1 + exit "${1:-1}" } # Parse arguments @@ -67,7 +67,7 @@ while [[ $# -gt 0 ]]; do shift 2 ;; -h|--help) - usage + usage 0 ;; *) echo "Unknown option: $1" >&2 diff --git a/packages/mosaic/framework/tools/git/milestone-create.sh b/packages/mosaic/framework/tools/git/milestone-create.sh index 8f5c371..72d8f29 100755 --- a/packages/mosaic/framework/tools/git/milestone-create.sh +++ b/packages/mosaic/framework/tools/git/milestone-create.sh @@ -37,7 +37,7 @@ Examples: $(basename "$0") -t "0.0.1" -d "Pre-MVP Foundation Sprint" $(basename "$0") -t "0.1.0" -d "MVP Release" --due "2025-03-01" EOF - exit 1 + exit "${1:-1}" } # Parse arguments @@ -60,7 +60,7 @@ while [[ $# -gt 0 ]]; do shift ;; -h|--help) - usage + usage 0 ;; *) echo "Unknown option: $1" >&2 diff --git a/packages/mosaic/framework/tools/git/pr-create.sh b/packages/mosaic/framework/tools/git/pr-create.sh index 60997e6..9560f1d 100755 --- a/packages/mosaic/framework/tools/git/pr-create.sh +++ b/packages/mosaic/framework/tools/git/pr-create.sh @@ -86,7 +86,7 @@ Examples: $(basename "$0") -i 42 -b "Implements the feature described in #42" $(basename "$0") -t "WIP: New feature" --draft EOF - exit 1 + exit "${1:-1}" } # Parse arguments @@ -125,7 +125,7 @@ while [[ $# -gt 0 ]]; do shift ;; -h|--help) - usage + usage 0 ;; *) echo "Unknown option: $1" >&2 diff --git a/packages/mosaic/framework/tools/git/pr-list.sh b/packages/mosaic/framework/tools/git/pr-list.sh index 0b923d2..de5c741 100755 --- a/packages/mosaic/framework/tools/git/pr-list.sh +++ b/packages/mosaic/framework/tools/git/pr-list.sh @@ -34,7 +34,7 @@ Examples: $(basename "$0") -s merged -a username # Merged PRs by user $(basename "$0") --repo ddk/ai-bma # List PRs from anywhere EOF - exit 1 + exit "${1:-1}" } # Parse arguments @@ -61,7 +61,7 @@ while [[ $# -gt 0 ]]; do shift 2 ;; -h|--help) - usage + usage 0 ;; *) echo "Unknown option: $1" >&2 diff --git a/packages/mosaic/framework/tools/git/pr-merge.sh b/packages/mosaic/framework/tools/git/pr-merge.sh index 96cb06f..222260c 100755 --- a/packages/mosaic/framework/tools/git/pr-merge.sh +++ b/packages/mosaic/framework/tools/git/pr-merge.sh @@ -35,7 +35,7 @@ Examples: $(basename "$0") -n 42 -d # Squash merge and delete branch $(basename "$0") -n 42 --skip-queue-guard # Skip queue guard wait EOF - exit 1 + exit "${1:-1}" } # Parse arguments @@ -63,7 +63,7 @@ while [[ $# -gt 0 ]]; do shift ;; -h|--help) - usage + usage 0 ;; *) echo "Unknown option: $1" >&2 diff --git a/packages/mosaic/framework/tools/git/test-help-exit-code.sh b/packages/mosaic/framework/tools/git/test-help-exit-code.sh new file mode 100755 index 0000000..e6e3483 --- /dev/null +++ b/packages/mosaic/framework/tools/git/test-help-exit-code.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env bash +# Regression harness for #701: -h/--help must exit 0, bad args must still exit nonzero. +# +# Covers the 7 wrappers whose usage() previously hard-coded `exit 1`, so every +# --help invocation exited nonzero and logged a phantom isError across fleet lanes. +# Asserts, per wrapper: +# 1. `--help` exits 0 and prints usage. +# 2. `-h` exits 0 and prints usage. +# 3. A genuine unknown flag still exits nonzero (usage() default path untouched). + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +WRAPPERS=( + issue-assign.sh + issue-create.sh + issue-list.sh + milestone-create.sh + pr-create.sh + pr-list.sh + pr-merge.sh +) + +fail=0 + +for wrapper in "${WRAPPERS[@]}"; do + path="$SCRIPT_DIR/$wrapper" + + if ! output=$(bash "$path" --help 2>&1); then + echo "FAIL: $wrapper --help exited nonzero" >&2 + fail=1 + elif [[ "$output" != Usage:* ]]; then + echo "FAIL: $wrapper --help did not print usage" >&2 + fail=1 + fi + + if ! bash "$path" -h >/dev/null 2>&1; then + echo "FAIL: $wrapper -h exited nonzero" >&2 + fail=1 + fi + + if bash "$path" --this-is-not-a-real-flag >/dev/null 2>&1; then + echo "FAIL: $wrapper accepted an unknown flag (should have exited nonzero)" >&2 + fail=1 + fi +done + +if [[ "$fail" -eq 0 ]]; then + echo "help-exit-code regression passed (7/7 wrappers)" +fi + +exit "$fail"