Compare commits
	
		
			No commits in common. "28c95aab40158fd6ae1d389ec296c80974f4a262" and "0d850c8e65281add0bba0ff58bc8ab8c435c83f5" have entirely different histories.
		
	
	
		
			28c95aab40
			...
			0d850c8e65
		
	
		
					 7 changed files with 420 additions and 489 deletions
				
			
		
							
								
								
									
										33
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								README.md
									
									
									
									
									
								
							|  | @ -67,8 +67,6 @@ bin/update.sh | |||
| | `bin/ghcli_install.sh` | Instala GitHub CLI (gh) con soporte multiplataforma | | ||||
| | `bin/glcli_install.sh` | Instala GitLab CLI (glab) con múltiples métodos de instalación | | ||||
| | `bin/fjcli_install.sh` | Instala Forgejo/Codeberg CLI vía Cargo | | ||||
| | `bin/cversadm_token.sh` | Gestiona tokens de acceso para plataformas de control de versiones de forma segura | | ||||
| | `bin/fj_login.sh` | Inicia/cierra sesión en Forgejo usando tokens encriptados con SOPS | | ||||
| 
 | ||||
| ### Seguridad y Acceso | ||||
| 
 | ||||
|  | @ -188,37 +186,6 @@ El script instala la CLI mediante Cargo (el gestor de paquetes de Rust): | |||
| 
 | ||||
| Para aprender a usar Codeberg CLI (compatible con Forgejo), consulta la [documentación en el repositorio de Codeberg CLI](https://codeberg.org/RobWalt/codeberg-cli). | ||||
| 
 | ||||
| #### Gestión de tokens para control de versiones | ||||
| 
 | ||||
| ```bash | ||||
| # Gestión segura de tokens de acceso | ||||
| bin/cversadm_token.sh | ||||
| ``` | ||||
| 
 | ||||
| Este script proporciona una interfaz para gestionar tokens de acceso para diferentes plataformas: | ||||
| - Permite seleccionar entre Github, Gitlab y Forgejo | ||||
| - Solicita y valida el token de forma segura | ||||
| - Encripta el token con SOPS y lo almacena en ~/.developer | ||||
| - Incluye verificación de formato y seguridad de tokens | ||||
| - Gestiona automáticamente permisos para archivos de tokens | ||||
| 
 | ||||
| #### Autenticación con Forgejo usando token encriptado | ||||
| 
 | ||||
| ```bash | ||||
| # Iniciar sesión en Forgejo usando el token encriptado | ||||
| bin/fj_login.sh | ||||
| 
 | ||||
| # Cerrar sesión de Forgejo | ||||
| bin/fj_login.sh --logout | ||||
| ``` | ||||
| 
 | ||||
| Este script facilita la autenticación con Forgejo/Codeberg CLI (berg): | ||||
| - Utiliza el token almacenado y encriptado por cversadm_token.sh | ||||
| - Desencripta automáticamente el token usando SOPS | ||||
| - Detecta la URL de Forgejo basándose en la configuración de git | ||||
| - Configura la variable BERG_BASE_URL con la URL detectada | ||||
| - Proporciona opciones para login (por defecto) y logout | ||||
| 
 | ||||
| ### Copias de Seguridad | ||||
| 
 | ||||
| Para respaldar configuraciones importantes: | ||||
|  |  | |||
|  | @ -1,250 +0,0 @@ | |||
| #!/bin/bash | ||||
| # | ||||
| # Script: cversadm_token.sh | ||||
| # Description: Administrador de tokens para plataformas de control de versiones | ||||
| # Modified: 2025/03/15 | ||||
| # [Author] Cortana Rosero One <cortana@rosero.one> | ||||
| # [Generated] Created by Claude Code (claude-3-7-sonnet-20250219) | ||||
| # | ||||
| # Derechos de Autor (C) [2025] [Mauro Rosero P. <mauro@roser.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/>. | ||||
| 
 | ||||
| # Configuración inicial | ||||
| # Usar DEVELOPER_DIR de base.lib | ||||
| SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" | ||||
| 
 | ||||
| # Leer DEVSPATH desde el archivo de configuración o usar "devs" por defecto | ||||
| if [ -f "$SCRIPT_DIR/config/devspath.dat" ]; then | ||||
|   DEVSPATH=$(cat "$SCRIPT_DIR/config/devspath.dat") | ||||
| else | ||||
|   DEVSPATH="devs" | ||||
| fi | ||||
| 
 | ||||
| BIN_HOME="$HOME/$DEVSPATH" | ||||
| BIN_BASE="bin" | ||||
| BIN_LIBS="lib" | ||||
| BIN_MESG="msg" | ||||
| 
 | ||||
| # Definir variables necesarias para uso en funciones | ||||
| head_error="ERROR" | ||||
| head_exit="Salir" | ||||
| head_key_end="END" | ||||
| 
 | ||||
| # Importar bibliotecas necesarias | ||||
| source "${BIN_HOME}/${BIN_BASE}/${BIN_LIBS}/base.lib" | ||||
| source "${BIN_HOME}/${BIN_BASE}/${BIN_LIBS}/console.lib" | ||||
| 
 | ||||
| # CHECK SHELL LANGUAGE | ||||
| BIN_LANG=${LANG:0:2} | ||||
| 
 | ||||
| # Cargar mensajes en el idioma del sistema o español por defecto | ||||
| load_messages "${BIN_HOME}/${BIN_BASE}" "${BIN_MESG}" "${BIN_LANG}" "head" | ||||
| load_messages "${BIN_HOME}/${BIN_BASE}" "${BIN_MESG}" "${BIN_LANG}" "developers" | ||||
| 
 | ||||
| # Variables globales | ||||
| title="${head_000} ${head_002}" | ||||
| apps_title="${cvmsg_000}" | ||||
| 
 | ||||
| # Función para verificar si SOPS está instalado | ||||
| check_sops_installed() { | ||||
|   if ! command -v sops &> /dev/null; then | ||||
|     # Mostrar el error usando dialog con mensaje desde developers.es | ||||
|     dialog_error_box "${head_error}" "${cvmsg_013}. ${cvmsg_014}" | ||||
|     clear | ||||
|     exit 1 | ||||
|   fi | ||||
| } | ||||
| 
 | ||||
| # Función para asegurar que el directorio .developer existe | ||||
| ensure_developers_dir() { | ||||
|   if [ ! -d "$DEVELOPER_DIR" ]; then | ||||
|     mkdir -p "$DEVELOPER_DIR" | ||||
|     chmod 700 "$DEVELOPER_DIR" | ||||
|     echo "${cvmsg_008} $DEVELOPER_DIR" | ||||
|   fi | ||||
| } | ||||
| 
 | ||||
| # Función para seleccionar la plataforma de control de versiones usando menu_actions | ||||
| select_platform() { | ||||
|   # Preparar opciones para menu_actions | ||||
|   local menu_options="1:${cvmsg_010} | ||||
| 2:${cvmsg_011} | ||||
| 3:${cvmsg_012} | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| " | ||||
|    | ||||
|   # Usar menu_actions en lugar de dialog_input_menu | ||||
|   local selection=$(menu_actions "${cvmsg_002}" "$menu_options" 9) | ||||
|    | ||||
|   # Verificar si hubo cancelación o error | ||||
|   if [ "$selection" = "${head_key_end}" ]; then | ||||
|     return 1 | ||||
|   fi | ||||
|    | ||||
|   # Interpretar la selección | ||||
|   case $selection in | ||||
|     1) echo "github" ;; | ||||
|     2) echo "gitlab" ;; | ||||
|     3) echo "forgejo" ;; | ||||
|     *) return 1 ;; | ||||
|   esac | ||||
|    | ||||
|   return 0 | ||||
| } | ||||
| 
 | ||||
| # Función para solicitar y validar el token | ||||
| request_token() { | ||||
|   local platform=$1 | ||||
|   local platform_name="" | ||||
|   local token="" | ||||
|    | ||||
|   case $platform in | ||||
|     "github") platform_name="${cvmsg_010}" ;; | ||||
|     "gitlab") platform_name="${cvmsg_011}" ;; | ||||
|     "forgejo") platform_name="${cvmsg_012}" ;; | ||||
|   esac | ||||
|    | ||||
|   # Bucle para validación de token usando dialog directamente | ||||
|   while true; do | ||||
|     # Usar dialog directamente en lugar de dialog_input_pass | ||||
|     token=$(dialog --backtitle "$title" --stdout --title "${cvmsg_003}" \ | ||||
|            --passwordbox "${cvmsg_004} $platform_name\n${cvmsg_005}" 8 60) | ||||
|      | ||||
|     # Verificar si el usuario canceló | ||||
|     if [ $? -ne 0 ]; then | ||||
|       clear | ||||
|       return 1 | ||||
|     fi | ||||
|      | ||||
|     # Validar token | ||||
|     if [ -z "$token" ]; then | ||||
|       dialog --backtitle "$title" --title "${head_error}" --msgbox "${cvmsg_015}" 7 60 | ||||
|       continue | ||||
|     fi | ||||
|      | ||||
|     # Verificar longitud (debería tener al menos 30 caracteres) | ||||
|     if [ ${#token} -lt 30 ]; then | ||||
|       dialog --backtitle "$title" --title "${head_error}" --msgbox "${cvmsg_016}" 7 60 | ||||
|       continue | ||||
|     fi | ||||
|      | ||||
|     # Verificar formato (debería contener caracteres alfanuméricos y algunos especiales) | ||||
|     if ! [[ "$token" =~ ^[A-Za-z0-9\#\-\_\.]+$ ]]; then | ||||
|       dialog --backtitle "$title" --title "${head_warning}" --msgbox "${cvmsg_017}" 7 60 | ||||
|     fi | ||||
|      | ||||
|     # Token válido | ||||
|     break | ||||
|   done | ||||
|    | ||||
|   echo "$token" | ||||
|   return 0 | ||||
| } | ||||
| 
 | ||||
| # Función para guardar el token encriptado con SOPS | ||||
| save_token() { | ||||
|   local platform=$1 | ||||
|   local token=$2 | ||||
|   local filename="${DEVELOPER_DIR}/${platform}.sops.yaml" | ||||
|   local token_file="/tmp/vcs_token_$$" | ||||
|    | ||||
|   # Convertir token a base64 para mayor seguridad | ||||
|   local token_base64=$(echo -n "$token" | base64) | ||||
|    | ||||
|   # Crear archivo temporal con el token en base64 | ||||
|   echo "token: $token_base64" > "$token_file" | ||||
|    | ||||
|   # Encriptar el archivo con SOPS | ||||
|   sops --encrypt "$token_file" > "$filename" | ||||
|   local result=$? | ||||
|    | ||||
|   # Eliminar archivo temporal | ||||
|   rm -f "$token_file" | ||||
|    | ||||
|   # Establecer permisos adecuados (solo lectura para el propietario) | ||||
|   if [ $result -eq 0 ]; then | ||||
|     chmod 600 "$filename" | ||||
|   fi | ||||
|    | ||||
|   return $result | ||||
| } | ||||
| 
 | ||||
| # Verificar si dialog está instalado | ||||
| check_dialog_installed() { | ||||
|   if ! command -v dialog &> /dev/null; then | ||||
|     echo "${head_001}" | ||||
|     exit 1 | ||||
|   fi | ||||
| } | ||||
| 
 | ||||
| # Función principal | ||||
| main() { | ||||
|   # Verificar requisitos | ||||
|   check_dialog_installed | ||||
|   check_sops_installed | ||||
|   ensure_developers_dir | ||||
|    | ||||
|   # Asegurar que head_000 y head_002 estén definidos para el título | ||||
|   if [ -z "$head_000" ] || [ -z "$head_002" ]; then | ||||
|     head_000="MRDevs" | ||||
|     head_002="Tools" | ||||
|   fi | ||||
|    | ||||
|   # Mostrar título inicial | ||||
|   display_text_header | ||||
|    | ||||
|   # Seleccionar plataforma | ||||
|   platform=$(select_platform) | ||||
|   if [ $? -ne 0 ]; then | ||||
|     clear | ||||
|     exit 0 | ||||
|   fi | ||||
|    | ||||
|   # Solicitar token | ||||
|   token=$(request_token "$platform") | ||||
|   if [ $? -ne 0 ]; then | ||||
|     clear | ||||
|     exit 0 | ||||
|   fi | ||||
|    | ||||
|   # Guardar token | ||||
|   save_token "$platform" "$token" | ||||
|   if [ $? -eq 0 ]; then | ||||
|     local platform_name="" | ||||
|     case $platform in | ||||
|       "github") platform_name="${cvmsg_010}" ;; | ||||
|       "gitlab") platform_name="${cvmsg_011}" ;; | ||||
|       "forgejo") platform_name="${cvmsg_012}" ;; | ||||
|     esac | ||||
|      | ||||
|     dialog_error_box "${cvmsg_009}" "${cvmsg_006} $platform_name" | ||||
|   else | ||||
|     local platform_name="" | ||||
|     case $platform in | ||||
|       "github") platform_name="${cvmsg_010}" ;; | ||||
|       "gitlab") platform_name="${cvmsg_011}" ;; | ||||
|       "forgejo") platform_name="${cvmsg_012}" ;; | ||||
|     esac | ||||
|      | ||||
|     dialog_error_box "${head_error}" "${cvmsg_007} $platform_name" | ||||
|   fi | ||||
|    | ||||
|   clear | ||||
| } | ||||
| 
 | ||||
| # Ejecutar función principal | ||||
| main | ||||
							
								
								
									
										185
									
								
								bin/fj_login.sh
									
									
									
									
									
								
							
							
						
						
									
										185
									
								
								bin/fj_login.sh
									
									
									
									
									
								
							|  | @ -1,185 +0,0 @@ | |||
| #!/bin/bash | ||||
| # | ||||
| # Script: fj_login.sh | ||||
| # Description: Script para autenticación con Forgejo usando tokens encriptados | ||||
| # Modified: 2025/03/15 | ||||
| # [Author] Cortana Rosero One <cortana@rosero.one> | ||||
| # [Generated] Created by Claude Code (claude-3-7-sonnet-20250219) | ||||
| # | ||||
| # Derechos de Autor (C) [2025] [Mauro Rosero P. <mauro@roser.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/>. | ||||
| 
 | ||||
| # Configuración inicial | ||||
| SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" | ||||
| 
 | ||||
| # Leer DEVSPATH desde el archivo de configuración o usar "devs" por defecto | ||||
| if [ -f "$SCRIPT_DIR/config/devspath.dat" ]; then | ||||
|   DEVSPATH=$(cat "$SCRIPT_DIR/config/devspath.dat") | ||||
| else | ||||
|   DEVSPATH="devs" | ||||
| fi | ||||
| 
 | ||||
| BIN_HOME="$HOME/$DEVSPATH" | ||||
| BIN_BASE="bin" | ||||
| BIN_LIBS="lib" | ||||
| BIN_MESG="msg" | ||||
| 
 | ||||
| # CHECK SHELL LANGUAGE | ||||
| BIN_LANG=${LANG:0:2} | ||||
| 
 | ||||
| # Importar bibliotecas necesarias | ||||
| source "${BIN_HOME}/${BIN_BASE}/${BIN_LIBS}/base.lib" | ||||
| source "${BIN_HOME}/${BIN_BASE}/${BIN_LIBS}/console.lib" | ||||
| 
 | ||||
| # Cargar mensajes en el idioma del sistema o español por defecto | ||||
| load_messages "${BIN_HOME}/${BIN_BASE}" "${BIN_MESG}" "${BIN_LANG}" "head" | ||||
| 
 | ||||
| # Variables globales | ||||
| title="${head_000} ${head_002}" | ||||
| 
 | ||||
| # Función para verificar si berg está instalado | ||||
| check_berg_installed() { | ||||
|   if ! command -v berg &> /dev/null; then | ||||
|     echo "Error: berg (Forgejo CLI) no está instalado. Por favor, ejecute bin/fjcli_install.sh primero." | ||||
|     exit 1 | ||||
|   fi | ||||
| } | ||||
| 
 | ||||
| # Función para verificar si SOPS está instalado | ||||
| check_sops_installed() { | ||||
|   if ! command -v sops &> /dev/null; then | ||||
|     echo "Error: SOPS no está instalado. Por favor, ejecute bin/bootstrap.sh para instalar las herramientas necesarias." | ||||
|     exit 1 | ||||
|   fi | ||||
| } | ||||
| 
 | ||||
| # Función para extraer la URL base de Forgejo de la configuración de git | ||||
| get_forgejo_url() { | ||||
|   # Intentar obtener URL desde la configuración global de git | ||||
|   local remote_url=$(git config --get remote.origin.url 2>/dev/null) | ||||
|    | ||||
|   # Si no se encuentra en la configuración global, intentar buscar en el directorio actual | ||||
|   if [ -z "$remote_url" ] && [ -d ".git" ]; then | ||||
|     remote_url=$(git config --get remote.origin.url 2>/dev/null) | ||||
|   fi | ||||
|    | ||||
|   # Si aún no tenemos URL, intentar buscar en algún repositorio de $HOME | ||||
|   if [ -z "$remote_url" ]; then | ||||
|     # Buscar repositorios en $HOME que podrían tener remotes de Forgejo | ||||
|     for repo_dir in $(find $HOME -name ".git" -type d -maxdepth 3 2>/dev/null); do | ||||
|       local repo_path=$(dirname "$repo_dir") | ||||
|       cd "$repo_path" | ||||
|       local url=$(git config --get remote.origin.url 2>/dev/null) | ||||
|       if [[ "$url" == *"forgejo"* ]] || [[ "$url" == *"codeberg"* ]] || [[ "$url" == *"gitt.rosero"* ]]; then | ||||
|         remote_url="$url" | ||||
|         break | ||||
|       fi | ||||
|     done | ||||
|   fi | ||||
|    | ||||
|   # Si encontramos una URL, extraer el dominio base | ||||
|   if [ -n "$remote_url" ]; then | ||||
|     # Eliminar protocolo (http:// o https://) | ||||
|     local base_url=$(echo "$remote_url" | sed -E 's|^(https?://)?([^/]+).*|\2|') | ||||
|      | ||||
|     # Si el formato es usuario@dominio, extraer solo el dominio | ||||
|     if [[ "$base_url" == *"@"* ]]; then | ||||
|       base_url=$(echo "$base_url" | cut -d '@' -f2) | ||||
|     fi | ||||
|      | ||||
|     # Devolver solo el dominio sin protocolo | ||||
|     echo "$base_url" | ||||
|   else | ||||
|     # Si no se encontró ninguna URL, devolver una cadena vacía | ||||
|     echo "" | ||||
|   fi | ||||
| } | ||||
| 
 | ||||
| # Estas funciones han sido eliminadas, ya no se crean ni eliminan alias | ||||
| # Los usuarios pueden crear su propio alias manualmente si lo desean | ||||
| 
 | ||||
| # Función para iniciar sesión con token | ||||
| login() { | ||||
|   # Verificar que el archivo de token encriptado existe | ||||
|   if [ ! -f "${DEVELOPER_DIR}/forgejo.sops.yaml" ]; then | ||||
|     echo "Error: No se encontró el archivo de token para Forgejo." | ||||
|     echo "Por favor, ejecute bin/cversadm_token.sh para configurar el token primero." | ||||
|     exit 1 | ||||
|   fi | ||||
|    | ||||
|   # Decodificar el token de base64 | ||||
|   local token=$(sops -d ${DEVELOPER_DIR}/forgejo.sops.yaml | grep -oP '(?<=token: ).*' | base64 -d) | ||||
|    | ||||
|   # Obtener la URL base de Forgejo | ||||
|   local forgejo_url=$(get_forgejo_url) | ||||
|    | ||||
|   if [ -n "$forgejo_url" ]; then | ||||
|     echo "Usando servidor Forgejo: $forgejo_url" | ||||
|     export BERG_BASE_URL="$forgejo_url" | ||||
|   else | ||||
|     echo "ADVERTENCIA: No se pudo detectar automáticamente la URL de Forgejo." | ||||
|     echo "Si la autenticación falla, establezca manualmente BERG_BASE_URL." | ||||
|   fi | ||||
|     | ||||
|   # Iniciar sesión con berg | ||||
|   echo "Iniciando sesión en Forgejo..." | ||||
|   berg auth login -t "$token" | ||||
|   local login_status=$? | ||||
|    | ||||
|   if [ $login_status -eq 0 ]; then | ||||
|     echo "Sesión iniciada correctamente en Forgejo." | ||||
|   else | ||||
|     echo "Error al iniciar sesión en Forgejo. Por favor, verifique su token." | ||||
|     exit 1 | ||||
|   fi | ||||
| } | ||||
| 
 | ||||
| # Función para cerrar sesión | ||||
| logout() { | ||||
|   # Obtener la URL base de Forgejo | ||||
|   local forgejo_url=$(get_forgejo_url) | ||||
|    | ||||
|   if [ -n "$forgejo_url" ]; then | ||||
|     echo "Usando servidor Forgejo: $forgejo_url" | ||||
|     export BERG_BASE_URL="$forgejo_url" | ||||
|   fi | ||||
| 
 | ||||
|   # Ya no se eliminan alias | ||||
|    | ||||
|   echo "Cerrando sesión de Forgejo..." | ||||
|   if ! berg auth status &>/dev/null; then | ||||
|     echo "No hay sesión activa en Forgejo." | ||||
|   else | ||||
|     berg auth logout -s 2>/dev/null || true | ||||
|     echo "Sesión cerrada." | ||||
|   fi | ||||
| } | ||||
| 
 | ||||
| # Función principal | ||||
| main() { | ||||
|   # Verificar requisitos | ||||
|   check_berg_installed | ||||
|   check_sops_installed | ||||
|    | ||||
|   # Verificar parámetros | ||||
|   if [ "$1" = "--logout" ]; then | ||||
|     logout | ||||
|   else | ||||
|     login | ||||
|   fi | ||||
| } | ||||
| 
 | ||||
| # Ejecutar función principal con los parámetros recibidos | ||||
| main "$@" | ||||
							
								
								
									
										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 | ||||
|  | @ -30,7 +30,6 @@ BIN_MESG=${BIN_MESG:=${BIN_BASE}/msg} | |||
| BIN_LIBS=${BIN_LIBS:=${BIN_BASE}/lib} | ||||
| DEVS_NAME=${CONFPATH}/project.head | ||||
| GIT_IGNORE=.gitignore | ||||
| DEVELOPER_DIR=${HOME}/.developer | ||||
| DATENOW="$(date +"%Y-%m-%d %H:%M:%S")" | ||||
| DATEBAK="$(date +"%Y%m%d%H%M%S")" | ||||
| 
 | ||||
|  |  | |||
|  | @ -290,3 +290,178 @@ function developer_restore() { | |||
| 
 | ||||
| } | ||||
| 
 | ||||
| # 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 | ||||
| } | ||||
|  |  | |||
|  | @ -40,23 +40,3 @@ dvmsg_105="Opciones:" | |||
| dvmsg_106="  --help     Muestra este mensaje de ayuda." | ||||
| dvmsg_107="  --version  Muestra la versión del script." | ||||
| 
 | ||||
| # Mensajes para cversadm_token.sh | ||||
| cvmsg_000="ADMINISTRADOR DE TOKENS DE CONTROL DE VERSIONES" | ||||
| cvmsg_001="Seleccione plataforma de control de versiones" | ||||
| cvmsg_002="Elija la plataforma para la que desea configurar el token de acceso" | ||||
| cvmsg_003="Token de acceso" | ||||
| cvmsg_004="Introduzca el token de acceso personal para" | ||||
| cvmsg_005="El token se utilizará para operaciones de autenticación" | ||||
| cvmsg_006="Token guardado correctamente para" | ||||
| cvmsg_007="Error al guardar el token para" | ||||
| cvmsg_008="Carpeta de configuración creada:" | ||||
| cvmsg_009="Seleccione una opción" | ||||
| cvmsg_010="Github" | ||||
| cvmsg_011="Gitlab" | ||||
| cvmsg_012="Forgejo" | ||||
| cvmsg_013="SOPS no está instalado" | ||||
| cvmsg_014="Por favor, ejecute bin/bootstrap.sh para instalar las herramientas necesarias." | ||||
| cvmsg_015="El token no puede estar vacío. Por favor ingrese un token válido." | ||||
| cvmsg_016="El token parece ser demasiado corto. Verifique que haya copiado el token completo." | ||||
| cvmsg_017="El token contiene caracteres no estándar. Verifique que sea correcto." | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue