237 lines
No EOL
6.9 KiB
Bash
Executable file
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 |