

























@@ -0,0 +1,188 @@
1+#!/usr/bin/env bash
2+set -euo pipefail
3+4+usage() {
5+ cat <<'EOF'
6+Usage: codex-review [options]
7+8+Options:
9+ --mode auto|local|branch Target selection. Default: auto.
10+ --base REF Base ref for branch review. Default: PR base or origin/main.
11+ --codex-bin PATH Codex binary. Default: codex.
12+ --output FILE Also save output to file.
13+ --parallel-tests CMD Run review and test command concurrently.
14+ --dry-run Print selected commands, do not run.
15+ -h, --help Show help.
16+17+Modes:
18+ local codex review --uncommitted
19+ branch codex review --base <base>
20+ auto dirty tree -> local, else PR/current branch -> branch
21+EOF
22+}
23+24+mode=auto
25+base_ref=
26+codex_bin=${CODEX_BIN:-codex}
27+output=${CODEX_REVIEW_OUTPUT:-}
28+parallel_tests=
29+dry_run=false
30+31+while [[ $# -gt 0 ]]; do
32+case "$1" in
33+ --mode)
34+ mode=${2:-}
35+shift 2
36+ ;;
37+ --base)
38+ base_ref=${2:-}
39+shift 2
40+ ;;
41+ --codex-bin)
42+ codex_bin=${2:-}
43+shift 2
44+ ;;
45+ --output)
46+ output=${2:-}
47+shift 2
48+ ;;
49+ --parallel-tests)
50+ parallel_tests=${2:-}
51+shift 2
52+ ;;
53+ --dry-run)
54+ dry_run=true
55+shift
56+ ;;
57+ -h|--help)
58+ usage
59+exit 0
60+ ;;
61+*)
62+ usage >&2
63+exit 2
64+ ;;
65+esac
66+done
67+68+case "$mode" in
69+ auto|local|branch) ;;
70+*)
71+echo "invalid --mode: $mode" >&2
72+exit 2
73+ ;;
74+esac
75+76+git rev-parse --show-toplevel >/dev/null
77+78+current_branch=$(git branch --show-current 2>/dev/null || true)
79+dirty=false
80+if [[ -n "$(git status --porcelain)" ]]; then
81+ dirty=true
82+fi
83+84+pr_url=
85+if [[ -z "$base_ref" && "$mode" != local ]] && command -v gh >/dev/null 2>&1; then
86+if pr_lines=$(gh pr view --json baseRefName,url --jq '[.baseRefName, .url] | @tsv' 2>/dev/null); then
87+ base_name=${pr_lines%%$'\t'*}
88+ pr_url=${pr_lines#*$'\t'}
89+if [[ -n "$base_name" ]]; then
90+ base_ref="origin/$base_name"
91+fi
92+fi
93+fi
94+95+if [[ -z "$base_ref" ]]; then
96+ base_ref=origin/main
97+fi
98+99+review_kind=
100+if [[ "$mode" == local || ( "$mode" == auto && "$dirty" == true ) ]]; then
101+ review_kind=local
102+elif [[ "$mode" == branch || ( "$mode" == auto && -n "$current_branch" && "$current_branch" != "main" ) ]]; then
103+ review_kind=branch
104+else
105+echo "no review target: clean main checkout and no forced mode" >&2
106+exit 1
107+fi
108+109+if [[ "$review_kind" == local ]]; then
110+ review_cmd=("$codex_bin" review --uncommitted)
111+else
112+ review_cmd=("$codex_bin" review --base "$base_ref")
113+fi
114+115+printf 'codex-review target: %s\n' "$review_kind"
116+printf 'branch: %s\n' "${current_branch:-detached}"
117+if [[ -n "$pr_url" ]]; then
118+printf 'pr: %s\n' "$pr_url"
119+fi
120+printf 'review:'
121+printf ' %q' "${review_cmd[@]}"
122+printf '\n'
123+if [[ -n "$parallel_tests" ]]; then
124+printf 'tests: %s\n' "$parallel_tests"
125+fi
126+if [[ "$review_kind" == branch ]]; then
127+printf 'fetch: git fetch origin --quiet\n'
128+fi
129+if [[ -n "$output" ]]; then
130+printf 'output: %s\n' "$output"
131+fi
132+133+if [[ "$dry_run" == true ]]; then
134+exit 0
135+fi
136+137+if [[ "$review_kind" == branch ]]; then
138+ git fetch origin --quiet || {
139+echo "warning: git fetch origin failed; reviewing with existing refs" >&2
140+ }
141+fi
142+143+run_review() {
144+if [[ -n "$output" ]]; then
145+ mkdir -p "$(dirname "$output")"
146+"${review_cmd[@]}" 2>&1 | tee "$output"
147+else
148+"${review_cmd[@]}"
149+fi
150+}
151+152+if [[ -z "$parallel_tests" ]]; then
153+ run_review
154+exit $?
155+fi
156+157+review_status_file=$(mktemp)
158+tests_status_file=$(mktemp)
159+160+(
161+set +e
162+ run_review
163+ status=$?
164+printf '%s\n' "$status" > "$review_status_file"
165+) &
166+review_pid=$!
167+168+(
169+set +e
170+ bash -lc "$parallel_tests"
171+ status=$?
172+printf '%s\n' "$status" > "$tests_status_file"
173+) &
174+tests_pid=$!
175+176+wait "$review_pid" || true
177+wait "$tests_pid" || true
178+179+review_status=$(cat "$review_status_file")
180+tests_status=$(cat "$tests_status_file")
181+rm -f "$review_status_file" "$tests_status_file"
182+183+printf 'codex-review exit: %s\n' "$review_status"
184+printf 'tests exit: %s\n' "$tests_status"
185+186+if [[ "$review_status" != 0 || "$tests_status" != 0 ]]; then
187+exit 1
188+fi
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。