---   # rust-bitcoin CI: If you edit this file please update README.md
on:   # yamllint disable-line rule:truthy
  push:
    branches:
      - master
      - 'test-ci/**'
  pull_request:

name: Continuous integration

jobs:
  Prepare:
    runs-on: ubuntu-24.04
    outputs:
      nightly_version: ${{ steps.read_toolchain.outputs.nightly_version }}
    steps:
      - name: "Checkout repo"
        uses: actions/checkout@v4
      - name: "Read nightly version"
        id: read_toolchain
        run: echo "nightly_version=$(cat nightly-version)" >> $GITHUB_OUTPUT

  Stable:                       # 2 jobs, one per manifest.
    name: Test - stable toolchain
    runs-on: ubuntu-24.04
    strategy:
      fail-fast: false
      matrix:
        dep: [minimal, recent]
    steps:
      - name: "Checkout repo"
        uses: actions/checkout@v4
      - name: "Checkout maintainer tools"
        uses: actions/checkout@v4
        with:
          repository: rust-bitcoin/rust-bitcoin-maintainer-tools
          ref: c3324024ced9bb1eb854397686919c3ff7d97e1e
          path: maintainer-tools
      - name: "Select toolchain"
        uses: dtolnay/rust-toolchain@stable
      - name: "Set dependencies"
        run: cp Cargo-${{ matrix.dep }}.lock Cargo.lock
      - name: "Run test script"
        run: ./maintainer-tools/ci/run_task.sh stable

  Nightly:                      # 2 jobs, one per manifest.
    name: Test - nightly toolchain
    needs: Prepare
    runs-on: ubuntu-24.04
    strategy:
      fail-fast: false
      matrix:
        dep: [minimal, recent]
    steps:
      - name: "Checkout repo"
        uses: actions/checkout@v4
      - name: "Checkout maintainer tools"
        uses: actions/checkout@v4
        with:
          repository: rust-bitcoin/rust-bitcoin-maintainer-tools
          ref: c3324024ced9bb1eb854397686919c3ff7d97e1e
          path: maintainer-tools
      - name: "Select toolchain"
        uses: dtolnay/rust-toolchain@v1
        with:
          toolchain: ${{ needs.Prepare.outputs.nightly_version }}
      - name: "Set dependencies"
        run: cp Cargo-${{ matrix.dep }}.lock Cargo.lock
      - name: "Run test script"
        run: ./maintainer-tools/ci/run_task.sh nightly

  MSRV:                         # 2 jobs, one per manifest.
    name: Test - MSRV toolchain
    runs-on: ubuntu-24.04
    strategy:
      fail-fast: false
      matrix:
        dep: [minimal, recent]
    steps:
      - name: "Checkout repo"
        uses: actions/checkout@v4
      - name: "Checkout maintainer tools"
        uses: actions/checkout@v4
        with:
          repository: rust-bitcoin/rust-bitcoin-maintainer-tools
          ref: c3324024ced9bb1eb854397686919c3ff7d97e1e
          path: maintainer-tools
      - name: "Select toolchain"
        uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: "1.63.0"
      - name: "Set dependencies"
        run: cp Cargo-${{ matrix.dep }}.lock Cargo.lock
      - name: "Run test script"
        run: ./maintainer-tools/ci/run_task.sh msrv

  Lint:
    name: Lint - nightly toolchain
    needs: Prepare
    runs-on: ubuntu-24.04
    strategy:
      fail-fast: false
      matrix:
        dep: [recent]
    steps:
      - name: "Checkout repo"
        uses: actions/checkout@v4
      - name: "Checkout maintainer tools"
        uses: actions/checkout@v4
        with:
          repository: rust-bitcoin/rust-bitcoin-maintainer-tools
          ref: c3324024ced9bb1eb854397686919c3ff7d97e1e
          path: maintainer-tools
      - name: "Select toolchain"
        uses: dtolnay/rust-toolchain@v1
        with:
          toolchain: ${{ needs.Prepare.outputs.nightly_version }}
      - name: "Install clippy"
        run: rustup component add clippy
      - name: "Set dependencies"
        run: cp Cargo-${{ matrix.dep }}.lock Cargo.lock
      - name: "Run test script"
        run: ./maintainer-tools/ci/run_task.sh lint

  Docs:
    name: Docs - stable toolchain
    runs-on: ubuntu-24.04
    strategy:
      fail-fast: false
      matrix:
        dep: [recent]
    steps:
      - name: "Checkout repo"
        uses: actions/checkout@v4
      - name: "Checkout maintainer tools"
        uses: actions/checkout@v4
        with:
          repository: rust-bitcoin/rust-bitcoin-maintainer-tools
          ref: c3324024ced9bb1eb854397686919c3ff7d97e1e
          path: maintainer-tools
      - name: "Select toolchain"
        uses: dtolnay/rust-toolchain@stable
      - name: "Set dependencies"
        run: cp Cargo-${{ matrix.dep }}.lock Cargo.lock
      - name: "Run test script"
        run: ./maintainer-tools/ci/run_task.sh docs

  Docsrs:
    name: Docs - nightly toolchain
    needs: Prepare
    runs-on: ubuntu-24.04
    strategy:
      fail-fast: false
      matrix:
        dep: [recent]
    steps:
      - name: "Checkout repo"
        uses: actions/checkout@v4
      - name: "Checkout maintainer tools"
        uses: actions/checkout@v4
        with:
          repository: rust-bitcoin/rust-bitcoin-maintainer-tools
          ref: c3324024ced9bb1eb854397686919c3ff7d97e1e
          path: maintainer-tools
      - name: "Select toolchain"
        uses: dtolnay/rust-toolchain@v1
        with:
          toolchain: ${{ needs.Prepare.outputs.nightly_version }}
      - name: "Set dependencies"
        run: cp Cargo-${{ matrix.dep }}.lock Cargo.lock
      - name: "Run test script"
        run: ./maintainer-tools/ci/run_task.sh docsrs

  Bench:
    name: Bench - nightly toolchain
    needs: Prepare
    runs-on: ubuntu-24.04
    strategy:
      fail-fast: false
      matrix:
        dep: [recent]
    steps:
      - name: "Checkout repo"
        uses: actions/checkout@v4
      - name: "Checkout maintainer tools"
        uses: actions/checkout@v4
        with:
          repository: rust-bitcoin/rust-bitcoin-maintainer-tools
          ref: c3324024ced9bb1eb854397686919c3ff7d97e1e
          path: maintainer-tools
      - name: "Select toolchain"
        uses: dtolnay/rust-toolchain@v1
        with:
          toolchain: ${{ needs.Prepare.outputs.nightly_version }}
      - name: "Set dependencies"
        run: cp Cargo-${{ matrix.dep }}.lock Cargo.lock
      - name: "Run test script"
        run: ./maintainer-tools/ci/run_task.sh bench

  Arch32bit:
    name: Test 32-bit version
    runs-on: ubuntu-24.04
    steps:
      - name: "Checkout repo"
        uses: actions/checkout@v4
      - name: "Select toolchain"
        uses: dtolnay/rust-toolchain@stable
      - name: "Add architecture i386"
        run: sudo dpkg --add-architecture i386
      - name: "Install i686 gcc"
        run: sudo apt-get update -y && sudo apt-get install -y gcc-multilib
      - name: "Install target"
        run: rustup target add i686-unknown-linux-gnu
      - name: "Run test on i686"
        run: cargo test --target i686-unknown-linux-gnu

  Cross:
    name: Cross test - stable toolchain
    if: ${{ !github.event.act }}
    runs-on: ubuntu-24.04
    steps:
      - name: "Checkout repo"
        uses: actions/checkout@v4
      - name: "Select toolchain"
        uses: dtolnay/rust-toolchain@stable
      - name: "Install target"
        run: rustup target add s390x-unknown-linux-gnu
      - name: "Install cross"
        run: cargo install cross --locked
      - name: "Run cross test"
        run: cross test --target s390x-unknown-linux-gnu

  Embedded:
    name: Embedded - nightly toolchain
    needs: Prepare
    runs-on: ubuntu-24.04
    env:
      RUSTFLAGS: "-C link-arg=-Tlink.x"
      CARGO_TARGET_THUMBV7M_NONE_EABI_RUNNER: "qemu-system-arm -cpu cortex-m3 -machine mps2-an385 -nographic -semihosting-config enable=on,target=native -kernel"
    steps:
      - name: "Checkout repo"
        uses: actions/checkout@v4
      - name: "Set up QEMU"
        run: sudo apt update && sudo apt install -y qemu-system-arm gcc-arm-none-eabi
      - name: "Select toolchain"
        uses: dtolnay/rust-toolchain@v1
        with:
          toolchain: ${{ needs.Prepare.outputs.nightly_version }}
          targets: thumbv7m-none-eabi
      - name: "Install rust-src"
        run: rustup component add rust-src
      - name: "Run bitcoin/embedded"
        run: cd bitcoin/embedded && cargo run --target thumbv7m-none-eabi
      - name: "Run hashes/embedded no alloc"
        run: cd hashes/embedded && cargo run --target thumbv7m-none-eabi
      - name: "Run hashes/embedded with alloc and no hex"
        run: cd hashes/embedded && cargo run --target thumbv7m-none-eabi --features=alloc
      - name: "Run hashes/embedded with alloc and hex"
        run: cd hashes/embedded && cargo run --target thumbv7m-none-eabi --features=alloc,hex

  ASAN:                         # hashes crate only.
    name: ASAN - nightly toolchain
    needs: Prepare
    runs-on: ubuntu-24.04
    strategy:
      fail-fast: false
      matrix:
        dep: [recent]
    steps:
      - name: "Checkout repo"
        uses: actions/checkout@v4
      - name: "Select toolchain"
        uses: dtolnay/rust-toolchain@v1
        with:
          toolchain: ${{ needs.Prepare.outputs.nightly_version }}
      - name: "Install rust-src"
        run: rustup component add rust-src
      - name: "Set dependencies"
        run: cp Cargo-${{ matrix.dep }}.lock Cargo.lock
      - name: "Run sanitizer script"
        run: cd ./hashes && ./contrib/sanitizer.sh

  WASM:                         # hashes crate only.
    name: WASM - stable toolchain
    runs-on: ubuntu-24.04
    strategy:
      fail-fast: false
      # Note we do not use the recent lock file for wasm testing.
    steps:
      - name: "Checkout repo"
        uses: actions/checkout@v4
      - name: "Select toolchain"
        uses: dtolnay/rust-toolchain@stable
      - name: "Run wasm script"
        run: cd hashes && ./contrib/wasm.sh

  Kani:
    name: Kani codegen - stable toolchain
    runs-on: ubuntu-24.04
    steps:
      - name: "Checkout repo"
        uses: actions/checkout@v4
      - name: "Build Kani proofs"
        uses: model-checking/kani-github-action@v1.1
        with:
          args: "--only-codegen"
