summaryrefslogtreecommitdiffstats
path: root/misc/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'misc/scripts')
-rwxr-xr-xmisc/scripts/clang_format.sh21
-rwxr-xr-xmisc/scripts/codespell.sh2
-rwxr-xr-xmisc/scripts/file_format.sh14
-rwxr-xr-xmisc/scripts/header_guards.sh18
-rwxr-xr-xmisc/scripts/validate_extension_api.sh60
5 files changed, 98 insertions, 17 deletions
diff --git a/misc/scripts/clang_format.sh b/misc/scripts/clang_format.sh
index 318a78b865..74a8e1a8a3 100755
--- a/misc/scripts/clang_format.sh
+++ b/misc/scripts/clang_format.sh
@@ -5,15 +5,22 @@
set -uo pipefail
-# Loops through all code files tracked by Git.
-git ls-files -- '*.c' '*.h' '*.cpp' '*.hpp' '*.cc' '*.hh' '*.cxx' '*.m' '*.mm' '*.inc' '*.java' '*.glsl' \
+if [ $# -eq 0 ]; then
+ # Loop through all code files tracked by Git.
+ files=$(git ls-files -- '*.c' '*.h' '*.cpp' '*.hpp' '*.cc' '*.hh' '*.cxx' '*.m' '*.mm' '*.inc' '*.java' '*.glsl' \
':!:.git/*' ':!:thirdparty/*' ':!:*/thirdparty/*' ':!:platform/android/java/lib/src/com/google/*' \
- ':!:*-so_wrap.*' ':!:tests/python_build/*' |
-while read -r f; do
- # Run clang-format.
- clang-format --Wno-error=unknown -i "$f"
+ ':!:*-so_wrap.*' ':!:tests/python_build/*')
+else
+ # $1 should be a file listing file paths to process. Used in CI.
+ files=$(cat "$1" | grep -v "thirdparty/" | grep -E "\.(c|h|cpp|hpp|cc|hh|cxx|m|mm|inc|java|glsl)$" | grep -v "platform/android/java/lib/src/com/google/" | grep -v "\-so_wrap\." | grep -v "tests/python_build/")
+fi
+
+if [ ! -z "$files" ]; then
+ clang-format --Wno-error=unknown -i $files
+fi
- # Fix copyright headers, but not all files get them.
+# Fix copyright headers, but not all files get them.
+for f in $files; do
if [[ "$f" == *"inc" ]]; then
continue
elif [[ "$f" == *"glsl" ]]; then
diff --git a/misc/scripts/codespell.sh b/misc/scripts/codespell.sh
index 775d193a66..d15b6593f7 100755
--- a/misc/scripts/codespell.sh
+++ b/misc/scripts/codespell.sh
@@ -3,6 +3,6 @@ SKIP_LIST="./.*,./**/.*,./bin,./thirdparty,*.desktop,*.gen.*,*.po,*.pot,*.rc,./A
SKIP_LIST+="./core/input/gamecontrollerdb.txt,./core/string/locales.h,./editor/renames_map_3_to_4.cpp,./misc/scripts/codespell.sh,"
SKIP_LIST+="./platform/android/java/lib/src/com,./platform/web/node_modules,./platform/web/package-lock.json,"
-IGNORE_LIST="curvelinear,doubleclick,expct,findn,gird,hel,inout,lod,nd,numer,ot,te"
+IGNORE_LIST="curvelinear,doubleclick,expct,findn,gird,hel,inout,lod,nd,numer,ot,te,vai"
codespell -w -q 3 -S "${SKIP_LIST}" -L "${IGNORE_LIST}" --builtin "clear,rare,en-GB_to_en-US"
diff --git a/misc/scripts/file_format.sh b/misc/scripts/file_format.sh
index f394c4ad3f..94a3affbd7 100755
--- a/misc/scripts/file_format.sh
+++ b/misc/scripts/file_format.sh
@@ -7,14 +7,20 @@
# We need dos2unix and isutf8.
if [ ! -x "$(command -v dos2unix)" -o ! -x "$(command -v isutf8)" ]; then
printf "Install 'dos2unix' and 'isutf8' (moreutils package) to use this script.\n"
+ exit 1
fi
set -uo pipefail
-IFS=$'\n\t'
-# Loops through all text files tracked by Git.
-git grep -zIl '' |
-while IFS= read -rd '' f; do
+if [ $# -eq 0 ]; then
+ # Loop through all code files tracked by Git.
+ mapfile -d '' files < <(git grep -zIl '')
+else
+ # $1 should be a file listing file paths to process. Used in CI.
+ mapfile -d ' ' < <(cat "$1")
+fi
+
+for f in "${files[@]}"; do
# Exclude some types of files.
if [[ "$f" == *"csproj" ]]; then
continue
diff --git a/misc/scripts/header_guards.sh b/misc/scripts/header_guards.sh
index a063ff4b9c..1f8aa6151c 100755
--- a/misc/scripts/header_guards.sh
+++ b/misc/scripts/header_guards.sh
@@ -5,9 +5,17 @@ if [ ! -f "version.py" ]; then
echo "Some of the paths checks may not work as intended from a different folder."
fi
+if [ $# -eq 0 ]; then
+ # Loop through all code files tracked by Git.
+ files=$(find -name "thirdparty" -prune -o -name "*.h" -print | sed "s@^\./@@g")
+else
+ # $1 should be a file listing file paths to process. Used in CI.
+ files=$(cat "$1" | grep -v "thirdparty/" | grep -E "\.h$" | sed "s@^\./@@g")
+fi
+
files_invalid_guard=""
-for file in $(find -name "thirdparty" -prune -o -name "*.h" -print); do
+for file in $files; do
# Skip *.gen.h and *-so_wrap.h, they're generated.
if [[ "$file" == *".gen.h" || "$file" == *"-so_wrap.h" ]]; then continue; fi
# Has important define before normal header guards.
@@ -20,16 +28,16 @@ for file in $(find -name "thirdparty" -prune -o -name "*.h" -print); do
# Add custom prefix or suffix for generic filenames with a well-defined namespace.
prefix=
- if [[ "$file" == "./modules/"*"/register_types.h" ]]; then
+ if [[ "$file" == "modules/"*"/register_types.h" ]]; then
module=$(echo $file | sed "s@.*modules/\([^/]*\).*@\1@")
prefix="${module^^}_"
fi
- if [[ "$file" == "./platform/"*"/api/api.h" || "$file" == "./platform/"*"/export/"* ]]; then
+ if [[ "$file" == "platform/"*"/api/api.h" || "$file" == "platform/"*"/export/"* ]]; then
platform=$(echo $file | sed "s@.*platform/\([^/]*\).*@\1@")
prefix="${platform^^}_"
fi
- if [[ "$file" == "./modules/mono/utils/"* && "$bname" != *"mono"* ]]; then prefix="MONO_"; fi
- if [[ "$file" == "./servers/rendering/storage/utilities.h" ]]; then prefix="RENDERER_"; fi
+ if [[ "$file" == "modules/mono/utils/"* && "$bname" != *"mono"* ]]; then prefix="MONO_"; fi
+ if [[ "$file" == "servers/rendering/storage/utilities.h" ]]; then prefix="RENDERER_"; fi
suffix=
if [[ "$file" == *"dummy"* && "$bname" != *"dummy"* ]]; then suffix="_DUMMY"; fi
diff --git a/misc/scripts/validate_extension_api.sh b/misc/scripts/validate_extension_api.sh
new file mode 100755
index 0000000000..6cc22c9b63
--- /dev/null
+++ b/misc/scripts/validate_extension_api.sh
@@ -0,0 +1,60 @@
+#!/bin/bash
+set -uo pipefail
+
+if [ ! -f "version.py" ]; then
+ echo "Warning: This script is intended to be run from the root of the Godot repository."
+ echo "Some of the paths checks may not work as intended from a different folder."
+fi
+
+if [ $# != 1 ]; then
+ echo "Usage: @0 <path-to-godot-executable>"
+fi
+
+has_problems=0
+
+make_annotation()
+{
+ local title=$1
+ local body=$2
+ local type=$3
+ local file=$4
+ if [ ! -v GITHUB_OUTPUT ]; then
+ echo "$title"
+ echo "$body"
+ else
+ body="$(awk 1 ORS='%0A' - <<<"$body")"
+ echo "::$type file=$file,title=$title ::$body"
+ fi
+}
+
+while read -r file; do
+ reference_file="$(mktemp)"
+ validate="$(mktemp)"
+ validation_output="$(mktemp)"
+ allowed_errors="$(mktemp)"
+
+ # Download the reference extension_api.json
+ reference_tag="$(basename -s .expected "$file")"
+ wget -qcO "$reference_file" "https://raw.githubusercontent.com/godotengine/godot-cpp/godot-$reference_tag/gdextension/extension_api.json"
+ # Validate the current API against the reference
+ "$1" --headless --validate-extension-api "$reference_file" 2>&1 | tee "$validate" | awk '!/^Validate extension JSON:/' - || true
+ # Collect the expected and actual validation errors
+ awk '/^Validate extension JSON:/' - < "$validate" | sort > "$validation_output"
+ awk '/^Validate extension JSON:/' - < "$file" | sort > "$allowed_errors"
+
+ # Differences between the expected and actual errors
+ new_validation_error="$(comm "$validation_output" "$allowed_errors" -23)"
+ obsolete_validation_error="$(comm "$validation_output" "$allowed_errors" -13)"
+
+ if [ -n "$obsolete_validation_error" ]; then
+ make_annotation "The following validation errors no longer occur (compared to $reference_tag):" "$obsolete_validation_error" warning "$file"
+ fi
+ if [ -n "$new_validation_error" ]; then
+ make_annotation "Compatibility to $reference_tag is broken in the following ways:" "$new_validation_error" error README.md
+ has_problems=1
+ fi
+
+ rm -f "$reference_file" "$validate" "$validation_output" "$allowed_errors"
+done <<< "$(find "$( dirname -- "$( dirname -- "${BASH_SOURCE[0]//\.\//}" )" )/extension_api_validation/" -name "*.expected")"
+
+exit $has_problems