name: Benchmarks

# spell-checker:ignore (people) dtolnay Swatinem taiki-e
# spell-checker:ignore (misc) codspeed sccache

on:
  pull_request:
  push:
    branches:
      - '*'

permissions:
  contents: read # to fetch code (actions/checkout)

# End the current execution if there is a new changeset in the PR.
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}

jobs:
  benchmarks:
    name: Run ${{ matrix.type }} benchmarks for ${{ matrix.package }} (CodSpeed)
    runs-on: ubuntu-latest
    env:
      CARGO_INCREMENTAL: 0
    strategy:
      matrix:
        type: [simulation, memory]
        package: [
          uu_base64,
          uu_cksum,
          uu_cp,
          uu_cut,
          uu_dd,
          uu_df,
          uu_du,
          uu_expand,
          uu_fold,
          uu_hostname,
          uu_join,
          uu_ls,
          uu_mv,
          uu_nl,
          uu_numfmt,
          uu_rm,
          uu_seq,
          uu_shuf,
          uu_sort,
          uu_split,
          uu_tsort,
          uu_unexpand,
          uu_uniq,
          uu_wc,
          uu_factor,
          uu_date,
          uu_csplit,
          uu_true,
          uu_false
        ]
    steps:
      - uses: actions/checkout@v6
        with:
          persist-credentials: false

      - uses: dtolnay/rust-toolchain@stable

      - uses: Swatinem/rust-cache@v2

      - name: Run sccache-cache
        id: sccache-setup
        uses: mozilla-actions/sccache-action@v0.0.9
        continue-on-error: true
      - name: Export sccache
        if: steps.sccache-setup.outcome == 'success'
        run: |
          echo "RUSTC_WRAPPER=sccache" >> $GITHUB_ENV
          echo "SCCACHE_GHA_ENABLED=true" >> $GITHUB_ENV

      - name: Install locales
        shell: bash
        run: |
          sudo locale-gen fr_FR.UTF-8
          sudo update-locale

      - name: Install tools
        uses: taiki-e/install-action@v2
        with:
          tool: cargo-codspeed

      - name: Build benchmarks for ${{ matrix.package }} (${{ matrix.type }})
        shell: bash
        run: |
          echo "Building ${{ matrix.type }} benchmarks for ${{ matrix.package }}"
          cargo codspeed build -m ${{ matrix.type }} -p ${{ matrix.package }}

      - name: Run ${{ matrix.type }} benchmarks for ${{ matrix.package }}
        uses: CodSpeedHQ/action@v4
        env:
          CODSPEED_LOG: debug
        with:
          mode: ${{ matrix.type }}
          run: |
            echo "Running ${{ matrix.type }} benchmarks for ${{ matrix.package }}"
            cargo codspeed run -p ${{ matrix.package }} > /dev/null
          token: ${{ secrets.CODSPEED_TOKEN }}
