Meta: Rewrite the check-newlines-at-eof script in python

The bash version takes around 15 seconds to run; that is way too slow.
This python3 version should take less than one second to run. :^)

Also, the script will now also check .py files and .txt CMake files.
This commit is contained in:
Emanuele Torre 2021-01-03 19:31:44 +01:00 committed by Andreas Kling
parent 7dc52e04fe
commit 6abba493b2
Notes: sideshowbarker 2024-07-19 00:08:07 +09:00
3 changed files with 63 additions and 43 deletions

62
Meta/check-newlines-at-eof.py Executable file
View File

@ -0,0 +1,62 @@
#!/bin/python3
import os
import subprocess
import sys
os.chdir(os.path.dirname(__file__) + "/..")
files = subprocess.run(
[
"git", "ls-files", "--",
"*.cpp",
"*.h",
"*.gml",
"*.html",
"*.js",
"*.css",
"*.sh",
"*.py",
"CMake*.txt",
"**/CMake*.txt",
":!:Base",
":!:Kernel/FileSystem/ext2_fs.h",
":!:Libraries/LibC/getopt.cpp",
":!:Libraries/LibCore/puff.h",
":!:Libraries/LibCore/puff.cpp",
":!:Libraries/LibELF/exec_elf.h"
],
capture_output=True
).stdout.decode().strip('\n').split('\n')
no_newline_at_eof_errors = []
blank_lines_at_eof_errors = []
did_fail = False
for filename in files:
with open(filename, "r") as f:
f.seek(0, os.SEEK_END)
f.seek(f.tell() - 1, os.SEEK_SET)
if f.read(1) != '\n':
did_fail = True
no_newline_at_eof_errors.append(filename)
continue
while True:
f.seek(f.tell() - 2, os.SEEK_SET)
char = f.read(1)
if not char.isspace():
break
if char == '\n':
did_fail = True
blank_lines_at_eof_errors.append(filename)
break
if no_newline_at_eof_errors:
print("Files with no newline at the end:", " ".join(no_newline_at_eof_errors))
if blank_lines_at_eof_errors:
print("Files that have blank lines at the end:", " ".join(blank_lines_at_eof_errors))
if did_fail:
sys.exit(1)

View File

@ -1,42 +0,0 @@
#!/bin/bash
script_path=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
cd "$script_path/.." || exit 1
MISSING_NEWLINE_AT_EOF_ERRORS=()
MORE_THAN_ONE_NEWLINE_AT_EOF_ERRORS=()
while IFS= read -r f; do
[ -s "$f" ] || continue
if [ "$(tail -n 1 "$f" | wc -l)" != 1 ]; then
MISSING_NEWLINE_AT_EOF_ERRORS+=( "$f" )
elif [[ "$(tail -n 1 "$f")" =~ ^[[:space:]]*$ ]]; then
MORE_THAN_ONE_NEWLINE_AT_EOF_ERRORS+=( "$f" )
fi
done < <(git ls-files -- \
'*.cpp' \
'*.h' \
'*.gml' \
'*.html' \
'*.js' \
'*.css' \
'*.sh' \
':!:Base' \
':!:Kernel/FileSystem/ext2_fs.h' \
':!:Libraries/LibC/getopt.cpp' \
':!:Libraries/LibCore/puff.h' \
':!:Libraries/LibCore/puff.cpp' \
':!:Libraries/LibELF/exec_elf.h' \
)
exit_status=0
if (( ${#MISSING_NEWLINE_AT_EOF_ERRORS[@]} )); then
echo "Files with no newline at the end: ${MISSING_NEWLINE_AT_EOF_ERRORS[*]}"
exit_status=1
fi
if (( ${#MORE_THAN_ONE_NEWLINE_AT_EOF_ERRORS[@]} )); then
echo "Files that have blank lines at the end: ${MORE_THAN_ONE_NEWLINE_AT_EOF_ERRORS[*]}"
exit_status=1
fi
exit "$exit_status"

View File

@ -16,7 +16,7 @@ set +e
for cmd in \
Meta/check-ak-test-files.sh \
Meta/check-debug-flags.sh \
Meta/check-newlines-at-eof.sh \
Meta/check-newlines-at-eof.py \
Meta/check-style.sh \
Meta/lint-executable-resources.sh \
Meta/lint-ipc-ids.sh \