xdotter 0.2.2

A simple dotfile manager - single binary, no dependencies
name: CI

on:
  push:
    branches: [main]
    tags: ['v*']
  pull_request:
    branches: [main]
  workflow_dispatch:

env:
  CARGO_TERM_COLOR: always

jobs:
  # ============================================================
  # Rust 检查/测试 (Linux/macOS/Windows)
  # ============================================================

  # --- Linux ---
  rust-check-linux:
    name: Rust Check (Linux)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2
      - run: cargo check --all-targets

  rust-clippy-linux:
    name: Rust Clippy (Linux)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy
      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2
      - run: cargo clippy --all-targets -- -D warnings

  rust-fmt-linux:
    name: Rust Format (Linux)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: rustfmt
      - run: cargo fmt --check

  rust-test-linux:
    name: Rust Unit Tests (Linux)
    needs: [rust-check-linux]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2
      - run: cargo test --no-fail-fast -- --test-threads=1

  rust-e2e-linux:
    name: Rust E2E Tests (Linux)
    needs: [rust-check-linux]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2
      - name: Build debug binary
        run: cargo build
      - name: Run E2E test suite
        run: bash scripts/test-rust.sh

  rust-binary-size-linux:
    name: Binary Size (Linux)
    needs: [rust-test-linux]
    if: startsWith(github.ref, 'refs/tags/')
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2
      - run: cargo build --release
      - name: Check binary size
        run: |
          size=$(stat -c%s target/release/xd)
          max_size=1048576
          echo "Binary size: $((size / 1024))KB"
          if [ $size -gt $max_size ]; then
            echo "::error::Binary too large: $size bytes (max: $max_size)"
            exit 1
          fi
          echo "✓ Binary size within limit ($((max_size / 1024))KB)"

  # --- macOS ---
  rust-check-macos:
    name: Rust Check (macOS)
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2
      - run: cargo check --all-targets

  rust-test-macos:
    name: Rust Unit Tests (macOS)
    needs: [rust-check-macos]
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2
      - run: cargo test --no-fail-fast -- --test-threads=1

  rust-e2e-macos:
    name: Rust E2E Tests (macOS)
    needs: [rust-check-macos]
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2
      - name: Build debug binary
        run: cargo build
      - name: Run E2E test suite
        run: bash scripts/test-rust.sh

  rust-binary-size-macos:
    name: Binary Size (macOS)
    needs: [rust-test-macos]
    if: startsWith(github.ref, 'refs/tags/')
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2
      - run: cargo build --release
      - name: Check binary size
        run: |
          size=$(stat -f%z target/release/xd)
          max_size=1048576
          echo "Binary size: $((size / 1024))KB"
          if [ $size -gt $max_size ]; then
            echo "::error::Binary too large: $size bytes (max: $max_size)"
            exit 1
          fi
          echo "✓ Binary size within limit ($((max_size / 1024))KB)"

  # --- Windows ---
  rust-check-windows:
    name: Rust Check (Windows)
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2
      - run: cargo check --all-targets

  rust-test-windows:
    name: Rust Unit Tests (Windows)
    needs: [rust-check-windows]
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2
      - run: cargo test --no-fail-fast -- --test-threads=1

  rust-build-windows:
    name: Rust Build (Windows)
    needs: [rust-check-windows]
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2
      - run: cargo build --release
      - name: Verify binary
        run: .\target\release\xd.exe version

  # ============================================================
  # 汇总状态
  # ============================================================

  summary:
    name: Summary
    if: always()
    needs:
      - rust-check-linux
      - rust-clippy-linux
      - rust-fmt-linux
      - rust-test-linux
      - rust-e2e-linux
      - rust-binary-size-linux
      - rust-check-macos
      - rust-test-macos
      - rust-e2e-macos
      - rust-binary-size-macos
      - rust-check-windows
      - rust-test-windows
      - rust-build-windows
    runs-on: ubuntu-latest
    steps:
      - name: Print results
        run: |
          echo "## Test Results" >> $GITHUB_STEP_SUMMARY
          echo "| Job | Status |" >> $GITHUB_STEP_SUMMARY
          echo "|-----|--------|" >> $GITHUB_STEP_SUMMARY
          for job in \
            rust-check-linux rust-clippy-linux rust-fmt-linux rust-test-linux rust-e2e-linux rust-binary-size-linux \
            rust-check-macos rust-test-macos rust-e2e-macos rust-binary-size-macos \
            rust-check-windows rust-test-windows rust-build-windows; do
            result="${{ needs[job].result }}"
            if [ -n "$result" ] && [ "$result" != "skipped" ]; then
              icon="✅"
              [ "$result" = "failure" ] && icon="❌"
              echo "| $job | $icon $result |" >> $GITHUB_STEP_SUMMARY
            else
              echo "| $job | ⏭️ skipped |" >> $GITHUB_STEP_SUMMARY
            fi
          done