conserve 24.8.0

A robust backup tool.
Documentation
name: Rust

on:
  push:
    branches:
      - main
  pull_request:
    paths:
      - Cargo.*
      - .cargo/**
      - .github/workflows/rust.yml
      - src/**
      - tests/**
      - testdata/**

# see https://matklad.github.io/2021/09/04/fast-rust-builds.html
env:
  CARGO_TERM_COLOR: always
  CARGO_INCREMENTAL: 0
  CARGO_NET_RETRY: 10
  CI: 1
  RUST_BACKTRACE: short
  RUSTFLAGS: "-W rust-2021-compatibility"
  RUSTUP_MAX_RETRIES: 10

# TODO: Add -D warnings when that's clean on Windows.

jobs:
  tests:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: true
      matrix:
        os: [ubuntu-latest, windows-latest, macOS-latest]
        features: ["", "s3"]
        version: [stable, nightly, "1.74"]

    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.version }}
      - uses: Swatinem/rust-cache@v2
        with:
          key: ${{ matrix.features }}
      - name: Show version
        run: |
          rustup show
          cargo --version
          rustc --version
      - name: Build
        run: >
          cargo build --all-targets --no-default-features --features=${{
          matrix.features }} --features fail/failpoints
      - name: Test
        run: >
          cargo test --no-default-features --features=${{ matrix.features }}
          --features fail/failpoints -- --include-ignored

  # Run rustfmt separately so that it does not block test results
  rustfmt:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: stable
          components: rustfmt
      - uses: Swatinem/rust-cache@v2
      - name: rustfmt check
        run: cargo fmt --all -- --check

  # S3 integration tests can't run from CI because they need credentials, but we
  # can at least make sure that they compile.
  build-large-tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: stable
      - uses: swatinem/rust-cache@v2
      - name: cargo build
        run: cargo build --all-targets --features s3,s3-integration-test

  clippy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: stable
      - uses: swatinem/rust-cache@v2
      - name: clippy
        run: cargo clippy --all-targets -- --deny clippy::all

  # Not all features can be run: s3 integration tests require credentials.
  # But all of them should compile.
  check-all-features:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: stable
      - uses: swatinem/rust-cache@v2
      - name: clippy
        run: cargo clippy --all-targets --all-features -- --deny clippy::all

  pr-mutants:
    runs-on: ubuntu-latest
    if: github.event_name == 'pull_request'
    needs: [tests]
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Relative diff
        run: |
          git branch -av
          git diff origin/${{ github.base_ref }}.. | tee git.diff
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: beta
      - uses: Swatinem/rust-cache@v2
      - uses: taiki-e/install-action@v2
        name: Install cargo-mutants using install-action
        with:
          tool: cargo-mutants
      - name: Mutants in diff
        run: >
          cargo mutants --no-shuffle -vV --in-diff git.diff -- --features
          fail/failpoints
      - name: Archive mutants.out
        uses: actions/upload-artifact@v3
        if: always()
        with:
          name: mutants-incremental.out
          path: mutants.out