Files
jaildoctors_dilemma/tools/linter/run_clang-tidy.sh
2025-10-27 17:39:23 +01:00

148 lines
4.3 KiB
Bash
Executable File

#!/bin/bash
# Script para ejecutar clang-tidy recursivamente en todo el código fuente
# Uso:
# ./run_clang-tidy.sh [--fix] [--help] [archivos...]
# --fix: Aplica las correcciones automáticamente (opcional)
# --help: Muestra la ayuda
# archivos: Archivos específicos a analizar (opcional, si no se especifica analiza todos)
# Función de ayuda
show_help() {
cat << EOF
Uso: ./run_clang-tidy.sh [OPCIONES] [ARCHIVOS...]
Script para ejecutar clang-tidy en el código fuente del proyecto.
OPCIONES:
--fix Aplica las correcciones automáticamente
--help Muestra este mensaje de ayuda
ARCHIVOS:
Si no se especifican archivos, se analizan todos los archivos del proyecto
(excluyendo la carpeta external/). Si se especifican archivos, solo se
analizan esos archivos específicos.
EJEMPLOS:
# Analizar todo el proyecto
./run_clang-tidy.sh
# Analizar todo el proyecto y aplicar correcciones
./run_clang-tidy.sh --fix
# Analizar un archivo específico
./run_clang-tidy.sh source/game/entities/enemy.cpp
# Analizar múltiples archivos
./run_clang-tidy.sh source/game/entities/enemy.cpp source/game/entities/player.cpp
# Analizar y corregir un archivo específico
./run_clang-tidy.sh --fix source/game/entities/enemy.cpp
# Analizar todos los archivos de una carpeta (usando glob)
./run_clang-tidy.sh source/game/entities/*.cpp
NOTAS:
- Se requiere que el directorio build/ exista y contenga compile_commands.json
- Los archivos se procesan en paralelo (4 procesos)
- Solo se procesan archivos .cpp, .hpp y .h
- Las rutas pueden ser relativas o absolutas
EOF
exit 0
}
# Auto-detectar la ubicación del script y calcular rutas del proyecto
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
PROJECT_DIR=$(cd "$SCRIPT_DIR/../.." && pwd)
SOURCE_DIR="$PROJECT_DIR/source"
BUILD_DIR="$PROJECT_DIR/build"
# Parsear argumentos: separar --fix, --help de archivos
FIX_FLAG=""
FILES=()
for arg in "$@"; do
if [[ "$arg" == "--fix" ]]; then
FIX_FLAG="--fix"
elif [[ "$arg" == "--help" || "$arg" == "-h" ]]; then
show_help
else
FILES+=("$arg")
fi
done
# Mostrar modo
if [[ -n "$FIX_FLAG" ]]; then
echo "Modo: Aplicando correcciones automáticamente (--fix)"
else
echo "Modo: Solo análisis (sin --fix)"
fi
echo
# Verificar que los directorios existen
if [[ ! -d "$SOURCE_DIR" ]]; then
echo "Error: El directorio source/ no existe en: $SOURCE_DIR"
exit 1
fi
if [[ ! -d "$BUILD_DIR" ]]; then
echo "Error: El directorio build/ no existe en: $BUILD_DIR"
echo "Ejecuta primero: cmake -B build && cmake --build build"
exit 1
fi
echo "Proyecto: $PROJECT_DIR"
echo "Fuentes: $SOURCE_DIR"
echo "Build: $BUILD_DIR"
echo
# Si se especificaron archivos, procesarlos directamente
if [[ ${#FILES[@]} -gt 0 ]]; then
echo "=== Procesando ${#FILES[@]} archivo(s) específico(s) ==="
# Validar y procesar cada archivo
VALID_FILES=()
for file in "${FILES[@]}"; do
# Convertir a ruta absoluta si es relativa
if [[ ! "$file" = /* ]]; then
file="$PROJECT_DIR/$file"
fi
# Verificar que existe
if [[ ! -f "$file" ]]; then
echo "Advertencia: Archivo no encontrado: $file (omitiendo)"
continue
fi
# Verificar extensión
if [[ "$file" =~ \.(cpp|hpp|h)$ ]]; then
VALID_FILES+=("$file")
else
echo "Advertencia: Archivo no es C++: $file (omitiendo)"
fi
done
# Si no hay archivos válidos, salir
if [[ ${#VALID_FILES[@]} -eq 0 ]]; then
echo "Error: No hay archivos válidos para procesar"
exit 1
fi
echo
# Procesar archivos en paralelo
printf '%s\n' "${VALID_FILES[@]}" | \
xargs -P4 -I{} bash -c 'echo "Procesando: {}"; clang-tidy {} -p '"$BUILD_DIR"' '"$FIX_FLAG"
echo
echo "¡Proceso completado para ${#VALID_FILES[@]} archivo(s)!"
else
# Comportamiento original: procesar todos los archivos
echo "=== Escaneando recursivamente source/ (excluyendo external/) ==="
find "$SOURCE_DIR" \( -name '*.cpp' -o -name '*.h' -o -name '*.hpp' \) -not -path "*/external/*" -print0 | \
xargs -0 -P4 -I{} bash -c 'echo "Procesando: {}"; clang-tidy {} -p '"$BUILD_DIR"' '"$FIX_FLAG"
echo
echo "¡Proceso completado para todos los archivos!"
fi