iterator_ilp 2.2.0

Iterator extensions for instruction-parallel reductions
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 7/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. Lints do, but there's no OS-specific
  # code path in this crate and the std feature is a strict superset of what the
  # crate does when the feature is not enabled.
  #
  # 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

    strategy:
      matrix:
        features:
          - '""'
          - 'std'

    env:
      FEATURE_FLAGS: '--workspace --no-default-features --features=${{ matrix.features }}'

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

      - name: Install native dependencies
        uses: Eeems-Org/apt-cache-action@v1
        with:
          packages: libhwloc-dev libudev-dev

      - 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 code formatting
        run: cargo fmt --all --check

      - name: Render the docs
        run: cargo doc ${{ env.FEATURE_FLAGS }}

      - name: Check clippy lints
        run: cargo clippy ${{ env.FEATURE_FLAGS }} --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 compliance (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:
          feature-group: only-explicit-features
          features: ${{ matrix.features }}
          rust-toolchain: manual

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

    runs-on: ubuntu-latest

    strategy:
      matrix:
        features:
          - '""'
          - 'std'

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

      - name: Install native dependencies
        uses: Eeems-Org/apt-cache-action@v1
        with:
          packages: libhwloc-dev libudev-dev

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

      - name: Check semver compliance (scheduled version)
        uses: obi1kenobi/cargo-semver-checks-action@v2
        with:
          feature-group: only-explicit-features
          features: ${{ matrix.features }}
          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: ubuntu-latest

    needs: matrix_vars

    strategy:
      matrix:
        features:
          - ""
          - "--no-default-features"
        rust:
          - stable
          - ${{ needs.matrix_vars.outputs.MINIMAL_RUST }}

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

      - name: Install native dependencies
        uses: Eeems-Org/apt-cache-action@v1
        with:
          packages: libhwloc-dev libudev-dev

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

      - name: Run tests
        run: cargo test ${{ matrix.features }}

      - name: Check that benchmarks build
        run: cargo build --benches ${{ matrix.features }}


  # 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: ubuntu-latest

    needs: matrix_vars

    strategy:
      matrix:
        features:
          - ""
          - "--no-default-features"
        rust:
          - beta
          - nightly
          - ${{ needs.matrix_vars.outputs.MINIMAL_RUST }}

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

      - name: Install native dependencies
        uses: Eeems-Org/apt-cache-action@v1
        with:
          packages: libhwloc-dev libudev-dev

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

      - name: Run tests
        run: cargo test ${{ matrix.features }}

      - name: Check that benchmarks build
        run: cargo build --benches ${{ matrix.features }}