#!/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 -> 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}"