name: Release

on:
  push:
    tags:
      - 'v*'

permissions:
  contents: write

jobs:
  verify:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
      - name: Verify Cargo.toml version matches tag
        run: |
          CARGO_VER="v$(grep '^version' Cargo.toml | head -1 | sed 's/.*"\(.*\)"/\1/')"
          if [ "$CARGO_VER" != "${{ github.ref_name }}" ]; then
            echo "::error::Cargo.toml says $CARGO_VER but tag is ${{ github.ref_name }}"
            exit 1
          fi
          echo "Version match: $CARGO_VER"

  # Tests run as a PARALLEL TRIPWIRE: they fail the run if they fail, but the
  # publish/release jobs do NOT `needs:` this job. The tag decision was already
  # gated by the local precommit (same Rust 1.86, same commit). Binary consumers
  # (freemkv/autorip/bdemu) git-tag-pin libfreemkv and therefore start building
  # the instant this tag exists — so this test job and the crates.io publish
  # below must NOT sit on their critical path.
  test:
    needs: verify
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
      - uses: dtolnay/rust-toolchain@1.86.0
      - uses: Swatinem/rust-cache@v2
      # libfreemkv is a library — Cargo.lock isn't tracked, so --locked
      # would always fail (no lockfile to lock against on a fresh runner).
      - run: cargo test

  # NOTE: there is no crates.io publish job. libfreemkv is git-tag-only
  # (`package.publish = false` — it git-deps the firmware crate freemkv-unlock,
  # which never ships to crates.io). Every consumer git-tag-pins libfreemkv via
  # a committed [patch.crates-io]; the git tag itself IS the release artifact.
  # A `cargo publish` here fails hard on `publish = false`, so it was removed.

  release:
    # Only needs `verify`; the GitHub Release can be cut as soon as the version
    # check passes, in parallel with test + publish.
    needs: verify
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
      - name: Create GitHub Release
        uses: softprops/action-gh-release@v2
        with:
          generate_release_notes: true
