diff options
Diffstat (limited to 'misc/scripts')
| -rwxr-xr-x | misc/scripts/clang_format.sh | 21 | ||||
| -rwxr-xr-x | misc/scripts/codespell.sh | 2 | ||||
| -rwxr-xr-x | misc/scripts/file_format.sh | 14 | ||||
| -rwxr-xr-x | misc/scripts/header_guards.sh | 18 | ||||
| -rwxr-xr-x | misc/scripts/validate_extension_api.sh | 60 |
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 |
