cargo-test-changed 0.1.1

A Cargo subcommand to run tests for changed crates and their dependents.
name: CI

permissions:
    contents: read

on:
    pull_request:
    push:
        branches:
            - master

env:
    RUST_BACKTRACE: 1
    CARGO_TERM_COLOR: always
    CLICOLOR: 1

concurrency:
    group: "${{ github.workflow }}-${{ github.ref }}"
    cancel-in-progress: true

jobs:
    ci:
        permissions:
            contents: none
        name: CI
        needs: [test, msrv, lockfile, docs, rustfmt, clippy]
        runs-on: ubuntu-latest
        if: "always()"
        steps:
            - name: Failed
              run: exit 1
              if: "contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') || contains(needs.*.result, 'skipped')"
    test:
        name: Test
        runs-on: ubuntu-latest
        steps:
            - name: Checkout repository
              uses: actions/checkout@v4
            - name: Install Rust
              uses: dtolnay/rust-toolchain@stable
              with:
                  toolchain: stable
            - uses: Swatinem/rust-cache@v2
            - uses: taiki-e/install-action@cargo-hack
            - name: Build
              run: cargo test --workspace --no-run
            - name: Test
              run: cargo hack test --feature-powerset --workspace
    msrv:
        name: "Check MSRV"
        runs-on: ubuntu-latest
        steps:
            - name: Checkout repository
              uses: actions/checkout@v4
            - name: Install Rust
              uses: dtolnay/rust-toolchain@stable
              with:
                  toolchain: stable
            - uses: Swatinem/rust-cache@v2
            - uses: taiki-e/install-action@cargo-hack
            - name: Default features
              run: cargo hack check --feature-powerset --locked --rust-version --ignore-private --workspace --all-targets
    lockfile:
        runs-on: ubuntu-latest
        steps:
            - name: Checkout repository
              uses: actions/checkout@v4
            - name: Install Rust
              uses: dtolnay/rust-toolchain@stable
              with:
                  toolchain: stable
            - uses: Swatinem/rust-cache@v2
            - name: "Is lockfile updated?"
              run: cargo update --workspace --locked
    docs:
        name: Docs
        runs-on: ubuntu-latest
        steps:
            - name: Checkout repository
              uses: actions/checkout@v4
            - name: Install Rust
              uses: dtolnay/rust-toolchain@stable
              with:
                  toolchain: stable
            - uses: Swatinem/rust-cache@v2
            - name: Check documentation
              env:
                  RUSTDOCFLAGS: -D warnings
              run: cargo doc --workspace --all-features --no-deps --document-private-items
    rustfmt:
        name: rustfmt
        runs-on: ubuntu-latest
        steps:
            - name: Checkout repository
              uses: actions/checkout@v4
            - name: Install Rust
              uses: dtolnay/rust-toolchain@stable
              with:
                  toolchain: stable
                  components: rustfmt
            - uses: Swatinem/rust-cache@v2
            - name: Check formatting
              run: cargo fmt --all -- --check
    clippy:
        name: clippy
        runs-on: ubuntu-latest
        steps:
            - name: Checkout repository
              uses: actions/checkout@v4
            - name: Install Rust
              uses: dtolnay/rust-toolchain@stable
              with:
                  toolchain: stable
                  components: clippy
            - uses: Swatinem/rust-cache@v2
            - name: Run clippy
              run: cargo clippy --workspace --all-features --all-targets -- -D warnings
    coverage:
        name: Coverage
        runs-on: ubuntu-latest
        steps:
            - name: Checkout repository
              uses: actions/checkout@v4
            - name: Install Rust
              uses: dtolnay/rust-toolchain@stable
              with:
                  toolchain: stable
            - uses: Swatinem/rust-cache@v2
            - name: Install cargo-tarpaulin
              run: cargo install cargo-tarpaulin
            - name: Gather coverage
              run: cargo tarpaulin --output-dir coverage --out lcov
            - name: Upload coverage to Codecov
              uses: codecov/codecov-action@v5
              with:
                  token: ${{ secrets.CODECOV_TOKEN }}
                  files: ./coverage/lcov.info
                  fail_ci_if_error: true