Sistema de git hooks per verificar qualitat de codi automàticament: Hooks implementats: - pre-commit: Executa clang-format + clang-tidy en arxius modificats - 🎨 clang-format: Formata automàticament el codi - 🔍 clang-tidy: Verifica errors i bloqueja commit si n'hi ha Característiques: - ✅ Només revisa arxius modificats (ràpid) - ✅ Auto-formata amb clang-format i afegeix canvis al commit - ✅ Bloqueja commits amb errors de clang-tidy - ✅ Exclou directoris audio/ i legacy/ automàticament - ✅ Rutes dinàmiques (funciona en qualsevol màquina) Instal·lació: ./tools/hooks/install.sh O manual: cp tools/hooks/pre-commit .git/hooks/ chmod +x .git/hooks/pre-commit Documentació completa: tools/hooks/README.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
250 lines
6.2 KiB
Markdown
250 lines
6.2 KiB
Markdown
# 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 <archivos> && 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 <repo-url>
|
|
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
|
|
```
|