summaryrefslogtreecommitdiffstats
path: root/misc/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'misc/scripts')
-rwxr-xr-xmisc/scripts/black_format.sh33
-rwxr-xr-xmisc/scripts/clang_format.sh56
-rwxr-xr-xmisc/scripts/copyright_headers.py (renamed from misc/scripts/fix_headers.py)109
-rwxr-xr-xmisc/scripts/file_format.sh67
-rwxr-xr-xmisc/scripts/fix_style.sh78
5 files changed, 207 insertions, 136 deletions
diff --git a/misc/scripts/black_format.sh b/misc/scripts/black_format.sh
new file mode 100755
index 0000000000..f93e8cbc2a
--- /dev/null
+++ b/misc/scripts/black_format.sh
@@ -0,0 +1,33 @@
+#!/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
+
+# If no patch has been generated all is OK, clean up, and exit.
+if [ ! -s patch.patch ] ; 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..e686305dea
--- /dev/null
+++ b/misc/scripts/clang_format.sh
@@ -0,0 +1,56 @@
+#!/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
+
+# If no patch has been generated all is OK, clean up, and exit.
+if [ ! -s patch.patch ] ; 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..2f3e4a1b6a 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 */
@@ -9,8 +11,8 @@ header = """\
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -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..0e9db68a90
--- /dev/null
+++ b/misc/scripts/file_format.sh
@@ -0,0 +1,67 @@
+#!/usr/bin/env bash
+
+# This script ensures proper POSIX text file formatting and a few other things.
+# This is supplementary to clang_format.sh and black_format.sh, but should be
+# run before them.
+
+# We need dos2unix and recode.
+if [ ! -x "$(command -v dos2unix)" -o ! -x "$(command -v recode)" ]; then
+ printf "Install 'dos2unix' and 'recode' to use this script.\n"
+fi
+
+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
+ # Ensure that files are UTF-8 formatted.
+ recode UTF-8 "$f" 2> /dev/null
+ # Ensure that files have LF line endings and do not contain a BOM.
+ dos2unix "$f" 2> /dev/null
+ # Remove trailing space characters and ensures that files end
+ # with newline characters. -l option handles newlines conveniently.
+ perl -i -ple 's/\s*$//g' "$f"
+ # Remove the character sequence "== true" if it has a leading space.
+ perl -i -pe 's/\x20== true//g' "$f"
+
+ if [[ $(uname) == "Linux" ]] && [[ "$f" != *"xml" ]]; then
+ # Remove empty lines after the opening brace of indented blocks.
+ sed -z -i 's/\x7B\x0A\x0A\x09/\x7B\x0A\x09/g' "$f"
+ # Remove empty lines before the closing brace (in some cases).
+ sed -z -i 's/\x0A\x0A\x7D/\x0A\x7D/g' "$f"
+ fi
+done
+
+git diff > patch.patch
+
+# If no patch has been generated all is OK, clean up, and exit.
+if [ ! -s patch.patch ] ; 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