mirror of
https://github.com/Sea-Haven-Industries/shoc-pr-review-runner.git
synced 2026-10-01 23:13:27 +00:00
63 lines
2.1 KiB
Bash
63 lines
2.1 KiB
Bash
|
|
#!/usr/bin/env bash
|
||
|
|
# Validate the workflow_dispatch inputs (spec §8.2) and normalize PR references.
|
||
|
|
#
|
||
|
|
# Reads: REVIEW_TYPE, FRONTEND_PR, BACKEND_PR, FRONTEND_REPO, BACKEND_REPO
|
||
|
|
# Writes: frontend_pr / backend_pr (numbers, empty when not in scope) to
|
||
|
|
# $GITHUB_OUTPUT when present, else stdout.
|
||
|
|
|
||
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
|
|
# shellcheck source=lib.sh
|
||
|
|
source "$SCRIPT_DIR/lib.sh"
|
||
|
|
|
||
|
|
require_env REVIEW_TYPE FRONTEND_REPO BACKEND_REPO
|
||
|
|
|
||
|
|
# normalize_pr <raw> <expected-repo> -> prints the PR number
|
||
|
|
# Accepts a bare number or a full PR URL. Rejects URLs pointing anywhere other
|
||
|
|
# than the expected repository.
|
||
|
|
normalize_pr() {
|
||
|
|
local raw="$1" repo="$2"
|
||
|
|
raw="$(printf '%s' "$raw" | tr -d '[:space:]')"
|
||
|
|
if [[ "$raw" =~ ^[0-9]+$ ]]; then
|
||
|
|
printf '%s' "$raw"
|
||
|
|
return 0
|
||
|
|
fi
|
||
|
|
if [[ "$raw" =~ ^https://github\.com/([^/]+/[^/]+)/pull/([0-9]+)(/.*)?$ ]]; then
|
||
|
|
local url_repo="${BASH_REMATCH[1]}" num="${BASH_REMATCH[2]}"
|
||
|
|
[ "$url_repo" = "$repo" ] || die "PR URL points at '$url_repo', expected '$repo'"
|
||
|
|
printf '%s' "$num"
|
||
|
|
return 0
|
||
|
|
fi
|
||
|
|
die "invalid PR reference '$raw' (expected a number or a $repo PR URL)"
|
||
|
|
}
|
||
|
|
|
||
|
|
frontend_pr=""
|
||
|
|
backend_pr=""
|
||
|
|
|
||
|
|
case "$REVIEW_TYPE" in
|
||
|
|
frontend)
|
||
|
|
[ -n "${FRONTEND_PR:-}" ] || die "review_type=frontend requires frontend_pr"
|
||
|
|
frontend_pr="$(normalize_pr "$FRONTEND_PR" "$FRONTEND_REPO")"
|
||
|
|
;;
|
||
|
|
backend)
|
||
|
|
[ -n "${BACKEND_PR:-}" ] || die "review_type=backend requires backend_pr"
|
||
|
|
backend_pr="$(normalize_pr "$BACKEND_PR" "$BACKEND_REPO")"
|
||
|
|
;;
|
||
|
|
paired)
|
||
|
|
[ -n "${FRONTEND_PR:-}" ] || die "review_type=paired requires frontend_pr"
|
||
|
|
[ -n "${BACKEND_PR:-}" ] || die "review_type=paired requires backend_pr"
|
||
|
|
frontend_pr="$(normalize_pr "$FRONTEND_PR" "$FRONTEND_REPO")"
|
||
|
|
backend_pr="$(normalize_pr "$BACKEND_PR" "$BACKEND_REPO")"
|
||
|
|
;;
|
||
|
|
*)
|
||
|
|
die "invalid review_type '$REVIEW_TYPE' (frontend|backend|paired)"
|
||
|
|
;;
|
||
|
|
esac
|
||
|
|
|
||
|
|
out="${GITHUB_OUTPUT:-/dev/stdout}"
|
||
|
|
{
|
||
|
|
printf 'frontend_pr=%s\n' "$frontend_pr"
|
||
|
|
printf 'backend_pr=%s\n' "$backend_pr"
|
||
|
|
} >>"$out"
|
||
|
|
|
||
|
|
log "inputs valid: review_type=$REVIEW_TYPE frontend_pr=${frontend_pr:-none} backend_pr=${backend_pr:-none}"
|