rt-history 4.1.0

An RT-safe history log with error checking
Documentation
# There are two kinds of continuous integration jobs in this project:
#
# - Every code submission or master push passes continuous integration on the
#   minimal supported Rust version and the current stable Rust version.
# - Two times a month, a scheduled job makes sure that the code remains
#   compatible and lint-free on upcoming Rust toolchains (beta and nightly).

name: Continuous Integration
permissions:
  contents: read

on:
  push:
  pull_request:
  schedule:
    - cron: '0 0 9/15 * *'

# Cancel existing jobs on new pushes to the same branch
concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

env:
  CARGO_INCREMENTAL: 0
  RUSTFLAGS: -D warnings
  RUSTDOCFLAGS: -D warnings
  MINIMAL_RUST: 1.86.0  # Minimal Supported Rust Version

jobs:
  # Workaround for github CI dropping env var expansion in matrix strategy
  matrix_vars:
    runs-on: ubuntu-latest
    outputs:
      MINIMAL_RUST: ${{ env.MINIMAL_RUST }}
    steps:
      - name: Forward env var to output
        run: echo "MINIMAL_RUST=${{ env.MINIMAL_RUST }}" >> $GITHUB_OUTPUT


  # Format doesn't depend on configuration, and lints don't depend on the
  # operating system since there's no OS-specific code path in this crate.
  #
  # We don't care about warnings on the minimum supported Rust version, only
  # about building and running correctly.
  format-lints:
    # Don't run CI twice when a PR is created from a branch internal to the repo
    if: github.event_name == 'push' || github.event_name == 'schedule' || github.event.pull_request.head.repo.full_name != github.repository

    runs-on: ubuntu-latest

    steps:
      - name: Checkout sources
        uses: actions/checkout@v6

      - name: Set up stable toolchain
        if: github.event_name != 'schedule'
        uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          components: rustfmt,clippy

      - name: Set up nightly toolchain
        if: github.event_name == 'schedule'
        uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          toolchain: nightly
          components: rustfmt,clippy

      - name: Check format
        run: cargo fmt --all --check

      - name: Check clippy lints
        run: cargo clippy --workspace --all-targets -- -D warnings

      - name: Set up cargo-binstall
        run: curl -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash

      - name: Look for unused dependencies with cargo-machete
        run: |
          # FIXME: --force used as a workaround for https://github.com/Swatinem/rust-cache/issues/204
          cargo binstall -y --force cargo-machete
          cargo machete

      - name: Check semver (push/PR version)
        # Not guaranteed to run on nightly, so we use the separate job below
        if: github.event_name != 'schedule'
        uses: obi1kenobi/cargo-semver-checks-action@v2
        with:
          rust-toolchain: manual

  # Workaround for cargo-semver-checks not guaranteeing nightly support
  scheduled-semver-checks:
    if: github.event_name == 'schedule'

    runs-on: ubuntu-latest

    steps:
      - name: Checkout sources
        uses: actions/checkout@v6

      - name: Set up stable toolchain
        uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          components: rustfmt,clippy

      - name: Check semver (scheduled version)
        uses: obi1kenobi/cargo-semver-checks-action@v2
        with:
          rust-toolchain: manual


  # Run the tests on all supported OSes and Rust versions (main CI)
  test-contrib:
    # Don't run CI twice when a PR is created from a branch internal to the repo
    # Don't run in scheduled jobs, that's what test-scheduled is for
    if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository

    runs-on: ${{ matrix.os }}

    needs: matrix_vars

    strategy:
      matrix:
        os:
          - ubuntu-latest
          - windows-latest
          - macos-latest
        rust:
          - stable
          - ${{ needs.matrix_vars.outputs.MINIMAL_RUST }}

    steps:
      - name: Checkout sources
        uses: actions/checkout@v6

      - name: Set up toolchain
        uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          toolchain: ${{ matrix.rust }}

      - name: Run basic tests
        run: cargo test

      # FIXME: Disable concurrent testing as github runners don't have enough cores
      # - name: Run concurrent tests
      #   run: cargo test --release -- --ignored --nocapture --test-threads=1

      - name: Check that benchmarks build
        run: cargo build --benches


  # Check compatibility with newer Rust/deps versions (scheduled CI)
  #
  # FIXME: There should be a way to use conditional build matrices without
  #        duplicating the whole job recipe...
  #
  test-scheduled:
    if: github.event_name == 'schedule'

    runs-on: ${{ matrix.os }}

    needs: matrix_vars

    strategy:
      matrix:
        os:
          - ubuntu-latest
          - windows-latest
          - macos-latest
        rust:
          - beta
          - nightly
          - ${{ needs.matrix_vars.outputs.MINIMAL_RUST }}

    steps:
      - name: Checkout sources
        uses: actions/checkout@v6

      - name: Set up toolchain
        uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          toolchain: ${{ matrix.rust }}

      - name: Run basic tests
        run: cargo test

      # FIXME: Disable concurrent testing as github runners don't have enough cores
      # - name: Run concurrent tests
      #   run: cargo test --release -- --ignored --nocapture --test-threads=1

      - name: Check that benchmarks build
        run: cargo build --benches