espejar-repos: mostrar el error de `gh` y cortar ante el límite de la API
Corrida real contra gioser: los 21 repos fallaron al crearse y el guión dijo «no se pudo crear» A SECAS, porque mandaba el stderr de `gh` a /dev/null. La causa era el LÍMITE DE LA API DE GITHUB agotado —que se resuelve esperando— y sin el mensaje eso parecía un problema de permisos, de nombre o del propio guión: hubo que reproducirlo a mano para enterarse de algo que la herramienta ya sabía. Dos arreglos: · El error de `gh` se muestra, recortado a su primera línea. · Ante «rate limit» se CORTA en el primero: los 20 restantes van a fallar igual y cada intento gasta cuota. Dice a qué hora se repone (leído de `gh api rate_limit`) y recuerda que reintentar es seguro, porque el guión es idempotente. No quedó estado parcial de la corrida fallida: el `pushurl` se agrega DESPUÉS de crear el repo, así que los 21 clones siguen con su remoto original intacto. Verificado en tres de ellos. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RomoxEGZUhaT4pob1QSX5x
Semantic delta
No definition changed: this change is text, documentation or data.
1 files · +20 −2
diff --git a/scripts/mudanza/espejar-repos.sh b/scripts/mudanza/espejar-repos.sh
index d85a5d47..ea39ab26 100755
--- a/scripts/mudanza/espejar-repos.sh
+++ b/scripts/mudanza/espejar-repos.sh
@@ -146,8 +146,26 @@ for c in "${CANDIDATOS[@]}"; do
[ "$APPLY" = 1 ] || continue
if ! gh repo view "$OWNER/$nombre" >/dev/null 2>&1; then
- if ! gh repo create "$OWNER/$nombre" --private >/dev/null 2>&1; then
- echo " ✗ no se pudo crear $OWNER/$nombre"; fallos=$((fallos+1)); continue
+ # ⚠ El error de `gh` se MUESTRA. La primera versión lo mandaba a /dev/null y decía «no se pudo
+ # crear» a secas: los 21 fallaron y el guión no daba ni una pista de por qué. Era el límite de
+ # la API de GitHub agotado —cosa que se resuelve esperando— y sin el mensaje eso parecía un
+ # problema de permisos, de nombre o del propio guión. Un fallo sin su motivo obliga a
+ # reproducirlo a mano para enterarse de algo que la herramienta ya sabía.
+ err="$(gh repo create "$OWNER/$nombre" --private 2>&1)"
+ if [ $? -ne 0 ] || [ -n "${err##*}" ] && ! gh repo view "$OWNER/$nombre" >/dev/null 2>&1; then
+ echo " ✗ no se pudo crear $OWNER/$nombre: ${err%%$'\n'*}"
+ fallos=$((fallos+1))
+ # Contra el límite de la API no sirve seguir intentando: los 20 restantes van a fallar igual y
+ # cada intento gasta cuota. Se corta y se dice cuándo se puede reintentar.
+ case "$err" in *"rate limit"*|*"RATE_LIMITED"*)
+ reset="$(gh api rate_limit --jq '.resources.graphql.reset // .resources.core.reset' 2>/dev/null)"
+ echo
+ echo " ✗ LÍMITE DE LA API DE GITHUB AGOTADO — no se intenta con los demás."
+ [ -n "$reset" ] && echo " se repone a las $(date -d "@$reset" +%H:%M 2>/dev/null)."
+ echo " Reintentá con el mismo comando: es idempotente, no repite lo ya hecho."
+ exit 1;;
+ esac
+ continue
fi
echo " · repo privado creado"
fi