#!/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. ] # # 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 "$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