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