Compare commits
	
		
			12 commits
		
	
	
		
			f29bcb7940
			...
			cc5ae62213
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| cc5ae62213 | |||
| 53879c4475 | |||
| 4b38ced4c1 | |||
| 01249b92e4 | |||
| 18dfc368d5 | |||
| b90f8b33df | |||
| ebdb28bb93 | |||
| ea581b9e8c | |||
| 46d3be29ed | |||
| 07c4be3c19 | |||
| e9d054aad6 | |||
| dcf7658940 | 
					 8 changed files with 1273 additions and 19 deletions
				
			
		
							
								
								
									
										61
									
								
								CHANGELOG.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								CHANGELOG.md
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,61 @@ | ||||||
|  | # Changelog | ||||||
|  | 
 | ||||||
|  | Todos los cambios notables en el proyecto MRDevs Tools serán documentados en este archivo. | ||||||
|  | 
 | ||||||
|  | El formato está basado en [Keep a Changelog](https://keepachangelog.com/es-ES/1.0.0/), | ||||||
|  | y el proyecto adhiere a [Semantic Versioning](https://semver.org/spec/v2.0.0.html). | ||||||
|  | 
 | ||||||
|  | ## [Unreleased] | ||||||
|  | 
 | ||||||
|  | ## [1.1.0] - 2025-03-13 | ||||||
|  | 
 | ||||||
|  | ### Añadido | ||||||
|  | - Sistema de creación de proyectos estandarizados con `project_new.sh` | ||||||
|  | - Selector de tipo de servidor git (GitHub, GitLab, Gitea, Forgejo, None) al crear proyectos | ||||||
|  | - Archivos `.gitignore` específicos para cada tipo de proyecto | ||||||
|  | - Creación automática de carpeta `$HOME/.developer` para configuraciones de servidor git | ||||||
|  | - Soporte para nuevos tipos de proyectos: PHP, C, C++, C#, Rust | ||||||
|  | - Inclusión de carpeta `.developer` en respaldos del perfil del desarrollador | ||||||
|  | - Inicialización automática de repositorio git en nuevos proyectos | ||||||
|  | 
 | ||||||
|  | ### Mejorado | ||||||
|  | - Formato de fecha de modificación estandarizado con hora en encabezados de scripts | ||||||
|  | - Formato de autores en README y extracción automática de datos de git config | ||||||
|  | - Solicitud de descripción de proyecto y generación de README.md profesional | ||||||
|  | - Selección de licencia al crear nuevos proyectos | ||||||
|  | - Diálogos de selección con tamaños optimizados | ||||||
|  | 
 | ||||||
|  | ### Modificado | ||||||
|  | - Eliminación de scripts obsoletos (odoo_set.sh, project_create.sh) | ||||||
|  | - Renombrado de script de creación de proyectos a project_new.sh | ||||||
|  | - Cambio de nombre de archivo de tipo de proyecto a .protype | ||||||
|  | - Reducción de altura del diálogo de licencia | ||||||
|  | - Visualización de licencias de Odoo solo cuando el tipo de proyecto es Odoo | ||||||
|  | 
 | ||||||
|  | ### Corregido | ||||||
|  | - Ubicación de carpeta de proyectos dentro de directorio devs | ||||||
|  | - Mensaje cuando el proyecto ya existe | ||||||
|  | 
 | ||||||
|  | ### Documentación | ||||||
|  | - Actualización de README.md con nuevas funcionalidades | ||||||
|  | - Adición de Cortana como colaborador digital | ||||||
|  | - Ampliación de lista de etiquetas para mensajes de commit | ||||||
|  | - Información detallada sobre rate_update.py y cocomo.py | ||||||
|  | - Política de encabezados para archivos Python | ||||||
|  | 
 | ||||||
|  | ## [1.0.0] - 2025-03-01 | ||||||
|  | 
 | ||||||
|  | ### Añadido | ||||||
|  | - Sistema de mensajes multilingües | ||||||
|  | - Scripts básicos para bootstrap y actualizaciones | ||||||
|  | - Instalación y configuración de herramientas de desarrollo | ||||||
|  | - Herramientas para gestión de tarifas y estimación de costos | ||||||
|  | - Integración con Claude Code (Cortana) | ||||||
|  | - Respaldo y restauración de perfiles de desarrollador | ||||||
|  | - Soporte para múltiples sistemas operativos | ||||||
|  | 
 | ||||||
|  | ### Seguridad | ||||||
|  | - Implementación de encriptación para tokens y credenciales | ||||||
|  | - Gestión segura de información sensible con SOPS | ||||||
|  | 
 | ||||||
|  | _Nota: Este documento resume los cambios más importantes. Para un historial completo, consulte el registro de commits de git._ | ||||||
							
								
								
									
										34
									
								
								CLAUDE.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								CLAUDE.md
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,34 @@ | ||||||
|  | # MRDevs Tools Development Guide | ||||||
|  | 
 | ||||||
|  | ## Build & Installation Commands | ||||||
|  | - `bin/bootstrap.sh` - Install basic tools and container management | ||||||
|  | - `bin/update.sh` - Update development environment | ||||||
|  | - `bin/cortana_install.sh` - Install Claude Code CLI | ||||||
|  | - `bin/cortana_install.sh -u` - Uninstall Claude Code CLI | ||||||
|  | 
 | ||||||
|  | ## Code Style Guidelines | ||||||
|  | - **Shell Scripts**: | ||||||
|  |   - Add license header with copyright info (AGPL) | ||||||
|  |   - Include Modified date in comments | ||||||
|  |   - Use functions for modularity | ||||||
|  |   - Follow consistent variable naming (`UPPERCASE` for constants) | ||||||
|  |   - Document function purpose with comments | ||||||
|  |   - Include usage examples in script headers | ||||||
|  |   - Handle errors with proper exit codes | ||||||
|  | 
 | ||||||
|  | ## Development Practices | ||||||
|  | - Use `bin/lib/base.lib` for common functions | ||||||
|  | - Message files stored in `bin/msg/` (multilingual support) | ||||||
|  | - Configuration in `bin/config/` directory | ||||||
|  | - Use git commit messages with prefixes: [ADDED], [IMPROVED], [FIXED], [SOPS] | ||||||
|  | - Prefer podman over docker for container management | ||||||
|  | - All shell scripts (.sh) and Python scripts (.py) must be placed in the `bin/` directory unless explicitly specified otherwise | ||||||
|  | 
 | ||||||
|  | ## Authorship Policy | ||||||
|  | - For new projects created by Claude Code, use author: "Cortana Rosero One <cortana@rosero.one>" | ||||||
|  | - Include reference indicating generation by Claude Code and the version used | ||||||
|  | - Example header comment: | ||||||
|  |   ``` | ||||||
|  |   # [Author] Cortana Rosero One <cortana@rosero.one> | ||||||
|  |   # [Generated] Created by Claude Code (claude-3-7-sonnet-20250219) | ||||||
|  |   ``` | ||||||
							
								
								
									
										54
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										54
									
								
								README.md
									
									
									
									
									
								
							|  | @ -41,6 +41,7 @@ bin/update.sh | ||||||
| | `bin/bootstrap.sh` | Instala herramientas básicas y configura la gestión de contenedores | | | `bin/bootstrap.sh` | Instala herramientas básicas y configura la gestión de contenedores | | ||||||
| | `bin/update.sh` | Actualiza el entorno de desarrollo con las últimas funcionalidades | | | `bin/update.sh` | Actualiza el entorno de desarrollo con las últimas funcionalidades | | ||||||
| | `bin/npm_install.sh` | Instala NodeJS y npm de forma interactiva | | | `bin/npm_install.sh` | Instala NodeJS y npm de forma interactiva | | ||||||
|  | | `bin/project_new.sh` | Crea un nuevo proyecto con estructura estandarizada según el tipo seleccionado | | ||||||
| 
 | 
 | ||||||
| ### Herramientas de IA y Productividad | ### Herramientas de IA y Productividad | ||||||
| 
 | 
 | ||||||
|  | @ -72,14 +73,13 @@ bin/update.sh | ||||||
| 
 | 
 | ||||||
| | Comando | Descripción | | | Comando | Descripción | | ||||||
| |---------|-------------| | |---------|-------------| | ||||||
| | `bin/profile_backup.sh` | Realiza copia de seguridad del perfil del desarrollador | | | `bin/profile_backup.sh` | Realiza copia de seguridad del perfil del desarrollador (GPG, SSH, Git, y carpeta .developer) | | ||||||
| | `bin/profile_restore.sh <archivo>` | Restaura perfil desde copia de seguridad | | | `bin/profile_restore.sh <archivo>` | Restaura perfil desde copia de seguridad | | ||||||
| 
 | 
 | ||||||
| ### Desarrollo Especializado | ### Desarrollo Especializado | ||||||
| 
 | 
 | ||||||
| | Comando | Descripción | | | Comando | Descripción | | ||||||
| |---------|-------------| | |---------|-------------| | ||||||
| | `bin/odoo_set.sh` | Crea un nuevo proyecto Odoo con estructura completa | |  | ||||||
| | `bin/rate_update.py` | Actualiza tarifas por hora de diferentes tipos de programadores | | | `bin/rate_update.py` | Actualiza tarifas por hora de diferentes tipos de programadores | | ||||||
| | `bin/cocomo.py` | Calcula costos de proyecto usando el modelo COCOMO | | | `bin/cocomo.py` | Calcula costos de proyecto usando el modelo COCOMO | | ||||||
| 
 | 
 | ||||||
|  | @ -139,7 +139,13 @@ Para respaldar configuraciones importantes: | ||||||
| bin/profile_backup.sh | bin/profile_backup.sh | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| Esto crea un archivo ZIP en `$HOME/secure/backups`. La carpeta puede contener múltiples archivos de respaldo con un archivo `gpg.secret` que contiene la contraseña encriptada. La pérdida de este archivo imposibilitará la restauración. | Esto crea un archivo ZIP en `$HOME/secure/backups` que incluye: | ||||||
|  | - Configuración GPG completa | ||||||
|  | - Claves SSH y configuración | ||||||
|  | - Configuración Git  | ||||||
|  | - Carpeta .developer (para configuraciones de servidores Git) | ||||||
|  | 
 | ||||||
|  | La carpeta puede contener múltiples archivos de respaldo con un archivo `gpg.secret` que contiene la contraseña encriptada. La pérdida de este archivo imposibilitará la restauración. | ||||||
| 
 | 
 | ||||||
| Para restaurar: | Para restaurar: | ||||||
| 
 | 
 | ||||||
|  | @ -147,26 +153,33 @@ Para restaurar: | ||||||
| bin/profile_restore.sh <archivo-zip-backup> | bin/profile_restore.sh <archivo-zip-backup> | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| ### Desarrollo con Odoo | ### Creación de Proyectos Estandarizados | ||||||
| 
 | 
 | ||||||
| MRDevs Tools facilita el desarrollo de proyectos Odoo con el script especializado: | MRDevs Tools proporciona una forma estandarizada de crear nuevos proyectos con `project_new.sh`: | ||||||
| 
 | 
 | ||||||
| ```bash | ```bash | ||||||
| # Crear un nuevo proyecto Odoo | # Crear un nuevo proyecto | ||||||
| bin/odoo_set.sh | bin/project_new.sh | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| El script `odoo_set.sh` crea automáticamente una estructura completa para un proyecto Odoo: | El script `project_new.sh` crea proyectos con una estructura completa según el tipo seleccionado: | ||||||
| - Estructura de carpetas (addons, build, settings, data, scripts, etc.) | - Solicita nombre, tipo, licencia y descripción del proyecto | ||||||
| - Archivos de configuración iniciales (Dockerfile, docker-compose.yml) | - Crea una estructura organizada de carpetas según el tipo de proyecto | ||||||
| - Scripts de utilidad para el desarrollo | - Inicializa un repositorio Git con archivo .gitignore específico | ||||||
| - Marca el proyecto con el archivo `.typset` para identificarlo como proyecto Odoo | - Configura archivos README.md y documentación básica | ||||||
|  | - Permite seleccionar el tipo de servidor Git (GitHub, GitLab, Gitea, Forgejo, None) | ||||||
|  | - Genera un commit inicial automático | ||||||
| 
 | 
 | ||||||
| Para iniciar el entorno Odoo después de la creación: | Tipos de proyectos soportados: | ||||||
| ```bash | - Python, Node.js, PHP, Rust, C, C++, C# | ||||||
| cd [ruta-al-proyecto] | - Odoo, Ansible, ESP32/Arduino | ||||||
| ./scripts/start.sh | - COBOL y otros tipos personalizados | ||||||
| ``` | 
 | ||||||
|  | Cada tipo de proyecto incluye: | ||||||
|  | - Estructura de directorios optimizada | ||||||
|  | - Archivos de configuración específicos | ||||||
|  | - Archivos .gitignore personalizados | ||||||
|  | - Documentación inicial básica | ||||||
| 
 | 
 | ||||||
| ### Gestión de Tarifas y Costos | ### Gestión de Tarifas y Costos | ||||||
| 
 | 
 | ||||||
|  | @ -221,15 +234,18 @@ bin/ | ||||||
| ├── lib/           # Bibliotecas compartidas | ├── lib/           # Bibliotecas compartidas | ||||||
| ├── msg/           # Archivos de mensajes multilingües | ├── msg/           # Archivos de mensajes multilingües | ||||||
| ├── config/        # Configuraciones y parámetros | ├── config/        # Configuraciones y parámetros | ||||||
|  | │   └── *.gitignore # Plantillas de .gitignore específicas por tipo de proyecto | ||||||
| └── ansible/       # Recursos para automatización | └── ansible/       # Recursos para automatización | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| ### Componentes Principales | ### Componentes Principales | ||||||
| 
 | 
 | ||||||
| - **Bibliotecas Base**: Conjunto de funciones reutilizables (`base.lib`, `bootstrap.lib`, etc.) | - **Bibliotecas Base**: Conjunto de funciones reutilizables (`base.lib`, `bootstrap.lib`, `developers.lib`, etc.) | ||||||
| - **Sistema de Mensajes**: Soporte multilingüe para internacionalización | - **Sistema de Mensajes**: Soporte multilingüe para internacionalización | ||||||
| - **Gestión de Configuración**: Archivos de configuración centralizados | - **Gestión de Configuración**: Archivos de configuración centralizados, plantillas .gitignore por tipo de proyecto | ||||||
| - **Herramientas de Automatización**: Scripts y playbooks de Ansible | - **Herramientas de Automatización**: Scripts y playbooks de Ansible | ||||||
|  | - **Creación de Proyectos**: Sistema estandarizado de plantillas para diversos tipos de proyectos | ||||||
|  | - **Backup y Seguridad**: Herramientas para respaldar configuraciones de desarrollador | ||||||
| 
 | 
 | ||||||
| ## 💻 Compatibilidad | ## 💻 Compatibilidad | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										59
									
								
								bin/fjcli_install.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										59
									
								
								bin/fjcli_install.sh
									
									
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,59 @@ | ||||||
|  | #!/bin/bash | ||||||
|  | # ------------------------------------------------------------------ | ||||||
|  | # [Author] Cortana Rosero One <cortana@rosero.one> | ||||||
|  | # [Title]  fjcli_install.sh - Instalador de forgejo-cli | ||||||
|  | # [Generated] Created by Claude Code (claude-3-7-sonnet-20250219) | ||||||
|  | #           | ||||||
|  | # AGPL License | ||||||
|  | # Modified date: 14/03/2025 | ||||||
|  | # ------------------------------------------------------------------ | ||||||
|  | 
 | ||||||
|  | # Función para verificar si cargo está instalado | ||||||
|  | check_cargo() { | ||||||
|  |     if ! command -v cargo &> /dev/null; then | ||||||
|  |         echo "Cargo no está instalado. Instalando Rust y Cargo..." | ||||||
|  |         curl https://sh.rustup.rs -sSf | sh | ||||||
|  |         source "$HOME/.cargo/env" | ||||||
|  |         echo "Rust y Cargo han sido instalados correctamente." | ||||||
|  |     else | ||||||
|  |         echo "Cargo ya está instalado." | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Función para verificar si codeberg-cli está instalado | ||||||
|  | check_codeberg_cli() { | ||||||
|  |     if ! command -v codeberg &> /dev/null; then | ||||||
|  |         echo "codeberg-cli no está instalado. Instalando..." | ||||||
|  |          | ||||||
|  |         # Verificar que cargo esté disponible | ||||||
|  |         if ! command -v cargo &> /dev/null; then | ||||||
|  |             echo "ERROR: No se pudo encontrar cargo en el PATH después de la instalación." | ||||||
|  |             echo "Por favor reinicie su terminal e intente nuevamente." | ||||||
|  |             exit 1 | ||||||
|  |         fi | ||||||
|  |          | ||||||
|  |         # Instalar codeberg-cli | ||||||
|  |         cargo install codeberg-cli | ||||||
|  |          | ||||||
|  |         if [ $? -eq 0 ]; then | ||||||
|  |             echo "codeberg-cli instalado correctamente." | ||||||
|  |         else | ||||||
|  |             echo "ERROR: No se pudo instalar codeberg-cli." | ||||||
|  |             exit 1 | ||||||
|  |         fi | ||||||
|  |     else | ||||||
|  |         echo "codeberg-cli ya está instalado." | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Verificar si cargo está instalado | ||||||
|  | check_cargo | ||||||
|  | 
 | ||||||
|  | echo "Preparando instalación de forgejo-cli..." | ||||||
|  | 
 | ||||||
|  | # Instalar codeberg-cli si no está instalado | ||||||
|  | check_codeberg_cli | ||||||
|  | 
 | ||||||
|  | echo "Instalación completada." | ||||||
|  | 
 | ||||||
|  | exit 0 | ||||||
							
								
								
									
										245
									
								
								bin/forgejo_project.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										245
									
								
								bin/forgejo_project.sh
									
									
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,245 @@ | ||||||
|  | #!/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:" | ||||||
|  |         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 | ||||||
							
								
								
									
										212
									
								
								bin/ghcli_install.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										212
									
								
								bin/ghcli_install.sh
									
									
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,212 @@ | ||||||
|  | #!/bin/bash | ||||||
|  | # ------------------------------------------------------------------ | ||||||
|  | # [Author] Cortana Rosero One <cortana@rosero.one> | ||||||
|  | # [Title]  ghcli_install.sh - Instalador de GitHub CLI | ||||||
|  | # [Generated] Created by Claude Code (claude-3-7-sonnet-20250219) | ||||||
|  | #           | ||||||
|  | # AGPL License | ||||||
|  | # Modified date: 14/03/2025 | ||||||
|  | # ------------------------------------------------------------------ | ||||||
|  | 
 | ||||||
|  | # Función para verificar si se está ejecutando como root | ||||||
|  | check_root() { | ||||||
|  |     if [ "$(id -u)" -ne 0 ]; then | ||||||
|  |         echo "Este script requiere privilegios de administrador." | ||||||
|  |         echo "Intentando escalar privilegios..." | ||||||
|  |          | ||||||
|  |         # Verificar si sudo está disponible | ||||||
|  |         if command -v sudo &> /dev/null; then | ||||||
|  |             echo "Usando sudo para escalar privilegios..." | ||||||
|  |             sudo "$0" "$@" | ||||||
|  |             exit $? | ||||||
|  |         elif command -v doas &> /dev/null; then | ||||||
|  |             echo "Usando doas para escalar privilegios..." | ||||||
|  |             doas "$0" "$@" | ||||||
|  |             exit $? | ||||||
|  |         else | ||||||
|  |             echo "ERROR: No se encontró sudo ni doas. Por favor ejecute este script como root." | ||||||
|  |             exit 1 | ||||||
|  |         fi | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Función para detectar la distribución | ||||||
|  | detect_distro() { | ||||||
|  |     if [ -f /etc/os-release ]; then | ||||||
|  |         . /etc/os-release | ||||||
|  |         DISTRO=$ID | ||||||
|  |     elif type lsb_release >/dev/null 2>&1; then | ||||||
|  |         DISTRO=$(lsb_release -si | tr '[:upper:]' '[:lower:]') | ||||||
|  |     elif [ -f /etc/lsb-release ]; then | ||||||
|  |         . /etc/lsb-release | ||||||
|  |         DISTRO=$DISTRIB_ID | ||||||
|  |     elif [ -f /etc/debian_version ]; then | ||||||
|  |         DISTRO="debian" | ||||||
|  |     else | ||||||
|  |         DISTRO=$(uname -s) | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     echo "Distribución detectada: $DISTRO" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Función para instalar GitHub CLI en sistemas basados en Debian/Ubuntu | ||||||
|  | install_gh_debian() { | ||||||
|  |     echo "Instalando GitHub CLI en sistema basado en Debian/Ubuntu..." | ||||||
|  |      | ||||||
|  |     # Añadir repositorio de GitHub CLI | ||||||
|  |     type -p curl >/dev/null || apt update && apt install curl -y | ||||||
|  |     curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \ | ||||||
|  |     && chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg \ | ||||||
|  |     && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list > /dev/null \ | ||||||
|  |     && apt update \ | ||||||
|  |     && apt install gh -y | ||||||
|  |      | ||||||
|  |     if [ $? -eq 0 ]; then | ||||||
|  |         echo "GitHub CLI instalado correctamente." | ||||||
|  |     else | ||||||
|  |         echo "ERROR: No se pudo instalar GitHub CLI." | ||||||
|  |         exit 1 | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Función para instalar GitHub CLI en sistemas basados en Red Hat/Fedora | ||||||
|  | install_gh_redhat() { | ||||||
|  |     echo "Instalando GitHub CLI en sistema basado en Red Hat/Fedora..." | ||||||
|  |      | ||||||
|  |     # Añadir repositorio de GitHub CLI | ||||||
|  |     dnf install -y dnf-plugins-core | ||||||
|  |     dnf config-manager --add-repo https://cli.github.com/packages/rpm/gh-cli.repo | ||||||
|  |     dnf install -y gh | ||||||
|  |      | ||||||
|  |     if [ $? -eq 0 ]; then | ||||||
|  |         echo "GitHub CLI instalado correctamente." | ||||||
|  |     else | ||||||
|  |         echo "ERROR: No se pudo instalar GitHub CLI." | ||||||
|  |         exit 1 | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Función para instalar GitHub CLI en Arch Linux | ||||||
|  | install_gh_arch() { | ||||||
|  |     echo "Instalando GitHub CLI en Arch Linux..." | ||||||
|  |      | ||||||
|  |     # Instalar GitHub CLI desde los repositorios oficiales | ||||||
|  |     pacman -Sy --noconfirm gh | ||||||
|  |      | ||||||
|  |     if [ $? -eq 0 ]; then | ||||||
|  |         echo "GitHub CLI instalado correctamente." | ||||||
|  |     else | ||||||
|  |         echo "ERROR: No se pudo instalar GitHub CLI." | ||||||
|  |         exit 1 | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Función para instalar GitHub CLI en sistemas basados en SUSE | ||||||
|  | install_gh_suse() { | ||||||
|  |     echo "Instalando GitHub CLI en sistema basado en SUSE..." | ||||||
|  |      | ||||||
|  |     # Añadir repositorio de GitHub CLI | ||||||
|  |     zypper addrepo --refresh https://cli.github.com/packages/rpm/gh-cli.repo | ||||||
|  |     zypper install -y gh | ||||||
|  |      | ||||||
|  |     if [ $? -eq 0 ]; then | ||||||
|  |         echo "GitHub CLI instalado correctamente." | ||||||
|  |     else | ||||||
|  |         echo "ERROR: No se pudo instalar GitHub CLI." | ||||||
|  |         exit 1 | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Función para instalar GitHub CLI en macOS | ||||||
|  | install_gh_macos() { | ||||||
|  |     echo "Instalando GitHub CLI en macOS..." | ||||||
|  |      | ||||||
|  |     # Verificar si Homebrew está instalado | ||||||
|  |     if ! command -v brew &> /dev/null; then | ||||||
|  |         echo "Homebrew no está instalado. Instalando Homebrew..." | ||||||
|  |         /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     # Instalar GitHub CLI | ||||||
|  |     brew install gh | ||||||
|  |      | ||||||
|  |     if [ $? -eq 0 ]; then | ||||||
|  |         echo "GitHub CLI instalado correctamente." | ||||||
|  |     else | ||||||
|  |         echo "ERROR: No se pudo instalar GitHub CLI." | ||||||
|  |         exit 1 | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Función para verificar si gh está instalado | ||||||
|  | check_gh() { | ||||||
|  |     if command -v gh &> /dev/null; then | ||||||
|  |         echo "GitHub CLI ya está instalado." | ||||||
|  |         echo "Versión actual:" | ||||||
|  |         gh --version | ||||||
|  |         read -p "¿Desea reinstalar o actualizar? (s/n): " REINSTALL | ||||||
|  |         if [[ ! "$REINSTALL" =~ ^[Ss]$ ]]; then | ||||||
|  |             echo "Operación cancelada." | ||||||
|  |             exit 0 | ||||||
|  |         fi | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Función principal | ||||||
|  | main() { | ||||||
|  |     # Verificar si ya está instalado | ||||||
|  |     check_gh | ||||||
|  |      | ||||||
|  |     # Verificar privilegios de root (excepto en macOS) | ||||||
|  |     if [ "$(uname -s)" != "Darwin" ]; then | ||||||
|  |         check_root "$@" | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     # Detectar la distribución | ||||||
|  |     detect_distro | ||||||
|  |      | ||||||
|  |     # Instalar según la distribución | ||||||
|  |     case $DISTRO in | ||||||
|  |         ubuntu|debian|linuxmint|pop|elementary) | ||||||
|  |             install_gh_debian | ||||||
|  |             ;; | ||||||
|  |         fedora|rhel|centos|rocky|almalinux) | ||||||
|  |             install_gh_redhat | ||||||
|  |             ;; | ||||||
|  |         arch|manjaro|endeavouros) | ||||||
|  |             install_gh_arch | ||||||
|  |             ;; | ||||||
|  |         opensuse*|suse|sles) | ||||||
|  |             install_gh_suse | ||||||
|  |             ;; | ||||||
|  |         darwin) | ||||||
|  |             install_gh_macos | ||||||
|  |             ;; | ||||||
|  |         *) | ||||||
|  |             echo "Distribución no soportada: $DISTRO" | ||||||
|  |             echo "Por favor, visite https://github.com/cli/cli#installation para instrucciones de instalación manual." | ||||||
|  |             exit 1 | ||||||
|  |             ;; | ||||||
|  |     esac | ||||||
|  |      | ||||||
|  |     # Verificar la instalación | ||||||
|  |     if command -v gh &> /dev/null; then | ||||||
|  |         echo "GitHub CLI instalado correctamente." | ||||||
|  |         gh --version | ||||||
|  |          | ||||||
|  |         # Sugerir autenticación | ||||||
|  |         echo "" | ||||||
|  |         echo "Para autenticarse con GitHub, ejecute:" | ||||||
|  |         echo "gh auth login" | ||||||
|  |         echo "" | ||||||
|  |         echo "Para más información, visite: https://cli.github.com/manual/" | ||||||
|  |     else | ||||||
|  |         echo "ERROR: La instalación de GitHub CLI falló." | ||||||
|  |         exit 1 | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Ejecutar función principal | ||||||
|  | main "$@" | ||||||
|  | 
 | ||||||
|  | exit 0 | ||||||
							
								
								
									
										450
									
								
								bin/glcli_install.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										450
									
								
								bin/glcli_install.sh
									
									
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,450 @@ | ||||||
|  | #!/bin/bash | ||||||
|  | # ------------------------------------------------------------------ | ||||||
|  | # [Author] Cortana Rosero One <cortana@rosero.one> | ||||||
|  | # [Title]  glcli_install.sh - Instalador de GitLab CLI | ||||||
|  | # [Generated] Created by Claude Code (claude-3-7-sonnet-20250219) | ||||||
|  | #           | ||||||
|  | # AGPL License | ||||||
|  | # Modified date: 14/03/2025 | ||||||
|  | # ------------------------------------------------------------------ | ||||||
|  | 
 | ||||||
|  | # Función para verificar si se está ejecutando como root | ||||||
|  | check_root() { | ||||||
|  |     if [ "$(id -u)" -ne 0 ]; then | ||||||
|  |         echo "Este script requiere privilegios de administrador." | ||||||
|  |         echo "Intentando escalar privilegios..." | ||||||
|  |          | ||||||
|  |         # Verificar si sudo está disponible | ||||||
|  |         if command -v sudo &> /dev/null; then | ||||||
|  |             echo "Usando sudo para escalar privilegios..." | ||||||
|  |             sudo "$0" "$@" | ||||||
|  |             exit $? | ||||||
|  |         elif command -v doas &> /dev/null; then | ||||||
|  |             echo "Usando doas para escalar privilegios..." | ||||||
|  |             doas "$0" "$@" | ||||||
|  |             exit $? | ||||||
|  |         else | ||||||
|  |             echo "ERROR: No se encontró sudo ni doas. Por favor ejecute este script como root." | ||||||
|  |             exit 1 | ||||||
|  |         fi | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Función para detectar la distribución | ||||||
|  | detect_distro() { | ||||||
|  |     if [ -f /etc/os-release ]; then | ||||||
|  |         . /etc/os-release | ||||||
|  |         DISTRO=$ID | ||||||
|  |     elif type lsb_release >/dev/null 2>&1; then | ||||||
|  |         DISTRO=$(lsb_release -si | tr '[:upper:]' '[:lower:]') | ||||||
|  |     elif [ -f /etc/lsb-release ]; then | ||||||
|  |         . /etc/lsb-release | ||||||
|  |         DISTRO=$DISTRIB_ID | ||||||
|  |     elif [ -f /etc/debian_version ]; then | ||||||
|  |         DISTRO="debian" | ||||||
|  |     else | ||||||
|  |         DISTRO=$(uname -s) | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     echo "Distribución detectada: $DISTRO" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Función para instalar glab mediante Homebrew en macOS y Linux | ||||||
|  | install_glab_homebrew() { | ||||||
|  |     echo "Instalando GitLab CLI mediante Homebrew..." | ||||||
|  |      | ||||||
|  |     # Verificar si Homebrew está instalado | ||||||
|  |     if ! command -v brew &> /dev/null; then | ||||||
|  |         echo "Homebrew no está instalado. Instalando Homebrew..." | ||||||
|  |         /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" | ||||||
|  |          | ||||||
|  |         # Verificar si la instalación fue exitosa | ||||||
|  |         if ! command -v brew &> /dev/null; then | ||||||
|  |             echo "ERROR: No se pudo instalar Homebrew." | ||||||
|  |             return 1 | ||||||
|  |         fi | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     # Instalar GitLab CLI | ||||||
|  |     brew install gitlab-glab/tap/glab | ||||||
|  |      | ||||||
|  |     if [ $? -eq 0 ]; then | ||||||
|  |         echo "GitLab CLI instalado correctamente mediante Homebrew." | ||||||
|  |         return 0 | ||||||
|  |     else | ||||||
|  |         echo "ERROR: No se pudo instalar GitLab CLI mediante Homebrew." | ||||||
|  |         return 1 | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Función para instalar glab en sistemas basados en Debian/Ubuntu | ||||||
|  | install_glab_debian() { | ||||||
|  |     echo "Instalando GitLab CLI en sistema basado en Debian/Ubuntu..." | ||||||
|  |      | ||||||
|  |     # Verificar si curl está instalado | ||||||
|  |     if ! command -v curl &> /dev/null; then | ||||||
|  |         apt update && apt install -y curl | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     # Intentar primero usando los paquetes del sistema si están disponibles | ||||||
|  |     if command -v apt &> /dev/null; then | ||||||
|  |         echo "Verificando si glab está disponible en los repositorios..." | ||||||
|  |         apt-cache search --names-only "^glab$" 2>/dev/null | grep -q "^glab" | ||||||
|  |         if [ $? -eq 0 ]; then | ||||||
|  |             echo "GitLab CLI encontrado en los repositorios. Instalando..." | ||||||
|  |             apt update && apt install -y glab | ||||||
|  |             if [ $? -eq 0 ]; then | ||||||
|  |                 echo "GitLab CLI instalado correctamente desde los repositorios oficiales." | ||||||
|  |                 return 0 | ||||||
|  |             fi | ||||||
|  |         fi | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     # Si no está en los repositorios, usar el script oficial | ||||||
|  |     if command -v gpg &> /dev/null; then | ||||||
|  |         echo "Agregando repositorio oficial de GitLab..." | ||||||
|  |         curl -s https://gitlab.com/gitlab-org/cli/-/raw/main/scripts/install.sh | bash | ||||||
|  |         if [ $? -eq 0 ]; then | ||||||
|  |             echo "GitLab CLI instalado correctamente mediante script oficial." | ||||||
|  |             return 0 | ||||||
|  |         fi | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     # Si el método anterior falla, probar con Homebrew | ||||||
|  |     echo "Intentando instalar mediante Homebrew..." | ||||||
|  |     install_glab_homebrew | ||||||
|  |     return $? | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Función para instalar glab en sistemas basados en Red Hat/Fedora | ||||||
|  | install_glab_redhat() { | ||||||
|  |     echo "Instalando GitLab CLI en sistema basado en Red Hat/Fedora..." | ||||||
|  |      | ||||||
|  |     # Verificar si dnf está instalado | ||||||
|  |     if command -v dnf &> /dev/null; then | ||||||
|  |         # Verificar si glab está disponible en los repositorios | ||||||
|  |         echo "Verificando si glab está disponible en los repositorios..." | ||||||
|  |         dnf list glab &>/dev/null | ||||||
|  |         if [ $? -eq 0 ]; then | ||||||
|  |             echo "GitLab CLI encontrado en los repositorios. Instalando..." | ||||||
|  |             dnf install -y glab | ||||||
|  |             if [ $? -eq 0 ]; then | ||||||
|  |                 echo "GitLab CLI instalado correctamente desde los repositorios oficiales." | ||||||
|  |                 return 0 | ||||||
|  |             fi | ||||||
|  |         fi | ||||||
|  |          | ||||||
|  |         # Si no está en los repositorios, usar el script oficial | ||||||
|  |         if command -v gpg &> /dev/null; then | ||||||
|  |             echo "Usando script oficial de instalación..." | ||||||
|  |             curl -s https://gitlab.com/gitlab-org/cli/-/raw/main/scripts/install.sh | bash | ||||||
|  |             if [ $? -eq 0 ]; then | ||||||
|  |                 echo "GitLab CLI instalado correctamente mediante script oficial." | ||||||
|  |                 return 0 | ||||||
|  |             fi | ||||||
|  |         fi | ||||||
|  |          | ||||||
|  |         # Si el método anterior falla, probar con snap | ||||||
|  |         if command -v snap &> /dev/null; then | ||||||
|  |             echo "Intentando instalar mediante snap..." | ||||||
|  |             snap install glab | ||||||
|  |             if [ $? -eq 0 ]; then | ||||||
|  |                 echo "GitLab CLI instalado correctamente mediante snap." | ||||||
|  |                 return 0 | ||||||
|  |             fi | ||||||
|  |         fi | ||||||
|  |     # Si dnf no está disponible, pero yum sí | ||||||
|  |     elif command -v yum &> /dev/null; then | ||||||
|  |         # Verificar si glab está disponible en los repositorios | ||||||
|  |         echo "Verificando si glab está disponible en los repositorios..." | ||||||
|  |         yum list glab &>/dev/null | ||||||
|  |         if [ $? -eq 0 ]; then | ||||||
|  |             echo "GitLab CLI encontrado en los repositorios. Instalando..." | ||||||
|  |             yum install -y glab | ||||||
|  |             if [ $? -eq 0 ]; then | ||||||
|  |                 echo "GitLab CLI instalado correctamente desde los repositorios oficiales." | ||||||
|  |                 return 0 | ||||||
|  |             fi | ||||||
|  |         fi | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     # Si los métodos anteriores fallan, probar con Homebrew | ||||||
|  |     echo "Intentando instalar mediante Homebrew..." | ||||||
|  |     install_glab_homebrew | ||||||
|  |     return $? | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Función para instalar glab en Arch Linux | ||||||
|  | install_glab_arch() { | ||||||
|  |     echo "Instalando GitLab CLI en Arch Linux..." | ||||||
|  |      | ||||||
|  |     # Intentar primero usando el repositorio oficial | ||||||
|  |     if command -v pacman &> /dev/null; then | ||||||
|  |         # Verificar si glab está en los repositorios | ||||||
|  |         if pacman -Ss glab | grep -q "^community/glab"; then | ||||||
|  |             pacman -Sy --noconfirm glab | ||||||
|  |             if [ $? -eq 0 ]; then | ||||||
|  |                 echo "GitLab CLI instalado correctamente desde los repositorios oficiales." | ||||||
|  |                 return 0 | ||||||
|  |             fi | ||||||
|  |         fi | ||||||
|  |          | ||||||
|  |         # Si no está en los repositorios, intentar con yay (AUR) | ||||||
|  |         if command -v yay &> /dev/null; then | ||||||
|  |             yay -S --noconfirm glab | ||||||
|  |             if [ $? -eq 0 ]; then | ||||||
|  |                 echo "GitLab CLI instalado correctamente desde AUR." | ||||||
|  |                 return 0 | ||||||
|  |             fi | ||||||
|  |         fi | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     # Si los métodos anteriores fallan, probar con Homebrew | ||||||
|  |     echo "Intentando instalar mediante Homebrew..." | ||||||
|  |     install_glab_homebrew | ||||||
|  |     return $? | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Función para instalar glab en sistemas basados en SUSE | ||||||
|  | install_glab_suse() { | ||||||
|  |     echo "Instalando GitLab CLI en sistema basado en SUSE..." | ||||||
|  |      | ||||||
|  |     # Intentar primero usando el script oficial | ||||||
|  |     if command -v gpg &> /dev/null; then | ||||||
|  |         echo "Usando script oficial de instalación..." | ||||||
|  |         curl -s https://gitlab.com/gitlab-org/cli/-/raw/main/scripts/install.sh | bash | ||||||
|  |         if [ $? -eq 0 ]; then | ||||||
|  |             echo "GitLab CLI instalado correctamente mediante script oficial." | ||||||
|  |             return 0 | ||||||
|  |         fi | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     # Si el método anterior falla, probar con snap | ||||||
|  |     if command -v snap &> /dev/null; then | ||||||
|  |         echo "Intentando instalar mediante snap..." | ||||||
|  |         snap install glab | ||||||
|  |         if [ $? -eq 0 ]; then | ||||||
|  |             echo "GitLab CLI instalado correctamente mediante snap." | ||||||
|  |             return 0 | ||||||
|  |         fi | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     # Si los métodos anteriores fallan, probar con Homebrew | ||||||
|  |     echo "Intentando instalar mediante Homebrew..." | ||||||
|  |     install_glab_homebrew | ||||||
|  |     return $? | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Función para instalar directamente usando Go | ||||||
|  | install_glab_go() { | ||||||
|  |     echo "Intentando instalar GitLab CLI mediante Go..." | ||||||
|  |      | ||||||
|  |     # Verificar si Go está instalado | ||||||
|  |     if ! command -v go &> /dev/null; then | ||||||
|  |         echo "Go no está instalado. Se requiere Go para este método de instalación." | ||||||
|  |         return 1 | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     # Instalar GitLab CLI mediante Go | ||||||
|  |     go install gitlab.com/gitlab-org/cli/cmd/glab@main | ||||||
|  |      | ||||||
|  |     if [ $? -eq 0 ]; then | ||||||
|  |         echo "GitLab CLI instalado correctamente mediante Go." | ||||||
|  |         echo "Asegúrese de que \$GOPATH/bin esté en su PATH." | ||||||
|  |         echo "Por ejemplo, puede agregar lo siguiente a su ~/.bashrc o ~/.zshrc:" | ||||||
|  |         echo "export PATH=\$PATH:\$HOME/go/bin" | ||||||
|  |         return 0 | ||||||
|  |     else | ||||||
|  |         echo "ERROR: No se pudo instalar GitLab CLI mediante Go." | ||||||
|  |         return 1 | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Función para instalar usando método binario genérico | ||||||
|  | install_glab_binary() { | ||||||
|  |     echo "Instalando GitLab CLI usando binarios precompilados..." | ||||||
|  |      | ||||||
|  |     # Crear directorio temporal | ||||||
|  |     TMP_DIR=$(mktemp -d) | ||||||
|  |     cd "$TMP_DIR" || return 1 | ||||||
|  |      | ||||||
|  |     # Detectar arquitectura | ||||||
|  |     ARCH=$(uname -m) | ||||||
|  |     case "$ARCH" in | ||||||
|  |         x86_64) | ||||||
|  |             ARCH="amd64" | ||||||
|  |             ;; | ||||||
|  |         aarch64|arm64) | ||||||
|  |             ARCH="arm64" | ||||||
|  |             ;; | ||||||
|  |         *) | ||||||
|  |             echo "Arquitectura no soportada: $ARCH" | ||||||
|  |             return 1 | ||||||
|  |             ;; | ||||||
|  |     esac | ||||||
|  |      | ||||||
|  |     # Detectar sistema operativo | ||||||
|  |     OS=$(uname -s | tr '[:upper:]' '[:lower:]') | ||||||
|  |      | ||||||
|  |     # Obtener la última versión | ||||||
|  |     LATEST_VERSION=$(curl -s https://api.github.com/repos/profclems/glab/releases/latest | grep "tag_name" | cut -d'"' -f4) | ||||||
|  |     if [ -z "$LATEST_VERSION" ]; then | ||||||
|  |         LATEST_VERSION="v1.25.0" # Versión de respaldo si no se puede obtener la última | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     # Construir URL de descarga | ||||||
|  |     DOWNLOAD_URL="https://github.com/profclems/glab/releases/download/${LATEST_VERSION}/glab_${LATEST_VERSION:1}_${OS}_${ARCH}.tar.gz" | ||||||
|  |      | ||||||
|  |     echo "Descargando GitLab CLI desde: $DOWNLOAD_URL" | ||||||
|  |      | ||||||
|  |     # Descargar y extraer | ||||||
|  |     curl -L "$DOWNLOAD_URL" -o glab.tar.gz | ||||||
|  |     if [ $? -ne 0 ]; then | ||||||
|  |         echo "ERROR: No se pudo descargar GitLab CLI." | ||||||
|  |         cd - > /dev/null | ||||||
|  |         rm -rf "$TMP_DIR" | ||||||
|  |         return 1 | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     tar xzf glab.tar.gz | ||||||
|  |     if [ $? -ne 0 ]; then | ||||||
|  |         echo "ERROR: No se pudo extraer el archivo de GitLab CLI." | ||||||
|  |         cd - > /dev/null | ||||||
|  |         rm -rf "$TMP_DIR" | ||||||
|  |         return 1 | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     # Instalar binario | ||||||
|  |     mv bin/glab /usr/local/bin/glab | ||||||
|  |     chmod +x /usr/local/bin/glab | ||||||
|  |      | ||||||
|  |     # Limpiar | ||||||
|  |     cd - > /dev/null | ||||||
|  |     rm -rf "$TMP_DIR" | ||||||
|  |      | ||||||
|  |     # Verificar instalación | ||||||
|  |     if command -v glab &> /dev/null; then | ||||||
|  |         echo "GitLab CLI instalado correctamente mediante binarios precompilados." | ||||||
|  |         return 0 | ||||||
|  |     else | ||||||
|  |         echo "ERROR: No se pudo instalar GitLab CLI mediante binarios precompilados." | ||||||
|  |         return 1 | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Función para verificar si glab está instalado | ||||||
|  | check_glab() { | ||||||
|  |     if command -v glab &> /dev/null; then | ||||||
|  |         echo "GitLab CLI ya está instalado." | ||||||
|  |         echo "Versión actual:" | ||||||
|  |         glab --version | ||||||
|  |         read -p "¿Desea reinstalar o actualizar? (s/n): " REINSTALL | ||||||
|  |         if [[ ! "$REINSTALL" =~ ^[Ss]$ ]]; then | ||||||
|  |             echo "Operación cancelada." | ||||||
|  |             exit 0 | ||||||
|  |         fi | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Función principal | ||||||
|  | main() { | ||||||
|  |     # Verificar si ya está instalado | ||||||
|  |     check_glab | ||||||
|  |      | ||||||
|  |     # Verificar privilegios de root (excepto en macOS) | ||||||
|  |     if [ "$(uname -s)" != "Darwin" ]; then | ||||||
|  |         check_root "$@" | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     # Detectar la distribución | ||||||
|  |     detect_distro | ||||||
|  |      | ||||||
|  |     # Intentar instalar según la distribución | ||||||
|  |     install_success=false | ||||||
|  |      | ||||||
|  |     case $DISTRO in | ||||||
|  |         ubuntu|debian|linuxmint|pop|elementary|raspbian) | ||||||
|  |             install_glab_debian | ||||||
|  |             if [ $? -eq 0 ]; then | ||||||
|  |                 install_success=true | ||||||
|  |             fi | ||||||
|  |             ;; | ||||||
|  |         fedora|rhel|centos|rocky|almalinux) | ||||||
|  |             install_glab_redhat | ||||||
|  |             if [ $? -eq 0 ]; then | ||||||
|  |                 install_success=true | ||||||
|  |             fi | ||||||
|  |             ;; | ||||||
|  |         arch|manjaro|endeavouros) | ||||||
|  |             install_glab_arch | ||||||
|  |             if [ $? -eq 0 ]; then | ||||||
|  |                 install_success=true | ||||||
|  |             fi | ||||||
|  |             ;; | ||||||
|  |         opensuse*|suse|sles) | ||||||
|  |             install_glab_suse | ||||||
|  |             if [ $? -eq 0 ]; then | ||||||
|  |                 install_success=true | ||||||
|  |             fi | ||||||
|  |             ;; | ||||||
|  |         darwin) | ||||||
|  |             install_glab_homebrew | ||||||
|  |             if [ $? -eq 0 ]; then | ||||||
|  |                 install_success=true | ||||||
|  |             fi | ||||||
|  |             ;; | ||||||
|  |         *) | ||||||
|  |             echo "Distribución no soportada directamente: $DISTRO" | ||||||
|  |             echo "Intentando métodos alternativos..." | ||||||
|  |             ;; | ||||||
|  |     esac | ||||||
|  |      | ||||||
|  |     # Si no se pudo instalar con el método específico para la distribución, intentar métodos alternativos | ||||||
|  |     if [ "$install_success" = false ]; then | ||||||
|  |         echo "Intentando métodos alternativos de instalación..." | ||||||
|  |          | ||||||
|  |         # Intentar instalar con Go | ||||||
|  |         if command -v go &> /dev/null; then | ||||||
|  |             install_glab_go | ||||||
|  |             if [ $? -eq 0 ]; then | ||||||
|  |                 install_success=true | ||||||
|  |             fi | ||||||
|  |         fi | ||||||
|  |          | ||||||
|  |         # Si aún no se ha instalado, probar con binarios precompilados | ||||||
|  |         if [ "$install_success" = false ]; then | ||||||
|  |             install_glab_binary | ||||||
|  |             if [ $? -eq 0 ]; then | ||||||
|  |                 install_success=true | ||||||
|  |             fi | ||||||
|  |         fi | ||||||
|  |          | ||||||
|  |         # Si todos los métodos fallan | ||||||
|  |         if [ "$install_success" = false ]; then | ||||||
|  |             echo "No se pudo instalar GitLab CLI con ninguno de los métodos disponibles." | ||||||
|  |             echo "Por favor, visite https://gitlab.com/gitlab-org/cli para instrucciones de instalación manual." | ||||||
|  |             exit 1 | ||||||
|  |         fi | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     # Verificar la instalación | ||||||
|  |     if command -v glab &> /dev/null; then | ||||||
|  |         echo "GitLab CLI instalado correctamente." | ||||||
|  |         glab --version | ||||||
|  |          | ||||||
|  |         # Sugerir autenticación | ||||||
|  |         echo "" | ||||||
|  |         echo "Para autenticarse con GitLab, ejecute:" | ||||||
|  |         echo "glab auth login" | ||||||
|  |         echo "" | ||||||
|  |         echo "Para más información, visite: https://gitlab.com/gitlab-org/cli/blob/main/docs/index.md" | ||||||
|  |     else | ||||||
|  |         echo "ERROR: La instalación de GitLab CLI falló." | ||||||
|  |         exit 1 | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Ejecutar función principal | ||||||
|  | main "$@" | ||||||
|  | 
 | ||||||
|  | exit 0 | ||||||
|  | @ -40,6 +40,7 @@ function devslib_test() { | ||||||
|   exit 1 |   exit 1 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| # Set gpg environment | # Set gpg environment | ||||||
| function gpg_setting() { | function gpg_setting() { | ||||||
| 
 | 
 | ||||||
|  | @ -288,3 +289,179 @@ function developer_restore() { | ||||||
|   return 0 |   return 0 | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | # Función para crear un proyecto Git en Forgejo | ||||||
|  | # $1: nombre del proyecto | ||||||
|  | # $2: descripción del proyecto | ||||||
|  | # $3: tipo de visibilidad (private/public) [por defecto: private] | ||||||
|  | # $4: ruta local del proyecto (opcional) | ||||||
|  | # Return: 0 si se crea correctamente, otro valor en caso de error | ||||||
|  |   local PROJECT_NAME=$1 | ||||||
|  |   local PROJECT_DESC=$2 | ||||||
|  |   local VISIBILITY=${3:-private}  # Por defecto private si no se especifica | ||||||
|  |   local PROJECT_PATH=$4 | ||||||
|  | 
 | ||||||
|  |   # Verificar parámetros obligatorios | ||||||
|  |   if [ -z "$PROJECT_NAME" ] || [ -z "$PROJECT_DESC" ]; then | ||||||
|  |     return 10  # Error: faltan parámetros obligatorios | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  |   # Verificar que el archivo de configuración de Forgejo existe | ||||||
|  |   if [ ! -f "$FORGEJO_CONFIG_FILE" ]; then | ||||||
|  |     mkdir -p "$(dirname "$FORGEJO_CONFIG_FILE")" | ||||||
|  |     # 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:" | ||||||
|  |       local 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 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 | ||||||
|  |     else | ||||||
|  |       return 11  # Error: no existe configuración y no es interactivo | ||||||
|  |     fi | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  |   # Cargar token de Forgejo | ||||||
|  |   source "$FORGEJO_CONFIG_FILE" | ||||||
|  |   if [ -z "$FORGEJO_TOKEN" ]; then | ||||||
|  |     return 12  # Error: token no disponible | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  |   # Verificar visibilidad válida | ||||||
|  |   if [ "$VISIBILITY" != "private" ] && [ "$VISIBILITY" != "public" ]; then | ||||||
|  |     VISIBILITY="private"  # Establecer valor por defecto si es inválido | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  |   # 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 - Con timeout y manejo de errores de conexión | ||||||
|  |   echo "DEBUG: Verificando acceso a la API en: $FORGEJO_API_URL/version" >&2 | ||||||
|  |    | ||||||
|  |   # Verificar primero el host base | ||||||
|  |   local BASE_URL=$(echo "$FORGEJO_API_URL" | sed -E 's|https?://([^/]+)/.*|\1|') | ||||||
|  |    | ||||||
|  |   if ! ping -c 1 -W 2 "$BASE_URL" >/dev/null 2>&1; then | ||||||
|  |     echo "ERROR: No se puede alcanzar el servidor $BASE_URL" >&2 | ||||||
|  |     echo "{\"error\":\"No se puede conectar con el servidor $BASE_URL. Verifique su conexión y la URL.\"}" > "$HOME/.developer/${PROJECT_NAME}.error" | ||||||
|  |     return 13 | ||||||
|  |   fi | ||||||
|  |    | ||||||
|  |   echo "DEBUG: Verificando puertos alternativos..." >&2 | ||||||
|  |    | ||||||
|  |   # Prueba conexión HTTP puerto 80 primero | ||||||
|  |   if nc -z -w 2 "$BASE_URL" 80 2>/dev/null; then | ||||||
|  |     echo "DEBUG: Puerto 80 (HTTP) accesible" >&2 | ||||||
|  |      | ||||||
|  |     # Intenta versión HTTP explícitamente  | ||||||
|  |     local HTTP_API_URL=$(echo "$FORGEJO_API_URL" | sed 's|^https://|http://|') | ||||||
|  |     local API_RESPONSE=$(curl -s -v --connect-timeout 5 --max-time 10 "$HTTP_API_URL/version" 2>/tmp/curl_verbose.log || echo "") | ||||||
|  |      | ||||||
|  |     if [ -n "$API_RESPONSE" ] && echo "$API_RESPONSE" | grep -q "version"; then | ||||||
|  |       echo "DEBUG: API accesible vía HTTP (puerto 80)" >&2 | ||||||
|  |       # Reemplazar URL por HTTP para el resto de la función | ||||||
|  |       FORGEJO_API_URL="$HTTP_API_URL" | ||||||
|  |     else | ||||||
|  |       echo "ERROR: Servidor accesible pero la API no responde correctamente por HTTP" >&2 | ||||||
|  |       echo "{\"error\":\"Servidor accesible en puerto 80, pero la API no responde correctamente. Verifique la configuración del servidor.\"}" > "$HOME/.developer/${PROJECT_NAME}.error" | ||||||
|  |       cat /tmp/curl_verbose.log >> "$HOME/.developer/${PROJECT_NAME}.error" 2>/dev/null | ||||||
|  |       return 13 | ||||||
|  |     fi | ||||||
|  |   elif nc -z -w 2 "$BASE_URL" 443 2>/dev/null; then | ||||||
|  |     echo "DEBUG: Puerto 443 (HTTPS) accesible, pero posibles problemas con certificado o API" >&2 | ||||||
|  |      | ||||||
|  |     # Intenta con HTTPS pero ignorando errores de certificado | ||||||
|  |     local API_RESPONSE=$(curl -s -v -k --connect-timeout 5 --max-time 10 "$FORGEJO_API_URL/version" 2>/tmp/curl_verbose.log || echo "") | ||||||
|  |      | ||||||
|  |     if [ -n "$API_RESPONSE" ] && echo "$API_RESPONSE" | grep -q "version"; then | ||||||
|  |       echo "DEBUG: API accesible vía HTTPS inseguro (ignorando certificado)" >&2 | ||||||
|  |       # Continuar pero usando -k para ignorar certificados | ||||||
|  |       export FORGEJO_CURL_OPTS="-k" | ||||||
|  |     else | ||||||
|  |       echo "ERROR: Servidor HTTPS accesible pero la API no responde correctamente" >&2 | ||||||
|  |       echo "{\"error\":\"Servidor accesible en puerto 443, pero la API no responde. Posibles problemas de certificado o configuración.\"}" > "$HOME/.developer/${PROJECT_NAME}.error" | ||||||
|  |       cat /tmp/curl_verbose.log >> "$HOME/.developer/${PROJECT_NAME}.error" 2>/dev/null | ||||||
|  |       return 13 | ||||||
|  |     fi | ||||||
|  |   else | ||||||
|  |     echo "ERROR: No se puede acceder a los puertos HTTP (80) ni HTTPS (443) en $BASE_URL" >&2 | ||||||
|  |     echo "{\"error\":\"Servidor accesible por ping pero no responde en los puertos web (80/443).\"}" > "$HOME/.developer/${PROJECT_NAME}.error" | ||||||
|  |     return 13 | ||||||
|  |   fi | ||||||
|  |    | ||||||
|  |   # Verificar token con timeout y manejo de errores | ||||||
|  |   echo "DEBUG: Verificando token con API en: $FORGEJO_API_URL/user" >&2 | ||||||
|  |   local TOKEN_CHECK=$(curl ${FORGEJO_CURL_OPTS:-} -s -o /dev/null -w "%{http_code}" --connect-timeout 5 --max-time 10 -H "Authorization: token $FORGEJO_TOKEN" "$FORGEJO_API_URL/user" 2>/dev/null || echo "000") | ||||||
|  |   if [ "$TOKEN_CHECK" != "200" ]; then | ||||||
|  |     if [ "$TOKEN_CHECK" == "401" ]; then | ||||||
|  |       echo "ERROR: Token inválido o sin permisos suficientes. Código: 401" >&2 | ||||||
|  |       echo "{\"error\":\"Token inválido o sin permisos suficientes. Genere un nuevo token con permisos 'repo'\"}" > "$HOME/.developer/${PROJECT_NAME}.error" | ||||||
|  |     elif [ "$TOKEN_CHECK" == "000" ]; then | ||||||
|  |       echo "ERROR: No se pudo verificar el token. Error de conectividad" >&2 | ||||||
|  |       echo "{\"error\":\"No se pudo verificar el token. Error de conectividad con el servidor\"}" > "$HOME/.developer/${PROJECT_NAME}.error" | ||||||
|  |     else | ||||||
|  |       echo "ERROR: Token inválido o sin acceso. Código: $TOKEN_CHECK" >&2 | ||||||
|  |       echo "{\"error\":\"Token inválido o sin acceso. Código: $TOKEN_CHECK\"}" > "$HOME/.developer/${PROJECT_NAME}.error" | ||||||
|  |     fi | ||||||
|  |     return 12 | ||||||
|  |   fi | ||||||
|  |    | ||||||
|  |   # Llamar a la API de Forgejo para crear el repositorio | ||||||
|  |   echo "DEBUG: Enviando solicitud de creación de repositorio..." >&2 | ||||||
|  |   local API_RESPONSE=$(curl ${FORGEJO_CURL_OPTS:-} -s -X POST --connect-timeout 10 --max-time 30 "$FORGEJO_API_URL/user/repos" \ | ||||||
|  |     -H "Authorization: token $FORGEJO_TOKEN" \ | ||||||
|  |     -H "Content-Type: application/json" \ | ||||||
|  |     -d "$API_DATA" 2>/tmp/curl_error.log || echo '{"error":"Falló la comunicación con el servidor"}') | ||||||
|  |    | ||||||
|  |   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) | ||||||
|  |      | ||||||
|  |     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 | ||||||
|  |       cd "$PROJECT_PATH" | ||||||
|  |       # Verificar si ya es un repositorio git | ||||||
|  |       if [ -d ".git" ]; then | ||||||
|  |         # Añadir el remoto | ||||||
|  |         git remote add origin "$REPO_URL" | ||||||
|  |         git push -u origin main || git push -u origin master | ||||||
|  |       else | ||||||
|  |         # Inicializar el repositorio y hacer primer commit si no existe | ||||||
|  |         git init | ||||||
|  |         git add . | ||||||
|  |         git commit -m "[INIT] Proyecto $PROJECT_NAME" | ||||||
|  |         git remote add origin "$REPO_URL" | ||||||
|  |         git push -u origin main | ||||||
|  |       fi | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     return 0  # Éxito | ||||||
|  |   else | ||||||
|  |     # Guardar mensaje de error | ||||||
|  |     echo "$API_RESPONSE" > "$HOME/.developer/${PROJECT_NAME}.error" | ||||||
|  |     return 13  # Error: falló la creación del repositorio | ||||||
|  |   fi | ||||||
|  | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue