# Git Hooks - Orni Attack Este directorio contiene los **git hooks** versionados para el proyecto Orni Attack. Los hooks permiten ejecutar automáticamente verificaciones de calidad de código antes de hacer commits. --- ## 📦 Instalación ### Instalación automática (recomendada) Ejecuta el script de instalación desde la raíz del proyecto: ```bash ./tools/hooks/install.sh ``` ### Instalación manual ```bash cp tools/hooks/pre-commit .git/hooks/ chmod +x .git/hooks/pre-commit ``` --- ## 🔍 Hooks disponibles ### `pre-commit` **Se ejecuta automáticamente antes de cada commit.** Realiza dos verificaciones en los archivos `.cpp` y `.hpp` modificados: #### 1. 🎨 clang-format (formato de código) - **Acción**: Formatea automáticamente el código según `.clang-format` - **Comportamiento**: Si encuentra problemas de formato, los arregla automáticamente y añade los cambios al commit - **Resultado**: Código siempre bien formateado sin esfuerzo manual #### 2. 🔍 clang-tidy (análisis estático) - **Acción**: Verifica el código según las reglas de `.clang-tidy` - **Comportamiento**: - ✅ Si no hay errores → commit permitido - ❌ Si hay errores → commit **bloqueado** y muestra los errores - **Resultado**: Previene commits con problemas de calidad --- ## 📋 Ejemplo de uso ```bash # 1. Modificas código vim source/game/entities/nau.cpp # 2. Añades al staging git add source/game/entities/nau.cpp # 3. Intentas commit git commit -m "feat: añadir nueva funcionalidad" # → El hook se ejecuta automáticamente: 🔍 Pre-commit hook: verificando código... 📝 Archivos a revisar: source/game/entities/nau.cpp 🎨 Ejecutando clang-format... ✏️ Formateado: source/game/entities/nau.cpp ✅ Archivos formateados automáticamente y añadidos al commit 🔍 Ejecutando clang-tidy... ✅ source/game/entities/nau.cpp ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ✅ Pre-commit hook: TODO OK ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🎨 clang-format: OK (archivos formateados) 🔍 clang-tidy: OK (sin errores) [main abc1234] feat: añadir nueva funcionalidad 1 file changed, 10 insertions(+) ``` --- ## ❌ ¿Qué pasa si hay errores? Si clang-tidy encuentra errores, el hook **bloquea el commit** y te muestra: ```bash ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ❌ COMMIT BLOQUEADO: clang-tidy encontró errores ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ❌ Errores en source/game/entities/nau.cpp: source/game/entities/nau.cpp:42:10: error: method 'getPosition' can be made const ^ const 💡 Soluciones: 1. Corrige los errores manualmente 2. O ejecuta: make tidy (aplica fixes automáticos) 3. Luego: git add && git commit ⚠️ Si necesitas saltarte el hook (NO RECOMENDADO): git commit --no-verify ``` ### Soluciones **Opción 1: Arreglar manualmente** Edita el archivo y corrige los errores que muestra clang-tidy. **Opción 2: Auto-fix con make tidy** ```bash make tidy # Aplica fixes automáticos git add . # Añade los cambios git commit -m "..." # Intenta commit de nuevo ``` **Opción 3: Saltar el hook (NO RECOMENDADO)** ```bash git commit --no-verify -m "mensaje" ``` ⚠️ **Solo usa `--no-verify` en casos excepcionales**, ya que permite commits con código de baja calidad. --- ## 🚀 Ventajas ✅ **Solo código nuevo**: Revisa únicamente archivos modificados (rápido) ✅ **Automático**: No tienes que acordarte de ejecutar clang-tidy ✅ **Formato automático**: clang-format arregla el código por ti ✅ **Bloquea errores**: Previene commits con problemas de calidad ✅ **No ralentiza compilación**: Solo se ejecuta en commits, no en `make` ✅ **Excluye código externo**: Ignora automáticamente `audio/` y `legacy/` --- ## 🔧 Configuración Los hooks usan las configuraciones del proyecto: - **`.clang-format`**: Reglas de formato de código - **`.clang-tidy`**: Reglas de análisis estático - **`CMakeLists.txt`**: Exclusiones de directorios (audio/, legacy/) Si modificas estas configuraciones, los hooks aplicarán automáticamente las nuevas reglas. --- ## 🗑️ Desinstalación Para desinstalar el hook: ```bash rm .git/hooks/pre-commit ``` O para deshabilitarlo temporalmente: ```bash mv .git/hooks/pre-commit .git/hooks/pre-commit.disabled ``` Para volver a habilitarlo: ```bash mv .git/hooks/pre-commit.disabled .git/hooks/pre-commit ``` --- ## 📚 Más información - **clang-format**: https://clang.llvm.org/docs/ClangFormat.html - **clang-tidy**: https://clang.llvm.org/extra/clang-tidy/ - **Git hooks**: https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks --- ## ⚠️ Nota para desarrolladores Los hooks de git están en `.git/hooks/` y **no se versionan automáticamente**. Por eso este directorio `tools/hooks/` contiene copias versionadas que se pueden instalar fácilmente. **Cada nuevo desarrollador debe ejecutar el instalador** al clonar el repositorio: ```bash git clone cd orni ./tools/hooks/install.sh ``` --- ## 🐛 Troubleshooting ### "clang-format: command not found" Instala clang-format: ```bash # macOS brew install clang-format # Ubuntu/Debian sudo apt install clang-format # Arch Linux sudo pacman -S clang ``` ### "clang-tidy: command not found" Instala clang-tidy: ```bash # macOS brew install llvm export PATH="/opt/homebrew/opt/llvm/bin:$PATH" # Ubuntu/Debian sudo apt install clang-tidy # Arch Linux sudo pacman -S clang ``` ### Hook no se ejecuta Verifica que el hook tiene permisos de ejecución: ```bash ls -la .git/hooks/pre-commit chmod +x .git/hooks/pre-commit ``` ### Errores en macOS sobre SDK El hook detecta automáticamente el SDK de macOS usando `xcrun --show-sdk-path`. Si falla, asegúrate de tener Command Line Tools instaladas: ```bash xcode-select --install ```