diff --git a/bin/forgejo_project.sh b/bin/forgejo_project.sh index 0d28a98..0444180 100755 --- a/bin/forgejo_project.sh +++ b/bin/forgejo_project.sh @@ -136,15 +136,18 @@ RESULT=$? case $RESULT in 0) echo "Proyecto creado exitosamente en Forgejo." - if [ -n "$PROJECT_PATH" ]; then - echo "El repositorio local ha sido configurado y enlazado con Forgejo." + if [ -f "$HOME/.developer/${PROJECT_NAME}.repo" ]; then 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 - REPO_URL=$(cat "$HOME/.developer/${PROJECT_NAME}.repo") - echo "URL del repositorio: $REPO_URL" - echo "Para clonar el repositorio:" - echo " git clone $REPO_URL" + echo "AVISO: No se pudo obtener la URL del repositorio." fi ;; 10) @@ -157,10 +160,52 @@ case $RESULT in 12) echo "Error: Token de Forgejo no disponible o inválido." 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) 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)." diff --git a/bin/lib/developers.lib b/bin/lib/developers.lib index c8223eb..388fa1e 100644 --- a/bin/lib/developers.lib +++ b/bin/lib/developers.lib @@ -316,6 +316,12 @@ function forgejo_create_project() { # Si el archivo no existe, preguntar por token if [ -t 0 ]; then # Solo si es terminal interactiva 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 echo "FORGEJO_TOKEN=$FORGEJO_TOKEN" > "$FORGEJO_CONFIG_FILE" chmod 600 "$FORGEJO_CONFIG_FILE" # Restricción de permisos por seguridad @@ -338,17 +344,48 @@ function forgejo_create_project() { # Preparar datos para la API 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 local API_RESPONSE=$(curl -s -X POST "$FORGEJO_API_URL/user/repos" \ -H "Authorization: token $FORGEJO_TOKEN" \ -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 if echo "$API_RESPONSE" | grep -q "\"id\":[0-9]*"; then 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 if [ -n "$PROJECT_PATH" ] && [ -d "$PROJECT_PATH" ]; then