[IMPROVED] Depuración y manejo de errores en la función forgejo_create_project

- Añadidas verificaciones preliminares de conectividad a la API
- Validación del token antes de crear el repositorio
- Mejor extracción de URL (con fallback a html_url)
- Instrucciones detalladas para generar token en Forgejo
- Diagnóstico mejorado cuando falla la creación del proyecto

🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Mauro Rosero P. 2025-03-13 12:04:49 -05:00
parent 07c4be3c19
commit 46d3be29ed
Signed by: mrosero
GPG key ID: 83BD2A5F674B7E26
2 changed files with 93 additions and 11 deletions

View file

@ -136,15 +136,18 @@ RESULT=$?
case $RESULT in case $RESULT in
0) 0)
echo "Proyecto creado exitosamente en Forgejo." echo "Proyecto creado exitosamente en Forgejo."
if [ -n "$PROJECT_PATH" ]; then if [ -f "$HOME/.developer/${PROJECT_NAME}.repo" ]; then
echo "El repositorio local ha sido configurado y enlazado con Forgejo."
REPO_URL=$(cat "$HOME/.developer/${PROJECT_NAME}.repo") REPO_URL=$(cat "$HOME/.developer/${PROJECT_NAME}.repo")
echo "URL del repositorio: $REPO_URL" if [ -n "$PROJECT_PATH" ]; then
echo "El repositorio local ha sido configurado y enlazado con Forgejo."
echo "URL del repositorio: $REPO_URL"
else
echo "URL del repositorio: $REPO_URL"
echo "Para clonar el repositorio:"
echo " git clone $REPO_URL"
fi
else else
REPO_URL=$(cat "$HOME/.developer/${PROJECT_NAME}.repo") echo "AVISO: No se pudo obtener la URL del repositorio."
echo "URL del repositorio: $REPO_URL"
echo "Para clonar el repositorio:"
echo " git clone $REPO_URL"
fi fi
;; ;;
10) 10)
@ -157,10 +160,52 @@ case $RESULT in
12) 12)
echo "Error: Token de Forgejo no disponible o inválido." echo "Error: Token de Forgejo no disponible o inválido."
echo "Por favor, verifique o actualice su token en: $FORGEJO_CONFIG_FILE" echo "Por favor, verifique o actualice su token en: $FORGEJO_CONFIG_FILE"
# Verificar mensaje de error
if [ -f "$HOME/.developer/${PROJECT_NAME}.error" ]; then
echo "Detalles del error:"
cat "$HOME/.developer/${PROJECT_NAME}.error"
fi
echo ""
echo "Para generar un nuevo token en Forgejo:"
echo "1. Inicie sesión en $FORGEJO_API_URL (sin '/api/v1')"
echo "2. Vaya a Configuración → Aplicaciones"
echo "3. Genere un nuevo token de acceso personal"
echo "4. Asegúrese de darle permisos de lectura/escritura para repositorios"
;; ;;
13) 13)
echo "Error: No se pudo crear el proyecto en Forgejo." echo "Error: No se pudo crear el proyecto en Forgejo."
echo "Detalles del error disponibles en: $HOME/.developer/${PROJECT_NAME}.error" echo "Comprobando posibles problemas:"
# Verificar configuración
if [ -f "$FORGEJO_CONFIG_FILE" ]; then
echo "✓ Archivo de configuración encontrado en: $FORGEJO_CONFIG_FILE"
echo "✓ Verificando token..."
# No mostramos el token por seguridad, solo si existe
grep -q "FORGEJO_TOKEN=" "$FORGEJO_CONFIG_FILE" && echo " ✓ Token encontrado" || echo " ✗ Token no encontrado"
else
echo "✗ Archivo de configuración no encontrado"
fi
# Verificar conectividad
echo "✓ Probando conectividad con Forgejo..."
FORGEJO_HOST=$(echo "$FORGEJO_API_URL" | sed 's|^https\?://||' | cut -d'/' -f1)
ping -c 1 "$FORGEJO_HOST" > /dev/null 2>&1 && echo " ✓ Conectividad OK" || echo " ✗ No se puede conectar con el servidor"
# Verificar errores de curl
if [ -f "/tmp/curl_error.log" ]; then
echo "✓ Detalles de la solicitud:"
cat /tmp/curl_error.log
fi
# Verificar mensaje de error
if [ -f "$HOME/.developer/${PROJECT_NAME}.error" ]; then
echo "✓ Respuesta de error del servidor:"
cat "$HOME/.developer/${PROJECT_NAME}.error"
else
echo "✗ No se guardó respuesta de error"
fi
;; ;;
*) *)
echo "Error desconocido (código $RESULT)." echo "Error desconocido (código $RESULT)."

View file

@ -316,6 +316,12 @@ function forgejo_create_project() {
# Si el archivo no existe, preguntar por token # Si el archivo no existe, preguntar por token
if [ -t 0 ]; then # Solo si es terminal interactiva if [ -t 0 ]; then # Solo si es terminal interactiva
echo "Archivo de configuración de Forgejo no encontrado." echo "Archivo de configuración de Forgejo no encontrado."
echo ""
echo "Para generar un token en Forgejo:"
echo "1. Inicie sesión en $FORGEJO_API_URL (sin '/api/v1')"
echo "2. Vaya a Configuración → Aplicaciones"
echo "3. Genere un nuevo token de acceso personal con permisos de 'repo'"
echo ""
read -p "Ingrese su token de acceso de Forgejo: " FORGEJO_TOKEN read -p "Ingrese su token de acceso de Forgejo: " FORGEJO_TOKEN
echo "FORGEJO_TOKEN=$FORGEJO_TOKEN" > "$FORGEJO_CONFIG_FILE" echo "FORGEJO_TOKEN=$FORGEJO_TOKEN" > "$FORGEJO_CONFIG_FILE"
chmod 600 "$FORGEJO_CONFIG_FILE" # Restricción de permisos por seguridad chmod 600 "$FORGEJO_CONFIG_FILE" # Restricción de permisos por seguridad
@ -338,17 +344,48 @@ function forgejo_create_project() {
# Preparar datos para la API # Preparar datos para la API
local API_DATA="{\"name\":\"$PROJECT_NAME\",\"description\":\"$PROJECT_DESC\",\"private\":$([ "$VISIBILITY" == "private" ] && echo "true" || echo "false")}" local API_DATA="{\"name\":\"$PROJECT_NAME\",\"description\":\"$PROJECT_DESC\",\"private\":$([ "$VISIBILITY" == "private" ] && echo "true" || echo "false")}"
# Comprobar si podemos acceder a la API
local API_STATUS=$(curl -s -o /dev/null -w "%{http_code}" "$FORGEJO_API_URL/version")
if [ "$API_STATUS" != "200" ]; then
echo "ERROR: No se puede acceder a la API de Forgejo. Código de estado: $API_STATUS" >&2
echo "{\"error\":\"No se puede acceder a la API. Código: $API_STATUS\"}" > "$HOME/.developer/${PROJECT_NAME}.error"
return 13
fi
# Verificar token
local TOKEN_CHECK=$(curl -s -o /dev/null -w "%{http_code}" -H "Authorization: token $FORGEJO_TOKEN" "$FORGEJO_API_URL/user")
if [ "$TOKEN_CHECK" != "200" ]; then
echo "ERROR: Token inválido o sin acceso. Código de estado: $TOKEN_CHECK" >&2
echo "{\"error\":\"Token inválido o sin acceso. Código: $TOKEN_CHECK\"}" > "$HOME/.developer/${PROJECT_NAME}.error"
return 12
fi
# Llamar a la API de Forgejo para crear el repositorio # Llamar a la API de Forgejo para crear el repositorio
local API_RESPONSE=$(curl -s -X POST "$FORGEJO_API_URL/user/repos" \ local API_RESPONSE=$(curl -s -X POST "$FORGEJO_API_URL/user/repos" \
-H "Authorization: token $FORGEJO_TOKEN" \ -H "Authorization: token $FORGEJO_TOKEN" \
-H "Content-Type: application/json" \ -H "Content-Type: application/json" \
-d "$API_DATA") -d "$API_DATA" 2>/tmp/curl_error.log)
echo "DEBUG: Respuesta API: $API_RESPONSE" >&2
# Verificar respuesta # Verificar respuesta
if echo "$API_RESPONSE" | grep -q "\"id\":[0-9]*"; then if echo "$API_RESPONSE" | grep -q "\"id\":[0-9]*"; then
local REPO_URL=$(echo "$API_RESPONSE" | grep -o '"clone_url":"[^"]*"' | cut -d'"' -f4) local REPO_URL=$(echo "$API_RESPONSE" | grep -o '"clone_url":"[^"]*"' | cut -d'"' -f4)
echo "$REPO_URL" > "$HOME/.developer/${PROJECT_NAME}.repo" if [ -n "$REPO_URL" ]; then
echo "$REPO_URL" > "$HOME/.developer/${PROJECT_NAME}.repo"
else
# Extraer HTML URL como fallback
REPO_URL=$(echo "$API_RESPONSE" | grep -o '"html_url":"[^"]*"' | head -1 | cut -d'"' -f4)
if [ -n "$REPO_URL" ]; then
echo "$REPO_URL" > "$HOME/.developer/${PROJECT_NAME}.repo"
else
echo "ERROR: No se pudo extraer la URL del repositorio." >&2
echo "$API_RESPONSE" > "$HOME/.developer/${PROJECT_NAME}.error"
return 14
fi
fi
# Si se proporcionó una ruta local, configurar el repositorio # Si se proporcionó una ruta local, configurar el repositorio
if [ -n "$PROJECT_PATH" ] && [ -d "$PROJECT_PATH" ]; then if [ -n "$PROJECT_PATH" ] && [ -d "$PROJECT_PATH" ]; then