#!/usr/bin/env bash
# The local check loop.
#
#   scripts/check                 fmt, clippy, then every test
#   scripts/check meeting::query  fmt, then only the tests matching the filters
#
# Tests run through cargo-nextest (.config/nextest.toml): each test is its own
# process, and one that hangs is killed and reported by name. Exit codes:
# 10 fmt, 11 clippy, 12 tests, 13 code-shape, 14 Nix pins. NEXTEST_PROFILE=ci
# selects CI's profile.
# Tests build with the `capture` feature, so the debug-only capture
# experiment's code (macOS) is tested too. `crates/capture` and
# `crates/capture-core` sit outside the workspace (Cargo.toml), so on macOS
# they are named to be linted and tested.
set -uo pipefail

cd "$(dirname "${BASH_SOURCE[0]}")/.."

packages=(--workspace)
if [[ "$(uname -s)" == Darwin ]]; then
    # zbus depends on the crates.io `hex`, so the root package is named with its
    # version. Not the full `cargo pkgid`: its path URL names this checkout,
    # which matches nothing once HiveMind runs cargo in a copy on another Mac.
    pkgid="$(cargo pkgid)"
    packages=(-p "hex@${pkgid##*[#@]}" -p scrawl-router -p scrawl-capture -p capture-core)
fi

stage() {
    printf '\n==> %s\n' "$1"
}

stage "fmt"
cargo fmt --all --check || exit 10

stage "code-shape"
python3 scripts/code-shape.py --check || exit 13

stage "nix pins"
python3 scripts/test-check-nix-git-pins.py || exit 14
python3 scripts/check-nix-git-pins.py || exit 14

if [[ $# -eq 0 ]]; then
    stage "clippy"
    cargo clippy --locked "${packages[@]}" --all-targets --features onnx-benchmark -- -D warnings || exit 11
fi

if command -v cargo-nextest >/dev/null 2>&1; then
    stage "test (nextest${1:+: $*})"
    cargo nextest run --locked "${packages[@]}" --no-tests=warn "$@" || exit 12
else
    stage "test (cargo test${1:+: $*})"
    echo "cargo-nextest is not installed, so a hung test stalls the run without" >&2
    echo "a name. Install it with: brew install cargo-nextest" >&2
    cargo test --locked "${packages[@]}" -- "$@" || exit 12
fi
