107 lines
3.4 KiB
Markdown
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)
|