unreal-automations/format_code.sh
2025-03-05 15:50:51 +01:00

131 lines
No EOL
3.4 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
set -eo pipefail
# Configuration
ROOT_DIR=$(git rev-parse --show-toplevel)
CLANG_FORMAT_BIN="${ROOT_DIR}/.tools/clang-format"
CLANG_CONFIG="${ROOT_DIR}/.tools/.clang-format"
TARGET_DIRS=("Source" "Private" "Public" "Classes")
FILE_EXTS=("*.h" "*.cpp" "*.hpp" "*.c")
# Options
DRY_RUN=false
VERBOSE=false
CHECK_MODIFIED=false
# Help text
show_help() {
cat <<EOF
Usage: $0 [OPTIONS]
Options:
--dry-run Check formatting without modifying files
--verbose Show detailed processing information
--modified-only Check only modified files
--help Show this help message
Exit codes:
0 - Everything formatted correctly
1 - Formatting errors detected
2 - Configuration error
EOF
}
# Parse arguments
while [[ $# -gt 0 ]]; do
case $1 in
--dry-run) DRY_RUN=true; shift ;;
--verbose) VERBOSE=true; shift ;;
--modified-only) CHECK_MODIFIED=true; shift ;;
--help) show_help; exit 0 ;;
*) echo "Unknown option: $1"; exit 2 ;;
esac
done
# Verify dependencies
check_dependencies() {
if [[ ! -x "${CLANG_FORMAT_BIN}" ]]; then
echo "❌ clang-format non trouvé ou non exécutable dans .tools/"
echo " Vérifiez le chemin: ${CLANG_FORMAT_BIN}"
exit 2
fi
if [[ ! -f "${CLANG_CONFIG}" ]]; then
echo "❌ Fichier de configuration .clang-format manquant"
echo " Vérifiez le chemin: ${CLANG_CONFIG}"
exit 2
fi
}
# File discovery
find_source_files() {
local files=()
if [[ "${CHECK_MODIFIED}" == true ]]; then
# Fichiers modifiés uniquement
mapfile -t files < <(git diff --name-only --diff-filter=ACMR HEAD -- $(printf "%s " "${TARGET_DIRS[@]}") | grep -E '\.(h|cpp|hpp|c)$')
else
# Tous les fichiers
for dir in "${TARGET_DIRS[@]}"; do
local full_dir="${ROOT_DIR}/${dir}"
if [[ -d "${full_dir}" ]]; then
while IFS= read -r -d '' file; do
files+=("$file")
done < <(find "${full_dir}" -type f \( \
-name "*.h" -o \
-name "*.cpp" -o \
-name "*.hpp" -o \
-name "*.c" \) -print0)
fi
done
fi
printf "%s\n" "${files[@]}"
}
# Main process
main() {
check_dependencies
local files
mapfile -t files < <(find_source_files)
if [[ ${#files[@]} -eq 0 ]]; then
${VERBOSE} && echo " Aucun fichier trouvé dans ${TARGET_DIRS[*]}"
return
fi
${VERBOSE} && echo "📁 Fichiers à vérifier : ${#files[@]}"
local format_args=("-style=file" "${CLANG_CONFIG}")
local errors=0
if [[ "${DRY_RUN}" == true ]]; then
format_args+=(--dry-run --Werror)
${VERBOSE} && echo "🔍 Mode vérification seulement"
else
format_args+=(-i)
${VERBOSE} && echo "🛠️ Application du formatage"
fi
for file in "${files[@]}"; do
${VERBOSE} && echo "🔎 Traitement : ${file}"
if ! "${CLANG_FORMAT_BIN}" "${format_args[@]}" "${file}"; then
((errors++))
${DRY_RUN} && echo "❌ Problème détecté : ${file}"
fi
done
if [[ ${errors} -gt 0 ]]; then
echo -e "\n❌ ${errors} fichier(s) nécessitent un formatage"
exit 1
else
echo -e "\n✅ Tous les fichiers sont correctement formatés !"
exit 0
fi
}
# Execution
main