#!/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. ] # # 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 . # 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:" FORGEJO_BASE_URL=$(echo "$FORGEJO_API_URL" | sed -E 's|/api/v1||') echo "1. Inicie sesión en $FORGEJO_BASE_URL" 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 -E 's|https?://([^/]+)/.*|\1|') if ping -c 1 -W 2 "$FORGEJO_HOST" > /dev/null 2>&1; then echo " ✓ Conectividad básica OK" echo " ℹ Comprobando servicio en puerto 443..." # Verificar puertos web abiertos (HTTP y HTTPS) if nc -z -w 2 "$FORGEJO_HOST" 80 2>/dev/null; then echo " ✓ Puerto 80 (HTTP) accesible" echo " ℹ Intentando conexión HTTP..." CURL_OUTPUT=$(mktemp) curl -s -v -o "$CURL_OUTPUT" --connect-timeout 5 "http://$FORGEJO_HOST/api/v1/version" 2>&1 | grep -i "HTTP\|ssl\|TLS\|error" cat "$CURL_OUTPUT" 2>/dev/null | head -10 rm -f "$CURL_OUTPUT" 2>/dev/null fi if nc -z -w 2 "$FORGEJO_HOST" 443 2>/dev/null; then echo " ✓ Puerto 443 (HTTPS) accesible" echo " ℹ Intentando conexión HTTPS segura..." CURL_OUTPUT=$(mktemp) curl -s -v -o "$CURL_OUTPUT" --connect-timeout 5 "https://$FORGEJO_HOST/api/v1/version" 2>&1 | grep -i "HTTP\|ssl\|TLS\|error" echo " ℹ Intentando conexión HTTPS ignorando certificado..." curl -s -v -k -o "$CURL_OUTPUT" --connect-timeout 5 "https://$FORGEJO_HOST/api/v1/version" 2>&1 | grep -i "HTTP\|ssl\|TLS\|error" cat "$CURL_OUTPUT" 2>/dev/null | head -10 rm -f "$CURL_OUTPUT" 2>/dev/null else echo " ✗ Puerto 443 (HTTPS) no accesible" fi else echo " ✗ No se puede conectar con el servidor $FORGEJO_HOST" echo " ℹ Comprobando posible problema de DNS..." host "$FORGEJO_HOST" 2>/dev/null && echo " ✓ Resolución DNS OK" || echo " ✗ Problema de resolución DNS" fi # 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