name: CI

on:
  pull_request:
  merge_group:

env:
  SPACEDRIVE_CUSTOM_APT_FLAGS: --no-install-recommends

# Cancel previous runs of the same workflow on the same branch.
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  typescript:
    name: TypeScript
    runs-on: ubuntu-20.04
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Setup Node.js, pnpm and dependencies
        uses: ./.github/actions/setup-pnpm
        with:
          token: ${{ secrets.GITHUB_TOKEN }}

      - name: Perform typechecks
        run: pnpm typecheck

  eslint:
    name: ESLint
    runs-on: ubuntu-20.04
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Setup Node.js, pnpm and dependencies
        uses: ./.github/actions/setup-pnpm
        with:
          token: ${{ secrets.GITHUB_TOKEN }}

      - name: Perform linting
        run: pnpm lint

  rustfmt:
    name: Rust Formatting
    runs-on: ubuntu-20.04
    steps:
      - name: Maximize build space
        if: ${{ runner.os == 'Linux' }}
        uses: easimon/maximize-build-space@master
        with:
          swap-size-mb: 3072
          root-reserve-mb: 6144
          remove-dotnet: 'true'
          remove-codeql: 'true'
          remove-haskell: 'true'
          remove-docker-images: 'true'

      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Symlink target to C:\
        if: ${{ runner.os == 'Windows' }}
        shell: powershell
        run: |
          New-Item -ItemType Directory -Force -Path C:\spacedrive_target
          New-Item -Path target -ItemType Junction -Value C:\spacedrive_target

      - uses: dorny/paths-filter@v2
        id: filter
        with:
          filters: |
            changes:
              - 'apps/cli/*/**'
              - 'apps/desktop/crates/*/**'
              - 'apps/desktop/src-tauri/*/**'
              - 'apps/mobile/crates/*/**'
              - 'apps/server/*/**'
              - 'core/**'
              - 'crates/*/**'
              - 'extensions/*/**'
              - 'Cargo.toml'
              - 'Cargo.lock'

      - name: Setup Rust and Prisma
        if: steps.filter.outputs.changes == 'true'
        uses: ./.github/actions/setup-rust

      - name: Run rustfmt
        if: steps.filter.outputs.changes == 'true'
        run: cargo fmt --all -- --check

  clippy:
    name: Clippy (${{ matrix.platform }})
    runs-on: ${{ matrix.platform }}
    strategy:
      matrix:
        platform: [ubuntu-20.04, macos-latest, windows-latest]
    steps:
      - name: Maximize build space
        if: ${{ runner.os == 'Linux' }}
        uses: easimon/maximize-build-space@master
        with:
          swap-size-mb: 3072
          root-reserve-mb: 6144
          remove-dotnet: 'true'
          remove-codeql: 'true'
          remove-haskell: 'true'
          remove-docker-images: 'true'

      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Symlink target to C:\
        if: ${{ runner.os == 'Windows' }}
        shell: powershell
        run: |
          New-Item -ItemType Directory -Force -Path C:\spacedrive_target
          New-Item -Path target -ItemType Junction -Value C:\spacedrive_target

      - uses: dorny/paths-filter@v2
        id: filter
        with:
          filters: |
            changes:
              - 'apps/cli/*/**'
              - 'apps/desktop/crates/*/**'
              - 'apps/desktop/src-tauri/*/**'
              - 'apps/mobile/crates/*/**'
              - 'apps/server/*/**'
              - 'core/**'
              - 'crates/*/**'
              - 'extensions/*/**'
              - 'Cargo.toml'
              - 'Cargo.lock'

      - name: Setup System and Rust
        if: steps.filter.outputs.changes == 'true'
        uses: ./.github/actions/setup-system
        with:
          token: ${{ secrets.GITHUB_TOKEN }}

      - name: Run Clippy
        if: steps.filter.outputs.changes == 'true'
        uses: actions-rs/clippy-check@v1
        with:
          args: --workspace --all-features
          token: ${{ secrets.GITHUB_TOKEN }}

  # test:
  #   name: Test (${{ matrix.platform }})
  #   runs-on: ${{ matrix.platform }}
  #   strategy:
  #     matrix:
  #       platform: [ubuntu-20.04, macos-latest, windows-latest]
  #   steps:
  #     - name: Checkout repository
  #       uses: actions/checkout@v3
  #
  #     - name: Setup
  #       uses: ./.github/actions/setup
  #
  #     - name: Test
  #       run: cargo test --workspace --all-features
