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