name: Lint

on:
  pull_request:
  push:
    branches:
      - nightly
      - main
      - release/*
  workflow_dispatch:

jobs:
  python-source-and-configs:
    uses: pytorch/test-infra/.github/workflows/linux_job.yml@main
    with:
      repository: pytorch/vision
      script: |
        set -euo pipefail

        echo '::group::Setup environment'
        CONDA_PATH=$(which conda)
        eval "$(${CONDA_PATH} shell.bash hook)"
        conda create --name ci --quiet --yes python=3.8 pip
        conda activate ci
        echo '::endgroup::'
        
        echo '::group::Install lint tools'
        pip install --progress-bar=off pre-commit
        echo '::endgroup::'
        
        echo '::group::Lint Python source and configs'
        set +e
        pre-commit run --all-files
        
        if [ $? -ne 0 ]; then
          git --no-pager diff
          exit 1
        fi
        echo '::endgroup::'

  c-source:
    uses: pytorch/test-infra/.github/workflows/linux_job.yml@main
    with:
      repository: pytorch/vision
      script: |
        set -euo pipefail
        
        echo '::group::Setup environment'
        CONDA_PATH=$(which conda)
        eval "$(${CONDA_PATH} shell.bash hook)"
        # clang-format needs some shared libraries that conflict with the system ones. Thus, we install them from conda
        # and prepend the libraries to linker path to prioritize them. `ncurses=5` is only available on the conda-forge
        # channel. Since we are not building or testing here, this is fine.
        conda create --name ci --quiet --yes -c conda-forge python=3.8 ncurses=5 libgcc
        conda activate ci
        export LD_LIBRARY_PATH="${CONDA_PREFIX}/lib:${LD_LIBRARY_PATH}"
        echo '::endgroup::'
        
        echo '::group::Install lint tools'
        curl https://oss-clang-format.s3.us-east-2.amazonaws.com/linux64/clang-format-linux64 -o ./clang-format
        chmod +x ./clang-format
        echo '::endgroup::'

        echo '::group::Lint C source'
        set +e
        ./.circleci/unittest/linux/scripts/run-clang-format.py -r torchvision/csrc --clang-format-executable ./clang-format
        
        if [ $? -ne 0 ]; then
          git --no-pager diff
          exit 1
        fi
        echo '::endgroup::'


  python-types:
    uses: pytorch/test-infra/.github/workflows/linux_job.yml@main
    with:
      repository: pytorch/vision
      script: |
        set -euo pipefail
        
        export PYTHON_VERSION=3.8
        export GPU_ARCH_TYPE=cpu
        export GPU_ARCH_VERSION=''

        ./.github/scripts/setup-env.sh
        
        CONDA_PATH=$(which conda)
        eval "$(${CONDA_PATH} shell.bash hook)"
        conda activate ci
        
        echo '::group::Install lint tools'
        pip install --progress-bar=off mypy
        echo '::endgroup::'
        
        echo '::group::Lint Python types'
        mypy --install-types --non-interactive --config-file mypy.ini
        echo '::endgroup::'

  bc:
    if: github.event.pull_request
    runs-on: ubuntu-latest
    steps:
      - name: Run BC Lint Action
        uses: pytorch/test-infra/.github/actions/bc-lint@main
        with:
          repo: ${{ github.event.pull_request.head.repo.full_name }}
          base_sha: ${{ github.event.pull_request.base.sha }}
          head_sha: ${{ github.event.pull_request.head.sha }}
