name: Linters

on:
  pull_request:
  # Build when a pull request targets main
    branches:
      - main

permissions:
  contents: read

jobs:
  linter:
    name: Lint checks
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v4
        name: Checkout the repository
        with:
          fetch-depth: 100
          persist-credentials: true
      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.10'
      - name: Check example keywords
        run: python3 doc/example-keywords.py compare
      - name: Get changed C++ files
        if: success() || failure()
        id: changed-cxx-files
        uses: tj-actions/changed-files@ed68ef82c095e0d48ec87eccea555d944a631a4c # v46.0.5
        with:
          files: |
            **.h
            **.cpp
      # Comment blocks starting with "/*!" do not support autobrief
      - name: Check for problematic Doxygen comment blocks
        if: (success() || failure()) && steps.changed-cxx-files.outputs.any_changed == 'true'
        run: |
          RETCODE=0
          for file in ${ALL_CHANGED_FILES}; do
            RESULT=`perl -0777 -ne 'while(m/\n\n *\/\*!.*?\*\//gs){print "$&\n";}' $file`
            if [ "$RESULT" ]; then
              echo ------ ${file} ------
              echo "$RESULT"
              RETCODE=1
            fi
          done
          exit $RETCODE
        env:
          ALL_CHANGED_FILES: ${{ steps.changed-cxx-files.outputs.all_changed_files }}
      - name: Whitespace errors
        if: success() || failure()
        run: |
          # These are files that should be ignored for whitespace checks
          echo ".gitmodules -diff" >> .gitattributes
          echo "*.sln -diff" >> .gitattributes
          echo "test/data/*.inp -diff" >> .gitattributes
          echo "test/data/*.xml -diff" >> .gitattributes
          echo "test/data/*.cti -diff" >> .gitattributes
          echo "test_problems/**/*blessed* -diff" >> .gitattributes

          git config --global core.autocrlf false
          git config --global core.whitespace \
            -cr-at-eol,tab-in-indent,blank-at-eol,blank-at-eof
          git diff --check ${{ github.event.pull_request.base.sha }}
