#!/usr/bin/env bash set -euo pipefail # Silence git's "default branch name" hints emitted on every `git init` in # tests that create temp repos. Sets init.defaultBranch=master via env so we # don't have to touch the user's real git config. export GIT_CONFIG_COUNT=1 export GIT_CONFIG_KEY_0=init.defaultBranch export GIT_CONFIG_VALUE_0=master SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" # Ordered fail-fast: cheapest deterministic checks first, slowest builds and # test suites last. `set -euo pipefail` aborts at the first failure, so a fmt # or clippy drift never wastes time on a frontend build or a multi-minute # test run. echo "=== Checking Rust formatting ===" if cargo fmt --version &>/dev/null; then cargo fmt --manifest-path "$PROJECT_ROOT/Cargo.toml" --all --check else echo "Skipping Rust formatting check (rustfmt not installed)" fi echo "=== Checking for duplicate module files (X.rs and X/mod.rs coexisting) ===" _dup_found=0 while IFS= read -r -d '' _mod_file; do _dir=$(dirname "$_mod_file") _parent=$(dirname "$_dir") _name=$(basename "$_dir") _flat="$_parent/$_name.rs" if [ -f "$_flat" ]; then echo "ERROR [E0761]: duplicate module file — both files exist in the same source tree:" echo " $_flat" echo " $_mod_file" echo " Fix: git rm $_flat in the same commit that introduces $_mod_file" _dup_found=1 fi done < <(find "$PROJECT_ROOT/server" "$PROJECT_ROOT/source-map-gen" \ -path "*/target" -prune -o -name "mod.rs" -print0 2>/dev/null) if [ "$_dup_found" -eq 1 ]; then echo "FAIL: duplicate module files detected — remove the flat .rs file with git rm before committing." exit 1 fi echo "=== Running cargo clippy ===" cargo clippy --manifest-path "$PROJECT_ROOT/Cargo.toml" --all-targets --all-features -- -D warnings echo "=== Checking doc coverage on changed files ===" cargo run --manifest-path "$PROJECT_ROOT/Cargo.toml" -p source-map-gen --bin source-map-check --quiet -- --worktree "$PROJECT_ROOT" --base master echo "=== Building frontend ===" if [ -d "$PROJECT_ROOT/frontend" ]; then cd "$PROJECT_ROOT/frontend" # The merge gate runs in workspaces whose pre-existing `node_modules` was # populated by an earlier `npm install --omit=dev` (or a partial install). # In that state `npm install` reports "up to date, audited N packages" # without actually adding the missing devDependencies, so the subsequent # `tsc && vite build` fails with `sh: 1: tsc: not found`. # # Repair the install when typescript isn't reachable (story 1086 merge gate # regression). We probe the on-disk binary rather than relying on PATH so # this also covers the case where `node_modules/.bin/` is missing. if [ ! -x node_modules/typescript/bin/tsc ]; then echo "[script/test] node_modules missing typescript; performing clean install." rm -rf node_modules npm install --include=dev else npm install --include=dev fi npm run build cd "$PROJECT_ROOT" else echo "Skipping frontend build (no frontend directory)" fi echo "=== Running Rust tests ===" cargo test --manifest-path "$PROJECT_ROOT/Cargo.toml" --bin huskies cargo test --manifest-path "$PROJECT_ROOT/Cargo.toml" -p source-map-gen echo "=== Running frontend unit tests ===" if [ -d "$PROJECT_ROOT/frontend" ]; then cd "$PROJECT_ROOT/frontend" npm test else echo "Skipping frontend tests (no frontend directory)" fi # Disabled: e2e tests may be causing merge pipeline hangs (no running server # in merge workspace → Playwright blocks indefinitely). Re-enable once confirmed. # Disabled: e2e tests cause merge pipeline hangs (no running server # in merge workspace → Playwright blocks indefinitely). # echo "=== Running e2e tests ===" # npm run test:e2e