#!/usr/bin/env bash # B1 (stack #1215, gate-merge-01): for a fork PR the merge queue guard must # read CI status against the BASE repository. Woodpecker posts statuses on the # base repo; pr-metadata's headRepository names the fork, and passing it to # ci-queue-wait yields statuses:null -> state=malformed rc=3 on every fork PR. # # This fixture omits baseRepository entirely (the pre-B1 normalizer's shape), # so the guard must fall back to the origin repo — and must NEVER see the fork. set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" WORK_DIR="${MOSAIC_TEST_WORK_DIR:-$PWD/.mosaic-test-work/pr-merge-fork-ci-status}" FIXTURE_DIR="$WORK_DIR/tools/git" CALL_LOG="$WORK_DIR/queue-call.log" rm -rf "$WORK_DIR" mkdir -p "$FIXTURE_DIR" cp "$SCRIPT_DIR/pr-merge.sh" "$FIXTURE_DIR/pr-merge.sh" cp "$SCRIPT_DIR/detect-platform.sh" "$FIXTURE_DIR/detect-platform.sh" cat > "$FIXTURE_DIR/pr-metadata.sh" <<'SH' #!/usr/bin/env bash printf '%s\n' '{"baseRefName":"next","headRefName":"fix/b1-fork-branch","headRefOid":"fedcba9876543210fedcba9876543210fedcba98","headRepository":"stack-mos-dt-0/stack"}' SH cat > "$FIXTURE_DIR/ci-queue-wait.sh" <<'SH' #!/usr/bin/env bash printf '%s\n' "$*" > "${MOSAIC_QUEUE_CALL_LOG:?}" exit 42 SH chmod +x "$FIXTURE_DIR"/*.sh # A git repo with an origin remote, so the origin fallback resolves. git init -q "$WORK_DIR/upstream" git -C "$WORK_DIR/upstream" remote add origin https://git.mosaicstack.dev/mosaicstack/stack.git set +e ( cd "$WORK_DIR/upstream" export MOSAIC_QUEUE_CALL_LOG="$CALL_LOG" "$FIXTURE_DIR/pr-merge.sh" -n 1215 ) >/dev/null 2>&1 rc=$? set -e if [[ "$rc" -ne 42 ]]; then echo "FAIL: expected queue stub rc=42 to propagate, got $rc" >&2 exit 1 fi if [[ ! -s "$CALL_LOG" ]]; then echo "FAIL: merge wrapper did not invoke the queue guard" >&2 exit 1 fi if grep -q -- '-R stack-mos-dt-0/stack' "$CALL_LOG"; then echo "FAIL: queue guard received the FORK repository for CI status (B1 regression)" >&2 cat "$CALL_LOG" >&2 exit 1 fi if ! grep -q -- '-R mosaicstack/stack' "$CALL_LOG"; then echo "FAIL: queue guard did not receive the base (origin) repository" >&2 cat "$CALL_LOG" >&2 exit 1 fi if ! grep -q -- '-B fix/b1-fork-branch' "$CALL_LOG"; then echo "FAIL: queue guard did not receive the PR head branch" >&2 cat "$CALL_LOG" >&2 exit 1 fi if ! grep -q -- '--sha fedcba9876543210fedcba9876543210fedcba98' "$CALL_LOG"; then echo "FAIL: queue guard did not receive the exact PR head SHA" >&2 cat "$CALL_LOG" >&2 exit 1 fi echo "pr-merge fork-PR CI-status repository regression passed"