From 07c4be3c1964cd46c6fe68d5fb282f55ce1e4693 Mon Sep 17 00:00:00 2001 From: "Mauro Rosero P." Date: Thu, 13 Mar 2025 11:35:30 -0500 Subject: [PATCH] =?UTF-8?q?[ADDED]=20Funci=C3=B3n=20para=20crear=20proyect?= =?UTF-8?q?os=20en=20Forgejo=20y=20script=20de=20utilidad?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Añadida función forgejo_create_project en developers.lib - Creado nuevo script bin/forgejo_project.sh para facilitar el uso - Integración con tokens de Forgejo almacenados en .developer - Configuración automática de repositorio local 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- bin/forgejo_project.sh | 170 +++++++++++++++++++++++++++++++++++++++++ bin/lib/developers.lib | 87 +++++++++++++++++++++ 2 files changed, 257 insertions(+) create mode 100755 bin/forgejo_project.sh diff --git a/bin/forgejo_project.sh b/bin/forgejo_project.sh new file mode 100755 index 0000000..0d28a98 --- /dev/null +++ b/bin/forgejo_project.sh @@ -0,0 +1,170 @@ +#!/bin/bash +# +# Script: forgejo_project.sh +# Description: Crea un proyecto en Forgejo y configura el repositorio local +# Modified: 2025-03-13 14:20:00 +# Derechos de Autor (C) [2025] [Mauro Rosero P. ] +# +# Este programa es software libre: usted puede redistribuirlo y/o modificarlo +# bajo los términos de la Licencia Pública Affero General de GNU tal como +# lo publica la Free Software Foundation, ya sea la versión 3 de la licencia, +# o (a su elección) cualquier versión posterior. +# +# Este programa se distribuye con la esperanza de que sea útil, +# pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de +# COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte la +# Licencia Pública Affero General de GNU para obtener más detalles. +# +# Debería haber recibido una copia de la Licencia Pública Affero General +# junto con este programa. Si no la recibió, consulte . + +# Directorios base +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BASE_DIR="$(dirname "$SCRIPT_DIR")" +CONFIG_DIR="$SCRIPT_DIR/config" +LIB_DIR="$SCRIPT_DIR/lib" +MSG_DIR="$SCRIPT_DIR/msg" + +# Cargar libraries +source "$LIB_DIR/base.lib" +source "$LIB_DIR/console.lib" +source "$LIB_DIR/developers.lib" +source "$MSG_DIR/head.es" + +# Función para mostrar ayuda +function show_help() { + echo "Uso: $0 [opciones]" + echo "" + echo "Crea un nuevo proyecto en Forgejo y opcionalmente lo vincula con un repositorio local." + echo "" + echo "Opciones:" + echo " -n, --name NOMBRE Nombre del proyecto (obligatorio)" + echo " -d, --desc DESCRIPCION Descripción del proyecto (obligatorio)" + echo " -p, --path RUTA Ruta local del proyecto (opcional)" + echo " -v, --visibility TIPO Visibilidad: 'public' o 'private' (por defecto: private)" + echo " -h, --help Muestra esta ayuda" + echo "" + echo "Ejemplos:" + echo " $0 --name mi-proyecto --desc \"Mi nuevo proyecto\" --visibility public" + echo " $0 -n mi-proyecto -d \"Mi nuevo proyecto\" -p /ruta/al/proyecto" +} + +# Variables para los argumentos +PROJECT_NAME="" +PROJECT_DESC="" +PROJECT_PATH="" +VISIBILITY="private" + +# Procesar argumentos +while [[ $# -gt 0 ]]; do + case $1 in + -n|--name) + PROJECT_NAME="$2" + shift 2 + ;; + -d|--desc) + PROJECT_DESC="$2" + shift 2 + ;; + -p|--path) + PROJECT_PATH="$2" + shift 2 + ;; + -v|--visibility) + VISIBILITY="$2" + shift 2 + ;; + -h|--help) + show_help + exit 0 + ;; + *) + echo "Error: Opción desconocida $1" + show_help + exit 1 + ;; + esac +done + +# Verificar argumentos obligatorios +if [ -z "$PROJECT_NAME" ]; then + echo "Error: Debe especificar un nombre de proyecto con --name" + show_help + exit 1 +fi + +if [ -z "$PROJECT_DESC" ]; then + echo "Error: Debe especificar una descripción de proyecto con --desc" + show_help + exit 1 +fi + +# Verificar ruta del proyecto si se proporciona +if [ -n "$PROJECT_PATH" ] && [ ! -d "$PROJECT_PATH" ]; then + echo "Error: La ruta del proyecto especificada no existe: $PROJECT_PATH" + exit 1 +fi + +# Validar visibilidad +if [ "$VISIBILITY" != "private" ] && [ "$VISIBILITY" != "public" ]; then + echo "Advertencia: Valor de visibilidad inválido. Usando 'private' por defecto." + VISIBILITY="private" +fi + +# Mostrar confirmación +echo "Creando proyecto en Forgejo:" +echo " Nombre: $PROJECT_NAME" +echo " Descripción: $PROJECT_DESC" +echo " Visibilidad: $VISIBILITY" +if [ -n "$PROJECT_PATH" ]; then + echo " Ruta local: $PROJECT_PATH" +fi +echo "" + +# Preguntar confirmación +read -p "¿Desea continuar? (s/n): " CONFIRM +if [[ ! "$CONFIRM" =~ ^[Ss]$ ]]; then + echo "Operación cancelada." + exit 0 +fi + +# Crear el proyecto en Forgejo +forgejo_create_project "$PROJECT_NAME" "$PROJECT_DESC" "$VISIBILITY" "$PROJECT_PATH" +RESULT=$? + +# Manejar resultado +case $RESULT in + 0) + echo "Proyecto creado exitosamente en Forgejo." + if [ -n "$PROJECT_PATH" ]; then + echo "El repositorio local ha sido configurado y enlazado con Forgejo." + REPO_URL=$(cat "$HOME/.developer/${PROJECT_NAME}.repo") + echo "URL del repositorio: $REPO_URL" + else + REPO_URL=$(cat "$HOME/.developer/${PROJECT_NAME}.repo") + echo "URL del repositorio: $REPO_URL" + echo "Para clonar el repositorio:" + echo " git clone $REPO_URL" + 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" + ;; + 13) + echo "Error: No se pudo crear el proyecto en Forgejo." + echo "Detalles del error disponibles en: $HOME/.developer/${PROJECT_NAME}.error" + ;; + *) + echo "Error desconocido (código $RESULT)." + ;; +esac + +exit $RESULT \ No newline at end of file diff --git a/bin/lib/developers.lib b/bin/lib/developers.lib index 9683d2d..c8223eb 100644 --- a/bin/lib/developers.lib +++ b/bin/lib/developers.lib @@ -40,6 +40,10 @@ function devslib_test() { exit 1 } +# Configuración global para servicios Git +FORGEJO_API_URL="https://forgejo.rosero.one/api/v1" +FORGEJO_CONFIG_FILE="$HOME/.developer/forgejo.cfg" + # Set gpg environment function gpg_setting() { @@ -288,3 +292,86 @@ function developer_restore() { 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 +function forgejo_create_project() { + 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." + 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")}" + + # Llamar a la API de Forgejo para crear el repositorio + local API_RESPONSE=$(curl -s -X POST "$FORGEJO_API_URL/user/repos" \ + -H "Authorization: token $FORGEJO_TOKEN" \ + -H "Content-Type: application/json" \ + -d "$API_DATA") + + # 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) + + echo "$REPO_URL" > "$HOME/.developer/${PROJECT_NAME}.repo" + + # 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 +}