v1.2.0: TUI paginat, timeouts de xarxa i barres de progrés
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# gitswarm
|
||||
|
||||
Lista y actualiza repos git de primer nivel dentro de una carpeta. REPL interactivo con colores y tabla.
|
||||
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
|
||||
|
||||
@@ -8,16 +8,51 @@ Lista y actualiza repos git de primer nivel dentro de una carpeta. REPL interact
|
||||
gitswarm /ruta/a/escanear
|
||||
```
|
||||
|
||||
Te muestra una tabla con los repos detectados y entra a un prompt:
|
||||
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.
|
||||
|
||||
- `list` / `ls` — vuelve a mostrar la tabla
|
||||
- `refresh` / `r` — re-escanea haciendo `git fetch`
|
||||
- `update <repo>` — `git pull --ff-only` (acepta nº, nombre exacto o fragmento)
|
||||
- `update all` — actualiza todos los que estén behind
|
||||
- `help` / `?`
|
||||
- `quit` / `q` (también Ctrl-D / Ctrl-C)
|
||||
### Atajos
|
||||
|
||||
El estado se calcula con `git fetch` al arrancar y al hacer `refresh`. `update` aborta si el repo tiene cambios locales sin commitear.
|
||||
| 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
|
||||
|
||||
@@ -26,7 +61,7 @@ Necesarios siempre:
|
||||
- `python3` (≥ 3.10)
|
||||
- `git`
|
||||
|
||||
Para desarrollar (con venv y rich pip-installed):
|
||||
Para desarrollar (con venv y dependencias pip-installed):
|
||||
|
||||
- `python3-venv`
|
||||
|
||||
@@ -47,7 +82,7 @@ sudo apt install python3 python3-venv python3-dev git gcc patchelf
|
||||
```bash
|
||||
python3 -m venv .venv
|
||||
.venv/bin/pip install -r requirements.txt
|
||||
./gitswarm /ruta/a/escanear # wrapper que usa el venv
|
||||
.venv/bin/python gitswarm.py /ruta/a/escanear
|
||||
```
|
||||
|
||||
## Compilar a binario standalone
|
||||
@@ -56,7 +91,7 @@ python3 -m venv .venv
|
||||
./build.sh
|
||||
```
|
||||
|
||||
Genera `dist/gitswarm`, un único ejecutable autocontenido (lleva Python + rich dentro). Para instalarlo en tu PATH:
|
||||
Genera `dist/gitswarm`, un único ejecutable autocontenido (lleva Python + rich + readchar dentro). Para instalarlo en tu PATH:
|
||||
|
||||
```bash
|
||||
cp dist/gitswarm ~/.local/bin/
|
||||
@@ -65,8 +100,7 @@ cp dist/gitswarm ~/.local/bin/
|
||||
## Ficheros
|
||||
|
||||
- `gitswarm.py` — script principal
|
||||
- `gitswarm` — wrapper bash que invoca el venv local (para desarrollo)
|
||||
- `requirements.txt` — dependencias Python (`rich`)
|
||||
- `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)
|
||||
|
||||
Reference in New Issue
Block a user