name: whitespace_checks

# Check whitespaces of the following file types
# Not checked: .lua, .yml, .properties, .conf, .java, .py, .svg, .gradle, .xml, ...
# (luacheck already checks .lua files)
on:
  push:
    paths:
      - '**.txt'
      - '**.md'
      - '**.[ch]'
      - '**.cpp'
      - '**.hpp'
      - '**.sh'
      - '**.cmake'
      - '**.glsl'
      - '**.lua'
  pull_request:
    paths:
      - '**.txt'
      - '**.md'
      - '**.[ch]'
      - '**.cpp'
      - '**.hpp'
      - '**.sh'
      - '**.cmake'
      - '**.glsl'
      - '**.lua'

jobs:
  trailing_whitespaces:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      # Line endings are already ensured by .gitattributes
      - name: Check trailing whitespaces
        run: |
          if git ls-files |\
            grep -E '\.txt$|\.md$|\.[ch]$|\.cpp$|\.hpp$|\.sh$|\.cmake$|\.glsl$' |\
            xargs grep -n '\s$';\
          then\
            echo -e "\033[0;31mFound trailing whitespace";\
            (exit 1);\
          else\
            (exit 0);\
          fi

  indent_spaces:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      # Line endings are already ensured by .gitattributes
      # Multiple multline comments in one line is not supported by this check 
      # and there is no reason to use them
      # So lines like: "/* */ /*" or "*/ a = 5; /*" will result in error
      - name: Check for unsupported multiline comments
        run: |
          if git ls-files |\
            grep -E '^src/.*\.cpp$|^src/.*\.[ch]$' |\
            xargs grep -n '\*/.*/\*';\
          then
            echo -e "\033[0;31mUnsupported combination of multiline comments. New multiline comment should begin on new line.";\
            (exit 1);\
          else\
            (exit 0);\
          fi
          if git ls-files |\
            grep -E '\.lua$' |\
            xargs grep -n -e '\]\].*--\[\[';\
          then
            echo -e "\033[0;31mUnsupported combination of multiline comments. New multiline comment should begin on new line.";\
            (exit 1);\
          else\
            (exit 0);\
          fi
      # This prepare files for final check 
      # See python script ./util/ci/indent_tab_preprocess.py for details.
      - name: Preprocess files
        run: |
          git ls-files |\
            grep -E '^src/.*\.cpp$|^src/.*\.[ch]$' |\
            xargs -L 1 -P $(($(nproc) + 1)) \
              python3 ./util/ci/indent_tab_preprocess.py "/*" "*/"
          git ls-files |\
            grep -E '\.lua$' |\
            xargs -L 1 -P $(($(nproc) + 1)) \
              python3 ./util/ci/indent_tab_preprocess.py "--[[" "]]"
      # Check for bad indent.
      # This runs over preprocessed files.
      # If there is any remaining space on line beginning or after tab,
      # error is generated
      - name: Check indent spaces
        run: |
          if git ls-files |\
            grep -E '^src/.*\.cpp$|^src/.*\.[ch]$|\.lua$' |\
            xargs grep -n -P '^\t*[ ]';\
          then\
            echo -e "\033[0;31mFound incorrect indent whitespaces";\
            (exit 1);\
          else\
            (exit 0);\
          fi

  tabs_lua_api_files:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      # Some files should not contain tabs
      - name: Check tabs in Lua API files
        run: |
          if grep -n $'\t' doc/lua_api.md doc/client_lua_api.md;\
          then\
            echo -e "\033[0;31mFound tab in markdown file";\
            (exit 1);\
          else\
            (exit 0);\
          fi

