devs/bin/forgejo_project.sh
Mauro Rosero P. 46d3be29ed
[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>
2025-03-13 12:04:49 -05:00

215 lines
No EOL
7.1 KiB
Bash
Executable file

#!/bin/bash
#
# Script: forgejo_project.sh
# Description: Crea un proyecto en Forgejo y configura el repositorio local
# Modified: 2025-03-13 14:20:00
# Derechos de Autor (C) [2025] [Mauro Rosero P. <mauro@rosero.one>]
#
# Este programa es software libre: usted puede redistribuirlo y/o modificarlo
# bajo los términos de la Licencia Pública Affero General de GNU tal como
# lo publica la Free Software Foundation, ya sea la versión 3 de la licencia,
# o (a su elección) cualquier versión posterior.
#
# Este programa se distribuye con la esperanza de que sea útil,
# pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de
# COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte la
# Licencia Pública Affero General de GNU para obtener más detalles.
#
# Debería haber recibido una copia de la Licencia Pública Affero General
# junto con este programa. Si no la recibió, consulte <https://www.gnu.org/licenses/>.
# Directorios base
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BASE_DIR="$(dirname "$SCRIPT_DIR")"
CONFIG_DIR="$SCRIPT_DIR/config"
LIB_DIR="$SCRIPT_DIR/lib"
MSG_DIR="$SCRIPT_DIR/msg"
# Cargar libraries
source "$LIB_DIR/base.lib"
source "$LIB_DIR/console.lib"
source "$LIB_DIR/developers.lib"
source "$MSG_DIR/head.es"
# Función para mostrar ayuda
function show_help() {
echo "Uso: $0 [opciones]"
echo ""
echo "Crea un nuevo proyecto en Forgejo y opcionalmente lo vincula con un repositorio local."
echo ""
echo "Opciones:"
echo " -n, --name NOMBRE Nombre del proyecto (obligatorio)"
echo " -d, --desc DESCRIPCION Descripción del proyecto (obligatorio)"
echo " -p, --path RUTA Ruta local del proyecto (opcional)"
echo " -v, --visibility TIPO Visibilidad: 'public' o 'private' (por defecto: private)"
echo " -h, --help Muestra esta ayuda"
echo ""
echo "Ejemplos:"
echo " $0 --name mi-proyecto --desc \"Mi nuevo proyecto\" --visibility public"
echo " $0 -n mi-proyecto -d \"Mi nuevo proyecto\" -p /ruta/al/proyecto"
}
# Variables para los argumentos
PROJECT_NAME=""
PROJECT_DESC=""
PROJECT_PATH=""
VISIBILITY="private"
# Procesar argumentos
while [[ $# -gt 0 ]]; do
case $1 in
-n|--name)
PROJECT_NAME="$2"
shift 2
;;
-d|--desc)
PROJECT_DESC="$2"
shift 2
;;
-p|--path)
PROJECT_PATH="$2"
shift 2
;;
-v|--visibility)
VISIBILITY="$2"
shift 2
;;
-h|--help)
show_help
exit 0
;;
*)
echo "Error: Opción desconocida $1"
show_help
exit 1
;;
esac
done
# Verificar argumentos obligatorios
if [ -z "$PROJECT_NAME" ]; then
echo "Error: Debe especificar un nombre de proyecto con --name"
show_help
exit 1
fi
if [ -z "$PROJECT_DESC" ]; then
echo "Error: Debe especificar una descripción de proyecto con --desc"
show_help
exit 1
fi
# Verificar ruta del proyecto si se proporciona
if [ -n "$PROJECT_PATH" ] && [ ! -d "$PROJECT_PATH" ]; then
echo "Error: La ruta del proyecto especificada no existe: $PROJECT_PATH"
exit 1
fi
# Validar visibilidad
if [ "$VISIBILITY" != "private" ] && [ "$VISIBILITY" != "public" ]; then
echo "Advertencia: Valor de visibilidad inválido. Usando 'private' por defecto."
VISIBILITY="private"
fi
# Mostrar confirmación
echo "Creando proyecto en Forgejo:"
echo " Nombre: $PROJECT_NAME"
echo " Descripción: $PROJECT_DESC"
echo " Visibilidad: $VISIBILITY"
if [ -n "$PROJECT_PATH" ]; then
echo " Ruta local: $PROJECT_PATH"
fi
echo ""
# Preguntar confirmación
read -p "¿Desea continuar? (s/n): " CONFIRM
if [[ ! "$CONFIRM" =~ ^[Ss]$ ]]; then
echo "Operación cancelada."
exit 0
fi
# Crear el proyecto en Forgejo
forgejo_create_project "$PROJECT_NAME" "$PROJECT_DESC" "$VISIBILITY" "$PROJECT_PATH"
RESULT=$?
# Manejar resultado
case $RESULT in
0)
echo "Proyecto creado exitosamente en Forgejo."
if [ -f "$HOME/.developer/${PROJECT_NAME}.repo" ]; then
REPO_URL=$(cat "$HOME/.developer/${PROJECT_NAME}.repo")
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
echo "AVISO: No se pudo obtener la URL del repositorio."
fi
;;
10)
echo "Error: Faltan parámetros obligatorios."
;;
11)
echo "Error: No se pudo configurar el acceso a Forgejo."
echo "Ejecute este script en modo interactivo para configurar su token de acceso."
;;
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 "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)."
;;
esac
exit $RESULT