# 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)