[ADDED] Función para crear proyectos en Forgejo y script de utilidad
- 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 <noreply@anthropic.com>
This commit is contained in:
parent
e9d054aad6
commit
07c4be3c19
2 changed files with 257 additions and 0 deletions
170
bin/forgejo_project.sh
Executable file
170
bin/forgejo_project.sh
Executable file
|
@ -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. <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 [ -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
|
|
@ -40,6 +40,10 @@ function devslib_test() {
|
||||||
exit 1
|
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
|
# Set gpg environment
|
||||||
function gpg_setting() {
|
function gpg_setting() {
|
||||||
|
|
||||||
|
@ -288,3 +292,86 @@ 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
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue