on:
  pull_request:
  push:
    branches:
      - main

name: continuous-integration

env:
  NUSHELL_CARGO_PROFILE: ci
  NU_LOG_LEVEL: DEBUG
  # If changing these settings also change toolkit.nu
  CLIPPY_OPTIONS: "-D warnings -D clippy::unwrap_used"

concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref && github.ref || github.run_id }}
  cancel-in-progress: true

jobs:
  fmt-clippy:
    strategy:
      fail-fast: true
      matrix:
        # Pinning to Ubuntu 20.04 because building on newer Ubuntu versions causes linux-gnu
        # builds to link against a too-new-for-many-Linux-installs glibc version. Consider
        # revisiting this when 20.04 is closer to EOL (April 2025)
        platform: [windows-latest, macos-latest, ubuntu-20.04]
        feature: [default, dataframe]
        include:
          - feature: default
            flags: ""
          - feature: dataframe
            flags: "--features=dataframe"
        exclude:
          - platform: windows-latest
            feature: dataframe
          - platform: macos-latest
            feature: dataframe

    runs-on: ${{ matrix.platform }}

    steps:
      - uses: actions/checkout@v4.1.2

      - name: Setup Rust toolchain and cache
        uses: actions-rust-lang/setup-rust-toolchain@v1.8.0
        with:
          rustflags: ""

      - name: cargo fmt
        run: cargo fmt --all -- --check

        # If changing these settings also change toolkit.nu
      - name: Clippy
        run: cargo clippy --workspace ${{ matrix.flags }} --exclude nu_plugin_* -- $CLIPPY_OPTIONS

        # In tests we don't have to deny unwrap
      - name: Clippy of tests
        run: cargo clippy --tests --workspace ${{ matrix.flags }} --exclude nu_plugin_* -- -D warnings

      - name: Clippy of benchmarks
        run: cargo clippy --benches --workspace ${{ matrix.flags }} --exclude nu_plugin_* -- -D warnings

  tests:
    strategy:
      fail-fast: true
      matrix:
        platform: [windows-latest, macos-latest, ubuntu-20.04]
        feature: [default, dataframe]
        include:
          # linux CI cannot handle clipboard feature
          - default-flags: ""
          - platform:  ubuntu-20.04
            default-flags: "--no-default-features --features=default-no-clipboard"
          - feature: default
            flags: ""
          - feature: dataframe
            flags: "--features=dataframe"
        exclude:
          - platform: windows-latest
            feature: dataframe
          - platform: macos-latest
            feature: dataframe

    runs-on: ${{ matrix.platform }}

    steps:
      - uses: actions/checkout@v4.1.2

      - name: Setup Rust toolchain and cache
        uses: actions-rust-lang/setup-rust-toolchain@v1.8.0
        with:
          rustflags: ""

      - name: Tests
        run: cargo test --workspace --profile ci --exclude nu_plugin_* ${{ matrix.default-flags }} ${{ matrix.flags }}

      - name: Check for clean repo
        shell: bash
        run: |
          if [ -n "$(git status --porcelain)" ]; then
            echo "there are changes";
            git status --porcelain
            exit 1
          else
            echo "no changes in working directory";
          fi

  std-lib-and-python-virtualenv:
    strategy:
      fail-fast: true
      matrix:
        platform: [ubuntu-20.04, macos-latest, windows-latest]
        py:
          - py

    runs-on: ${{ matrix.platform }}

    steps:
      - uses: actions/checkout@v4.1.2

      - name: Setup Rust toolchain and cache
        uses: actions-rust-lang/setup-rust-toolchain@v1.8.0
        with:
          rustflags: ""

      - name: Install Nushell
        run: cargo install --path . --locked --no-default-features

      - name: Standard library tests
        run: nu -c 'use crates/nu-std/testing.nu; testing run-tests --path crates/nu-std'

      - name: Ensure that Cargo.toml MSRV and rust-toolchain.toml use the same version
        run: nu .github/workflows/check-msrv.nu

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.10"

      - name: Install virtualenv
        run: pip install virtualenv
        shell: bash

      - name: Test Nushell in virtualenv
        run: nu scripts/test_virtualenv.nu
        shell: bash

      - name: Check for clean repo
        shell: bash
        run: |
          if [ -n "$(git status --porcelain)" ]; then
            echo "there are changes";
            git status --porcelain
            exit 1
          else
            echo "no changes in working directory";
          fi

  plugins:
    strategy:
      fail-fast: true
      matrix:
        platform: [windows-latest, macos-latest, ubuntu-20.04]

    runs-on: ${{ matrix.platform }}

    steps:
      - uses: actions/checkout@v4.1.2

      - name: Setup Rust toolchain and cache
        uses: actions-rust-lang/setup-rust-toolchain@v1.8.0
        with:
          rustflags: ""

      - name: Clippy
        run: cargo clippy --package nu_plugin_* -- $CLIPPY_OPTIONS

      - name: Tests
        run: cargo test --profile ci --package nu_plugin_*

      - name: Check for clean repo
        shell: bash
        run: |
          if [ -n "$(git status --porcelain)" ]; then
            echo "there are changes";
            git status --porcelain
            exit 1
          else
            echo "no changes in working directory";
          fi
