name: check-whitespace

# Get the repository with all commits to ensure that we can analyze
# all of the commits contributed via the Pull Request.
# Process `git log --check` output to extract just the check errors.
# Exit with failure upon white-space issues.

on:
  pull_request:
    types: [opened, synchronize]

# Avoid unnecessary builds. Unlike the main CI jobs, these are not
# ci-configurable (but could be).
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  check-whitespace:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
      with:
        fetch-depth: 0

    - name: git log --check
      id: check_out
      run: |
        baseSha=${{github.event.pull_request.base.sha}}
        problems=()
        commit=
        commitText=
        commitTextmd=
        goodparent=
        while read dash sha etc
        do
          case "${dash}" in
          "---")
            if test -z "${commit}"
            then
              goodparent=${sha}
            fi
            commit="${sha}"
            commitText="${sha} ${etc}"
            commitTextmd="[${sha}](https://github.com/${{ github.repository }}/commit/${sha}) ${etc}"
            ;;
          "")
            ;;
          *)
            if test -n "${commit}"
            then
              problems+=("1) --- ${commitTextmd}")
              echo ""
              echo "--- ${commitText}"
              commit=
            fi
            case "${dash}" in
            *:[1-9]*:) # contains file and line number information
              dashend=${dash#*:}
              problems+=("[${dash}](https://github.com/${{ github.repository }}/blob/${{github.event.pull_request.head.ref}}/${dash%%:*}#L${dashend%:}) ${sha} ${etc}")
              ;;
            *)
              problems+=("\`${dash} ${sha} ${etc}\`")
              ;;
            esac
            echo "${dash} ${sha} ${etc}"
            ;;
          esac
        done <<< $(git log --check --pretty=format:"---% h% s" ${baseSha}..)

        if test ${#problems[*]} -gt 0
        then
          if test -z "${commit}"
          then
            goodparent=${baseSha: 0:7}
          fi
          echo "🛑 Please review the Summary output for further information."
          echo "### :x: A whitespace issue was found in one or more of the commits." >$GITHUB_STEP_SUMMARY
          echo "" >>$GITHUB_STEP_SUMMARY
          echo "Run these commands to correct the problem:" >>$GITHUB_STEP_SUMMARY
          echo "1. \`git rebase --whitespace=fix ${goodparent}\`" >>$GITHUB_STEP_SUMMARY
          echo "1. \`git push --force\`" >>$GITHUB_STEP_SUMMARY
          echo " " >>$GITHUB_STEP_SUMMARY
          echo "Errors:" >>$GITHUB_STEP_SUMMARY
          for i in "${problems[@]}"
          do
            echo "${i}" >>$GITHUB_STEP_SUMMARY
          done

          exit 2
        fi
