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
This commit is contained in:
Sergio
2026-09-13 20:03:17 +00:00
co-authored by Claude Opus 5
parent df1230d2a5
commit 1fc9de6a01
+20 -2
View File
@@ -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