Files

107 lines
3.4 KiB
Markdown

# gitswarm
TUI para listar y actualizar repos git de primer nivel dentro de una carpeta. Soporta muchos repos (paginación automática) y nunca se bloquea pidiendo credenciales.
## Uso
```bash
gitswarm /ruta/a/escanear
```
Te muestra una tabla paginada con todos los repos detectados y un cursor para navegarlos. La paginación se ajusta sola al alto del terminal.
### Atajos
| Tecla | Acción |
|---|---|
| `↑` `↓` `j` `k` | mover cursor |
| `←` `→` `h` `l` | cambiar de página |
| `g` `G` | inicio / final |
| `Space` | marcar/desmarcar el repo bajo el cursor |
| `a` `n` | marcar todos los que estén behind / desmarcar todos |
| `Enter` | `git pull --ff-only` en los marcados (en paralelo) |
| `s` | mostrar `git status` del repo bajo cursor |
| `c` | commit en el repo bajo cursor (`git add -A` + mensaje) |
| `r` | refrescar (re-fetch) |
| `?` | ayuda |
| `q` | salir (también `Ctrl-C` / `Ctrl-D`) |
El estado se calcula con `git fetch` al arrancar y en cada `refresh`. `Enter` aborta cualquier repo con cambios locales sin commitear.
## Robustez de red
gitswarm **nunca se cuelga**: ejecuta git con timeouts cortos (SSH `ConnectTimeout=5`, HTTP aborta si no llegan datos en 10s, fetch global cap de 30s), `GIT_TERMINAL_PROMPT=0` y askpass desactivado. Cada repo problemático se marca y se pasa al siguiente:
- 🔒 **`auth`** — el repo necesita credenciales que no están configuradas.
- 🔌 **`sin red`** — el host del remote no resuelve, no responde o tarda demasiado.
- **`ERROR: …`** — fallo de git distinto a los anteriores.
## Credenciales (repos privados)
Para que funcionen los repos privados, configura un credential helper de git **una sola vez** (no es trabajo de gitswarm, esto es la forma estándar de git):
```bash
# Opción 1 — store sencillo en disco (~/.git-credentials, sin cifrar):
git config --global credential.helper store
# Opción 2 — libsecret (gnome-keyring, KDE wallet, etc., recomendado en Linux):
sudo apt install libsecret-1-0 libsecret-1-dev
sudo make -C /usr/share/doc/git/contrib/credential/libsecret
git config --global credential.helper /usr/share/doc/git/contrib/credential/libsecret/git-credential-libsecret
```
La primera vez que hagas `git pull` a mano sobre un repo privado, git te pedirá usuario/token y el helper lo guardará. A partir de ahí gitswarm puede actualizarlo sin intervención.
Para repos por SSH lo equivalente es tener la clave cargada en `ssh-agent`.
## Requisitos en el sistema
Necesarios siempre:
- `python3` (≥ 3.10)
- `git`
Para desarrollar (con venv y dependencias pip-installed):
- `python3-venv`
Para compilar a binario con Nuitka (`./build.sh`):
- `python3-dev` — cabeceras `Python.h`
- `gcc` — compilador C
- `patchelf` — necesario para el modo `--onefile` en Linux
En Debian/Ubuntu:
```bash
sudo apt install python3 python3-venv python3-dev git gcc patchelf
```
## Desarrollo (con venv)
```bash
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/python gitswarm.py /ruta/a/escanear
```
## Compilar a binario standalone
```bash
./build.sh
```
Genera `dist/gitswarm`, un único ejecutable autocontenido (lleva Python + rich + readchar dentro). Para instalarlo en tu PATH:
```bash
cp dist/gitswarm ~/.local/bin/
```
## Ficheros
- `gitswarm.py` — script principal
- `requirements.txt` — dependencias Python (`rich`, `readchar`)
- `build.sh` — compila el binario con Nuitka
- `.venv/` — virtualenv local (no en git)
- `dist/` — binarios compilados (no en git)