devs/bin/project_create.sh

237 lines
No EOL
6.9 KiB
Bash
Executable file

#!/bin/bash
#
# Script: project_create.sh
# Description: Crea una carpeta de proyecto con la estructura requerida
# Modified: 2025-03-12
# 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 "$MSG_DIR/head.es"
# Variables globales
title="${head_000} ${head_002}"
apps_title="${proj_001}"
PROJECT_FOLDER=""
PROJECT_TYPE=""
VALID_TYPES=("ansible" "odoo" "sp32home" "nodejs" "python" "cobol" "otros")
# Verifica que dialog esté instalado
if ! command -v dialog &> /dev/null; then
echo "${head_001}"
exit 1
fi
# Función para obtener la carpeta de proyectos desde projects.dat
function get_projects_folder() {
if [ -f "$CONFIG_DIR/projects.dat" ]; then
PROJECT_FOLDER=$(head -n 1 "$CONFIG_DIR/projects.dat")
# Si la carpeta no comienza con / (ruta absoluta), la convertimos en ruta absoluta
if [[ "$PROJECT_FOLDER" != /* ]]; then
PROJECT_FOLDER="$HOME/$PROJECT_FOLDER"
fi
else
PROJECT_FOLDER="$HOME/proyectos"
echo "proyectos" > "$CONFIG_DIR/projects.dat"
fi
# Verificar si la carpeta base de proyectos existe, si no, crearla
if [ ! -d "$PROJECT_FOLDER" ]; then
mkdir -p "$PROJECT_FOLDER"
fi
}
# Función para solicitar el nombre del proyecto
function request_project_name() {
dialog_input_box "${proj_002}" "${proj_003}" ""
if [ $codex -ne 0 ]; then
echo "${head_canceled}"
exit 1
fi
PROJECT_NAME="$value"
# Validar que el nombre no esté vacío
if [ -z "$PROJECT_NAME" ]; then
dialog_error_box "$head_error" "${proj_004}"
request_project_name
return
fi
# Validar que el nombre sea válido para una carpeta
if [[ "$PROJECT_NAME" =~ [^a-zA-Z0-9_-] ]]; then
dialog_error_box "$head_error" "${proj_005}"
request_project_name
return
fi
PROJECT_PATH="$PROJECT_FOLDER/$PROJECT_NAME"
# Verificar si el proyecto ya existe
if [ -d "$PROJECT_PATH" ]; then
dialog_yesno "${proj_006//'$PROJECT_NAME'/$PROJECT_NAME}"
if [ $? -eq 0 ]; then
request_project_name
else
echo "${proj_007}"
exit 1
fi
fi
}
# Función para solicitar el tipo de proyecto
function request_project_type() {
# Construir las opciones para el diálogo
OPTIONS=""
for i in "${!VALID_TYPES[@]}"; do
OPTIONS="$OPTIONS ${VALID_TYPES[$i]} ${VALID_TYPES[$i]} off"
done
dialog_input_radio "${proj_008}" "${proj_009}" "$OPTIONS"
if [ $codex -ne 0 ]; then
echo "${head_canceled}"
exit 1
fi
PROJECT_TYPE="$value"
# Validar que el tipo seleccionado sea válido
VALID_TYPE=0
for t in "${VALID_TYPES[@]}"; do
if [ "$t" == "$PROJECT_TYPE" ]; then
VALID_TYPE=1
break
fi
done
if [ $VALID_TYPE -eq 0 ]; then
dialog_error_box "$head_error" "${proj_010}"
request_project_type
fi
}
# Función para crear la estructura del proyecto
function create_project_structure() {
# Crear la carpeta del proyecto
mkdir -p "$PROJECT_PATH"
# Crear estructura básica común a todos los proyectos
mkdir -p "$PROJECT_PATH/docs"
mkdir -p "$PROJECT_PATH/src"
# Crear archivo README.md básico
cat > "$PROJECT_PATH/README.md" << EOF
# Proyecto $PROJECT_NAME
## Descripción
Proyecto de tipo $PROJECT_TYPE creado con MRDevs Tools.
## Estructura
- docs/ - Documentación del proyecto
- src/ - Código fuente
## Configuración
Para configurar el entorno de desarrollo, siga las instrucciones en docs/setup.md.
## Licencia
Este proyecto está licenciado bajo AGPL-3.0.
EOF
# Crear estructura específica según el tipo de proyecto
case "$PROJECT_TYPE" in
"ansible")
mkdir -p "$PROJECT_PATH/inventories"
mkdir -p "$PROJECT_PATH/roles"
mkdir -p "$PROJECT_PATH/playbooks"
touch "$PROJECT_PATH/ansible.cfg"
;;
"odoo")
mkdir -p "$PROJECT_PATH/addons"
mkdir -p "$PROJECT_PATH/data"
mkdir -p "$PROJECT_PATH/scripts"
mkdir -p "$PROJECT_PATH/build"
touch "$PROJECT_PATH/.typset"
;;
"sp32home")
mkdir -p "$PROJECT_PATH/hardware"
mkdir -p "$PROJECT_PATH/firmware"
mkdir -p "$PROJECT_PATH/libraries"
mkdir -p "$PROJECT_PATH/build"
;;
"nodejs")
mkdir -p "$PROJECT_PATH/src/controllers"
mkdir -p "$PROJECT_PATH/src/models"
mkdir -p "$PROJECT_PATH/src/routes"
mkdir -p "$PROJECT_PATH/public"
mkdir -p "$PROJECT_PATH/tests"
touch "$PROJECT_PATH/package.json"
;;
"python")
mkdir -p "$PROJECT_PATH/src/$PROJECT_NAME"
mkdir -p "$PROJECT_PATH/tests"
touch "$PROJECT_PATH/setup.py"
touch "$PROJECT_PATH/requirements.txt"
# Crear un __init__.py básico
touch "$PROJECT_PATH/src/$PROJECT_NAME/__init__.py"
;;
"cobol")
mkdir -p "$PROJECT_PATH/src/main"
mkdir -p "$PROJECT_PATH/src/copy"
mkdir -p "$PROJECT_PATH/build"
;;
"otros")
# Estructura mínima, ya creada anteriormente
;;
esac
# Crear archivo de configuración para indicar el tipo de proyecto
echo "$PROJECT_TYPE" > "$PROJECT_PATH/.project-type"
# Mostrar mensaje de éxito
dialog_error_box "$head_info" "${proj_011}\n$PROJECT_PATH"
}
# Función principal
function main() {
clear
# Obtener la carpeta de proyectos
get_projects_folder
# Solicitar nombre del proyecto
request_project_name
# Solicitar tipo de proyecto
request_project_type
# Crear estructura del proyecto
create_project_structure
}
# Ejecutar función principal
main