# The CI gate. Runs inside the prebuilt nix toolchain image (built + pushed by
# build-ci-image.yaml), so the pinned 1.95.0 toolchain is already warm — steps
# just enter the flake devShell and run cargo.
#
# Gate = fmt + clippy + test. The fmt gate (`cargo fmt --check`, stock defaults)
# was enabled once the tree was reformatted on main (ADR-ci-002 Amendment 1 /
# issue #35). The release job (static binary for D2) and the platform matrix
# layer on later, step by step.
#
# A separate, lightweight `manifests` job logic-tests the package-manifest
# render scripts (Scoop/Homebrew) used by publish.yaml — bash + node only, no
# toolchain — so a render regression surfaces on the breaking push rather than
# weeks later at the next manual publish dispatch (ADR-0056 Amendment 2).
name: ci
on:
  push:
    # Branch pushes only — a tag push hits the same commit the branch push
    # already gated, so `branches: ['**']` drops the redundant tag-triggered
    # run (the release workflow owns tags). Pushing commits + a tag together
    # still gates the commits via the branch push.
    branches: ['**']
    # Skip the gate for changes that can't affect clippy/test — docs, markdown,
    # and the website subproject (it has its own workflow, website.yaml, that
    # builds + publishes it). A push touching crate code *and* these still runs
    # (paths-ignore only skips when *all* changed files match).
    # Note: flake/toolchain changes are NOT ignored — they can shift the
    # toolchain and thus lint/test outcomes.
    paths-ignore:
      - 'docs/**'
      - '**/*.md'
      - 'website/**'
      - '.gitea/workflows/website.yaml'
  pull_request:
    paths-ignore:
      - 'docs/**'
      - '**/*.md'
      - 'website/**'
      - '.gitea/workflows/website.yaml'

jobs:
  gate:
    runs-on: ci-public
    # Public package → anonymous pull, no credentials needed.
    container:
      image: git.lazyeval.net/oli/rdbms-playground-ci:latest
    steps:
      - uses: actions/checkout@v4
      - name: fmt (check, stock defaults)
        run: nix develop -c cargo fmt --check
      - name: clippy (warnings denied)
        run: nix develop -c cargo clippy --all-targets -- -D warnings
      - name: test
        run: nix develop -c cargo test --no-fail-fast

  # Logic test for the package-manifest render scripts. Renders with DUMMY
  # inputs and validates the output — it never publishes or touches the lazyeval
  # repos (that is publish.yaml's manual job). Runs on the same image but skips
  # nix: it needs only bash + node, both in the base image.
  #
  # NOTE: the CI image has no ruby, so the script's `ruby -c` formula syntax
  # check is skipped here (it degrades gracefully); the Scoop JSON is still
  # validated with node and both manifests' fields are asserted. Full formula
  # syntax is checked dev-side (ruby present) on every pre-commit local run.
  manifests:
    runs-on: ci-public
    container:
      image: git.lazyeval.net/oli/rdbms-playground-ci:latest
    steps:
      - uses: actions/checkout@v4
      - name: render-script tests (Scoop + Homebrew)
        run: bash scripts/test-package-renders.sh
