name: Code style
"on":
  push:
    branches:
      - main
      - ?.*.x
  pull_request:

jobs:
  cmake_checks:
    name: Check CMake files
    runs-on: ubuntu-22.04
    steps:
      - name: Install prerequisites
        run: pip install cmakelang
      - name: Checkout source
        uses: actions/checkout@v4
      - name: Run format on CMake files
        run: |
          git reset --hard
          find  -name CMakeLists.txt  -exec cmake-format -i {} +
          find src test tsl -name '*.cmake' -exec cmake-format -i {} +
          git diff --exit-code

  perl_checks:
    name: Check Perl code in tree
    runs-on: ubuntu-22.04
    steps:
      - name: Install prerequisites
        run: sudo apt install perltidy
      - name: Checkout source
        uses: actions/checkout@v4
      - name: Check trailing whitespace
        if: always()
        run: |
          find . -name '*.p[lm]' -exec perl -pi -e 's/[ \t]+$//' {} +
          git diff --exit-code
      - name: Format Perl files, if needed
        if: always()
        run: |
          git reset --hard
          find . -name '*.p[lm]' -exec perltidy -b -bext=/ {} +
          git diff --exit-code

  yaml_checks:
    name: Check YAML code in tree
    runs-on: ubuntu-latest
    steps:
      - name: Install prerequisites
        run: |
          pip install yamllint
      - name: Checkout source
        uses: actions/checkout@v4
      - name: Run yamllint
        run: |
          find . -type f \( -name "*.yaml" -or -name "*.yml" \) -print -exec yamllint {} \+

  spelling_checks:
    name: Check spelling
    runs-on: ubuntu-latest
    steps:
      - name: Install prerequisites
        run: |
          pip install codespell
      - name: Checkout source
        uses: actions/checkout@v4
      - name: Run codespell
        run: |
          find . -type f \( -name "*.c" -or -name "*.h" -or -name "*.yaml" -or -name "*.yml" -or -name "*.sh" -or -name "*.cmake" -or -name "*.py" -or -name "*.pl" -or -name "CMakeLists.txt" \) \
            -exec codespell -I .github/codespell-ignore-words {} \+

  cc_checks:
    name: Check code formatting
    runs-on: ubuntu-22.04
    strategy:
      fail-fast: false
    steps:
    - name: Checkout source
      uses: actions/checkout@v4
    - name: Check trailing whitespace
      if: always()
      run: |
        git reset --hard
        find . -type f -regex '.*\.\(c\|h\|sql\|sql\.in\)$' -exec perl -pi -e 's/[ \t]+$//' {} +
        git diff --exit-code

    - name: Check code formatting
      if: always()
      run: |
        sudo apt install clang-format-14
        sudo update-alternatives --install /usr/bin/clang-format clang-format /usr/bin/clang-format-14 100
        sudo update-alternatives --set clang-format /usr/bin/clang-format-14
        git reset --hard
        ./scripts/clang_format_all.sh
        git diff --exit-code

    - name: FIXME annotations left in code (use TODO for long-term notes)
      if: always()
      run: |
        ! grep fixme -niR ./*

  python_checks:
    name: Check Python code in tree
    runs-on: ubuntu-latest
    steps:
      - name: Install prerequisites
        run: |
          pip install --upgrade pip
          pip install black prospector pylint dodgy \
            mccabe pycodestyle pyflakes \
            psutil pygithub pglast testgres more_itertools
          # pinning snowballstemmer to version 2.2.0 due to:
          # https://github.com/prospector-dev/prospector/issues/763
          pip install --force-reinstall --no-deps snowballstemmer==2.2.0
          pip list
          pip list --user

      - name: Checkout source
        uses: actions/checkout@v4

      - name: Run prospector
        run: |
          git reset --hard
          find . -type f -name "*.py" -print -exec prospector {} + -exec black {} +
          git diff --exit-code

  misc_checks:
    name: Check license, update scripts, git hooks, missing gitignore entries and unnecessary template tests
    runs-on: ubuntu-24.04
    strategy:
      fail-fast: false
    steps:
    - name: Checkout source
      if: always()
      uses: actions/checkout@v4
    - name: Check license
      if: always()
      run: ./scripts/check_license_all.sh
    - name: Check git commit hooks
      if: always()
      run: |
        ./scripts/githooks/commit_msg_tests.py
    - name: Check for unreferenced test files
      if: always()
      run: ./scripts/check_unreferenced_files.sh
    - name: Check for missing gitignore entries for template test files
      if: always()
      run: |
        ./bootstrap
        ./scripts/check_missing_gitignore_for_template_tests.sh
    - name: Check for unnecessary template test files
      if: always()
      run: ./scripts/check_unnecessary_template_tests.sh
    - name: Check for orphaned output test files
      if: always()
      run: ./scripts/check_orphaned_test_output_files.sh

