summaryrefslogtreecommitdiff
path: root/misc/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'misc/scripts')
-rwxr-xr-xmisc/scripts/black_format.sh35
-rwxr-xr-xmisc/scripts/clang_format.sh58
-rwxr-xr-xmisc/scripts/copyright_headers.py (renamed from misc/scripts/fix_headers.py)105
-rwxr-xr-xmisc/scripts/file_format.sh59
-rwxr-xr-xmisc/scripts/fix_style.sh78
5 files changed, 201 insertions, 134 deletions
diff --git a/misc/scripts/black_format.sh b/misc/scripts/black_format.sh
new file mode 100755
index 0000000000..04dfe32f60
--- /dev/null
+++ b/misc/scripts/black_format.sh
@@ -0,0 +1,35 @@
+#!/usr/bin/env bash
+
+# This script runs black on all Python files in the repo.
+
+set -uo pipefail
+
+# Apply black.
+echo -e "Formatting Python files..."
+PY_FILES=$(find \( -path "./.git" \
+ -o -path "./thirdparty" \
+ \) -prune \
+ -o \( -name "SConstruct" \
+ -o -name "SCsub" \
+ -o -name "*.py" \
+ \) -print)
+black -l 120 $PY_FILES
+
+git diff > patch.patch
+FILESIZE="$(stat -c%s patch.patch)"
+MAXSIZE=5
+
+# If no patch has been generated all is OK, clean up, and exit.
+if (( FILESIZE < MAXSIZE )); then
+ printf "Files in this commit comply with the black style rules.\n"
+ rm -f patch.patch
+ exit 0
+fi
+
+# A patch has been created, notify the user, clean up, and exit.
+printf "\n*** The following differences were found between the code "
+printf "and the formatting rules:\n\n"
+cat patch.patch
+printf "\n*** Aborting, please fix your commit(s) with 'git commit --amend' or 'git rebase -i <hash>'\n"
+rm -f patch.patch
+exit 1
diff --git a/misc/scripts/clang_format.sh b/misc/scripts/clang_format.sh
new file mode 100755
index 0000000000..5131f7fe33
--- /dev/null
+++ b/misc/scripts/clang_format.sh
@@ -0,0 +1,58 @@
+#!/usr/bin/env bash
+
+# This script runs clang-format and fixes copyright headers on all relevant files in the repo.
+# This is the primary script responsible for fixing style violations.
+
+set -uo pipefail
+IFS=$'\n\t'
+
+CLANG_FORMAT_FILE_EXTS=(".c" ".h" ".cpp" ".hpp" ".cc" ".hh" ".cxx" ".m" ".mm" ".inc" ".java" ".glsl")
+
+# Loops through all text files tracked by Git.
+git grep -zIl '' |
+while IFS= read -rd '' f; do
+ # Exclude some files.
+ if [[ "$f" == "thirdparty"* ]]; then
+ continue
+ elif [[ "$f" == "platform/android/java/lib/src/com/google"* ]]; then
+ continue
+ fi
+
+ for extension in ${CLANG_FORMAT_FILE_EXTS[@]}; do
+ if [[ "$f" == *"$extension" ]]; then
+ # Run clang-format.
+ clang-format -i "$f"
+ # Fix copyright headers, but not all files get them.
+ if [[ "$f" == *"inc" ]]; then
+ continue 2
+ elif [[ "$f" == *"glsl" ]]; then
+ continue 2
+ elif [[ "$f" == *"theme_data.h" ]]; then
+ continue 2
+ elif [[ "$f" == "platform/android/java/lib/src/org/godotengine/godot/input/InputManager"* ]]; then
+ continue 2
+ fi
+ python misc/scripts/copyright_headers.py "$f"
+ continue 2
+ fi
+ done
+done
+
+git diff > patch.patch
+FILESIZE="$(stat -c%s patch.patch)"
+MAXSIZE=5
+
+# If no patch has been generated all is OK, clean up, and exit.
+if (( FILESIZE < MAXSIZE )); then
+ printf "Files in this commit comply with the clang-format style rules.\n"
+ rm -f patch.patch
+ exit 0
+fi
+
+# A patch has been created, notify the user, clean up, and exit.
+printf "\n*** The following differences were found between the code "
+printf "and the formatting rules:\n\n"
+cat patch.patch
+printf "\n*** Aborting, please fix your commit(s) with 'git commit --amend' or 'git rebase -i <hash>'\n"
+rm -f patch.patch
+exit 1
diff --git a/misc/scripts/fix_headers.py b/misc/scripts/copyright_headers.py
index 7af97eec4b..bf1e0d3f9c 100755
--- a/misc/scripts/fix_headers.py
+++ b/misc/scripts/copyright_headers.py
@@ -1,6 +1,8 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
+import sys
+
header = """\
/*************************************************************************/
/* $filename */
@@ -33,70 +35,61 @@ header = """\
/*************************************************************************/
"""
-files = open("files", "r")
-
-fname = files.readline()
+fname = sys.argv[1]
-while fname != "":
+# Handle replacing $filename with actual filename and keep alignment
+fsingle = fname.strip()
+if fsingle.find("/") != -1:
+ fsingle = fsingle[fsingle.rfind("/") + 1 :]
+rep_fl = "$filename"
+rep_fi = fsingle
+len_fl = len(rep_fl)
+len_fi = len(rep_fi)
+# Pad with spaces to keep alignment
+if len_fi < len_fl:
+ for x in range(len_fl - len_fi):
+ rep_fi += " "
+elif len_fl < len_fi:
+ for x in range(len_fi - len_fl):
+ rep_fl += " "
+if header.find(rep_fl) != -1:
+ text = header.replace(rep_fl, rep_fi)
+else:
+ text = header.replace("$filename", fsingle)
+text += "\n"
- # Handle replacing $filename with actual filename and keep alignment
- fsingle = fname.strip()
- if fsingle.find("/") != -1:
- fsingle = fsingle[fsingle.rfind("/") + 1 :]
- rep_fl = "$filename"
- rep_fi = fsingle
- len_fl = len(rep_fl)
- len_fi = len(rep_fi)
- # Pad with spaces to keep alignment
- if len_fi < len_fl:
- for x in range(len_fl - len_fi):
- rep_fi += " "
- elif len_fl < len_fi:
- for x in range(len_fi - len_fl):
- rep_fl += " "
- if header.find(rep_fl) != -1:
- text = header.replace(rep_fl, rep_fi)
- else:
- text = header.replace("$filename", fsingle)
- text += "\n"
+# We now have the proper header, so we want to ignore the one in the original file
+# and potentially empty lines and badly formatted lines, while keeping comments that
+# come after the header, and then keep everything non-header unchanged.
+# To do so, we skip empty lines that may be at the top in a first pass.
+# In a second pass, we skip all consecutive comment lines starting with "/*",
+# then we can append the rest (step 2).
- # We now have the proper header, so we want to ignore the one in the original file
- # and potentially empty lines and badly formatted lines, while keeping comments that
- # come after the header, and then keep everything non-header unchanged.
- # To do so, we skip empty lines that may be at the top in a first pass.
- # In a second pass, we skip all consecutive comment lines starting with "/*",
- # then we can append the rest (step 2).
+fileread = open(fname.strip(), "r")
+line = fileread.readline()
+header_done = False
- fileread = open(fname.strip(), "r")
+while line.strip() == "": # Skip empty lines at the top
line = fileread.readline()
- header_done = False
- while line.strip() == "": # Skip empty lines at the top
- line = fileread.readline()
+if line.find("/**********") == -1: # Godot header starts this way
+ # Maybe starting with a non-Godot comment, abort header magic
+ header_done = True
- if line.find("/**********") == -1: # Godot header starts this way
- # Maybe starting with a non-Godot comment, abort header magic
+while not header_done: # Handle header now
+ if line.find("/*") != 0: # No more starting with a comment
header_done = True
+ if line.strip() != "":
+ text += line
+ line = fileread.readline()
- while not header_done: # Handle header now
- if line.find("/*") != 0: # No more starting with a comment
- header_done = True
- if line.strip() != "":
- text += line
- line = fileread.readline()
-
- while line != "": # Dump everything until EOF
- text += line
- line = fileread.readline()
-
- fileread.close()
-
- # Write
- filewrite = open(fname.strip(), "w")
- filewrite.write(text)
- filewrite.close()
+while line != "": # Dump everything until EOF
+ text += line
+ line = fileread.readline()
- # Next file
- fname = files.readline()
+fileread.close()
-files.close()
+# Write
+filewrite = open(fname.strip(), "w")
+filewrite.write(text)
+filewrite.close()
diff --git a/misc/scripts/file_format.sh b/misc/scripts/file_format.sh
new file mode 100755
index 0000000000..30988e51c6
--- /dev/null
+++ b/misc/scripts/file_format.sh
@@ -0,0 +1,59 @@
+#!/usr/bin/env bash
+
+# This script ensures proper POSIX text file formatting and a few other things.
+# This is supplementary to clang-black-format.sh, but should be run before it.
+
+set -uo pipefail
+IFS=$'\n\t'
+
+# Loops through all text files tracked by Git.
+git grep -zIl '' |
+while IFS= read -rd '' f; do
+ # Exclude some types of files.
+ if [[ "$f" == *"csproj" ]]; then
+ continue
+ elif [[ "$f" == *"sln" ]]; then
+ continue
+ elif [[ "$f" == *"patch" ]]; then
+ continue
+ elif [[ "$f" == *"pot" ]]; then
+ continue
+ elif [[ "$f" == *"po" ]]; then
+ continue
+ elif [[ "$f" == "thirdparty"* ]]; then
+ continue
+ elif [[ "$f" == "platform/android/java/lib/src/com/google"* ]]; then
+ continue
+ fi
+ # Ensures that files are UTF-8 formatted.
+ recode UTF-8 "$f" 2> /dev/null
+ # Ensures that files have LF line endings.
+ dos2unix "$f" 2> /dev/null
+ # Ensures that files do not contain a BOM.
+ sed -i '1s/^\xEF\xBB\xBF//' "$f"
+ # Ensures that files end with newline characters.
+ tail -c1 < "$f" | read -r _ || echo >> "$f";
+ # Remove trailing space characters.
+ sed -z -i 's/\x20\x0A/\x0A/g' "$f"
+ # Remove the character sequence "== true" if it has a leading space.
+ sed -z -i 's/\x20== true//g' "$f"
+done
+
+git diff > patch.patch
+FILESIZE="$(stat -c%s patch.patch)"
+MAXSIZE=5
+
+# If no patch has been generated all is OK, clean up, and exit.
+if (( FILESIZE < MAXSIZE )); then
+ printf "Files in this commit comply with the formatting rules.\n"
+ rm -f patch.patch
+ exit 0
+fi
+
+# A patch has been created, notify the user, clean up, and exit.
+printf "\n*** The following differences were found between the code "
+printf "and the formatting rules:\n\n"
+cat patch.patch
+printf "\n*** Aborting, please fix your commit(s) with 'git commit --amend' or 'git rebase -i <hash>'\n"
+rm -f patch.patch
+exit 1
diff --git a/misc/scripts/fix_style.sh b/misc/scripts/fix_style.sh
deleted file mode 100755
index 2eee61a459..0000000000
--- a/misc/scripts/fix_style.sh
+++ /dev/null
@@ -1,78 +0,0 @@
-#!/usr/bin/env bash
-
-# Command line arguments
-run_black=false
-run_clang_format=false
-run_fix_headers=false
-usage="Invalid argument. Usage:\n$0 <option>\n\t--black|-b\n\t--clang-format|-c\n\t--headers|-h\n\t--all|-a"
-
-if [ -z "$1" ]; then
- echo -e $usage
- exit 0
-fi
-
-while [ $# -gt 0 ]; do
- case "$1" in
- --black|-b)
- run_black=true
- ;;
- --clang-format|-c)
- run_clang_format=true
- ;;
- --headers|-h)
- run_fix_headers=true
- ;;
- --all|-a)
- run_black=true
- run_clang_format=true
- run_fix_headers=true
- ;;
- *)
- echo -e $usage
- exit 0
- esac
- shift
-done
-
-echo "Removing generated files, some have binary data and make clang-format freeze."
-find -name "*.gen.*" -delete
-
-# Apply black
-if $run_black; then
- echo -e "Formatting Python files..."
- PY_FILES=$(find \( -path "./.git" \
- -o -path "./thirdparty" \
- \) -prune \
- -o \( -name "SConstruct" \
- -o -name "SCsub" \
- -o -name "*.py" \
- \) -print)
- black -l 120 $PY_FILES
-fi
-
-# Apply clang-format
-if $run_clang_format; then
- # Sync list with pre-commit hook
- FILE_EXTS=".c .h .cpp .hpp .cc .hh .cxx .m .mm .inc .java .glsl"
-
- for extension in ${FILE_EXTS}; do
- echo -e "Formatting ${extension} files..."
- find \( -path "./.git" \
- -o -path "./thirdparty" \
- -o -path "./platform/android/java/lib/src/com/google" \
- \) -prune \
- -o -name "*${extension}" \
- -exec clang-format -i {} \;
- done
-fi
-
-# Add missing copyright headers
-if $run_fix_headers; then
- echo "Fixing copyright headers in Godot code files..."
- find \( -path "./.git" -o -path "./thirdparty" \) -prune \
- -o -regex '.*\.\(c\|h\|cpp\|hpp\|cc\|hh\|cxx\|m\|mm\|java\)' \
- > tmp-files
- cat tmp-files | grep -v ".git\|thirdparty\|theme_data.h\|platform/android/java/lib/src/com/google\|platform/android/java/lib/src/org/godotengine/godot/input/InputManager" > files
- python misc/scripts/fix_headers.py
- rm -f tmp-files files
-fi