on:
  merge_group:
  pull_request:
    types: [opened, synchronize, reopened, ready_for_review]
    paths-ignore:
      - 'docs/**'
      - 'config/**'
      - '**.md'
      - '.dockerignore'
      - 'docker/**'
      - '.gitignore'
  push:
    branches:
      - develop
      - main
    paths-ignore:
      - 'docs/**'
      - 'config/**'
      - '**.md'
      - '.dockerignore'
      - 'docker/**'
      - '.gitignore'
  workflow_dispatch:

name: CI

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

env:
  RUST_TOOLCHAIN: nightly-2023-10-21

jobs:
  typos:
    name: Spell Check with Typos
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v3
      - uses: crate-ci/typos@v1.13.10

  check:
    name: Check
    if: github.event.pull_request.draft == false
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ windows-latest-8-cores, ubuntu-20.04 ]
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v3
      - uses: arduino/setup-protoc@v1
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ env.RUST_TOOLCHAIN }}
      - name: Rust Cache
        uses: Swatinem/rust-cache@v2
      - name: Run cargo check
        run: cargo check --locked --workspace --all-targets

  toml:
    name: Toml Check
    if: github.event.pull_request.draft == false
    runs-on: ubuntu-20.04
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v3
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: stable
      - name: Rust Cache
        uses: Swatinem/rust-cache@v2
      - name: Install taplo
        run: cargo +stable install taplo-cli --version ^0.8 --locked
      - name: Run taplo
        run: taplo format --check

  sqlness:
    name: Sqlness Test
    if: github.event.pull_request.draft == false
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ ubuntu-20.04-8-cores ]
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v3
      - uses: arduino/setup-protoc@v1
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ env.RUST_TOOLCHAIN }}
      - name: Rust Cache
        uses: Swatinem/rust-cache@v2
      - name: Run sqlness
        run: cargo sqlness
      - name: Upload sqlness logs
        if: always()
        uses: actions/upload-artifact@v3
        with:
          name: sqlness-logs
          path: ${{ runner.temp }}/greptime-*.log
          retention-days: 3

  fmt:
    name: Rustfmt
    if: github.event.pull_request.draft == false
    runs-on: ubuntu-20.04
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v3
      - uses: arduino/setup-protoc@v1
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ env.RUST_TOOLCHAIN }}
          components: rustfmt
      - name: Rust Cache
        uses: Swatinem/rust-cache@v2
      - name: Run cargo fmt
        run: cargo fmt --all -- --check

  clippy:
    name: Clippy
    if: github.event.pull_request.draft == false
    runs-on: ubuntu-20.04
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v3
      - uses: arduino/setup-protoc@v1
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ env.RUST_TOOLCHAIN }}
          components: clippy
      - name: Rust Cache
        uses: Swatinem/rust-cache@v2
      - name: Run cargo clippy
        run: cargo clippy --workspace --all-targets -- -D warnings

  coverage:
    if: github.event.pull_request.draft == false
    runs-on: ubuntu-20.04-8-cores
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v3
      - uses: arduino/setup-protoc@v1
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
      - uses: KyleMayes/install-llvm-action@v1
        with:
          version: "14.0"
      - name: Install toolchain
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ env.RUST_TOOLCHAIN }}
          components: llvm-tools-preview
      - name: Rust Cache
        uses: Swatinem/rust-cache@v2
      - name: Install latest nextest release
        uses: taiki-e/install-action@nextest
      - name: Install cargo-llvm-cov
        uses: taiki-e/install-action@cargo-llvm-cov
      - name: Install Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.10'
      - name: Install PyArrow Package
        run: pip install pyarrow
      - name: Setup etcd server
        working-directory: tests-integration/fixtures/etcd
        run: docker compose -f docker-compose-standalone.yml up -d --wait
      - name: Run nextest cases
        run: cargo llvm-cov nextest --workspace --lcov --output-path lcov.info -F pyo3_backend -F dashboard
        env:
          CARGO_BUILD_RUSTFLAGS: "-C link-arg=-fuse-ld=lld"
          RUST_BACKTRACE: 1
          CARGO_INCREMENTAL: 0
          GT_S3_BUCKET: ${{ secrets.S3_BUCKET }}
          GT_S3_ACCESS_KEY_ID: ${{ secrets.S3_ACCESS_KEY_ID }}
          GT_S3_ACCESS_KEY: ${{ secrets.S3_ACCESS_KEY }}
          GT_S3_REGION: ${{ secrets.S3_REGION }}
          GT_ETCD_ENDPOINTS: http://127.0.0.1:2379
          UNITTEST_LOG_DIR: "__unittest_logs"
      - name: Codecov upload
        uses: codecov/codecov-action@v2
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          files: ./lcov.info
          flags: rust
          fail_ci_if_error: false
          verbose: true
