diff scripts/create_structure.sh @ 0:a17a4894f4bd draft default tip

Initial commit converting git to mercurial
author Alfred Burgess <aburgess@ucc.asn.au>
date Sun, 14 Apr 2024 19:35:23 +0800
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/create_structure.sh	Sun Apr 14 19:35:23 2024 +0800
@@ -0,0 +1,360 @@
+#!/bin/bash
+
+# Script to create the Fam-tree project structure
+
+# Set project name
+project_name="fam-tree"
+root_dir="."
+
+# Set environment variables for your project
+export PROJECT_ENV_VAR1="value1"
+export PROJECT_ENV_VAR2="value2"
+
+# Set logs directory
+logs_directory="$root_dir/logs"
+
+# Feature Flags
+feature_git=0
+feature_docker=0
+
+# Error flag
+error_flag=0
+
+# Function to display messages to both console and log file
+log_error() {
+  echo "E: $(date +"%Y-%m-%d %H:%M:%S") - $1"
+}
+log_message() {
+  echo "I: $(date +"%Y-%m-%d %H:%M:%S") - $1"
+}
+
+# Function to create a directory if it doesn't exist
+create_directory() {
+  if [ ! -d "$1" ]; then
+    mkdir -p "$1"
+    if [ $? -ne 0 ]; then
+      log_error "Error: Failed to create directory '$1'" >&2
+      error_flag=1
+    else
+      log_message "Created directory: $1"
+    fi
+  else
+    log_message "Directory exists. Skipped: $1"
+  fi
+}
+
+# Function to create a file if it doesn't exist
+create_file() {
+  if [ ! -f "$1" ]; then
+    touch "$1"
+    if [ $? -ne 0 ]; then
+      log_error "Error: Failed to create file '$1'" >&2
+      error_flag=1
+    else
+      log_message "Created file: $1"
+    fi
+  else
+    log_message "File exists. Skipped: $1"
+  fi
+}
+
+install_dependency() {
+  local dependency="$1"
+
+  if ! command -v "$dependency" &> /dev/null; then
+    echo "Installing $dependency..."
+    case "$dependency" in
+      "docker")
+	# Install Docker using the official scrip
+	curl -fsSL https://get.docker.com -o get-docker.sh
+	sudo sh get-docker.sh
+	rm get-docker.sh
+	;;
+      *)
+	# For other dependencies, use your package manager
+	# Add more conditions for different package managers (e.g., apt, yum)
+	echo "Please install $dependency manually."
+	error_flag=1
+	;;
+    esac
+  fi
+}
+
+check_tool_exists() {
+  local tool_name=$1
+  command -v "$tool_name" >/dev/null 2>&1
+  return $?
+}
+
+if check_tool_exists "git"; then
+  feature_git=1
+fi
+
+if check_tool_exists "docker"; then
+  feature_docker=1
+fi
+
+# Function to generate GitLab CI configuration
+generate_gitlab_ci() {
+  local gitlab_ci_file=".gitlab-ci.yml"
+  cat <<EOL > "$gitlab_ci_file"
+stages:
+	- build
+	- test
+	- deploy
+
+variables:
+	DOCKER_COMPOSE_VERSION: "1.27.4"
+
+before_script:
+	- docker --version
+	- docker-compose --version
+
+services:
+	- docker:$DOCKER_COMPOSE_VERSION
+
+build:
+	stage: build
+	script:
+		- docker-compose build
+
+test:
+	stage: test
+	script:
+		- docker-compose run --rm backend /your/test/command
+
+deploy:
+	stage: deploy
+	script:
+		- echo "Deploy your application here"
+EOL
+
+echo "GitLab CI file created: $gitlab_ci_file"
+}
+
+
+# Create logs directory
+create_directory "$logs_directory"
+
+# Create log file with timestamp
+log_file="$logs_directory/$(date +"%Y%m%d%H%M%S").log"
+touch "$log_file"
+
+# Redirect all subsequent output to the log file
+exec 3>&1 4>&2 1>>"$log_file" 2>&1
+
+
+# Display welcome message in the log
+log_message "Creating project structure for $project_name"
+
+# Create backend directory
+create_directory "$root_dir/backend"
+create_file "$root_dir/backend/main.go"
+
+# Create API directory
+create_directory "$root_dir/backend/api"
+create_file "$root_dir/backend/api/family-tree.proto"
+
+# Create database directory
+create_directory "$root_dir/backend/database"
+create_directory "$root_dir/backend/database/migrations"
+
+# Create cmd directory for server configurations
+create_directory "$root_dir/backend/cmd"
+create_directory "$root_dir/backend/cmd/server"
+create_file "$root_dir/backend/cmd/server/config.yaml"
+create_file "$root_dir/backend/cmd/server/start.sh"
+create_file "$root_dir/backend/cmd/server/stop.sh"
+
+# Create frontend directory
+create_directory "$root_dir/frontend"
+create_directory "$root_dir/frontend/src"
+create_directory "$root_dir/frontend/src/components"
+create_directory "$root_dir/frontend/src/services"
+
+# Create proto directory for shared .proto definitions
+create_directory "$root_dir/proto"
+create_file "$root_dir/proto/family-tree.proto"
+
+# Create nginx directory
+create_directory "$root_dir/nginx"
+create_file "$root_dir/nginx/nginx.conf"
+
+# Create backend directory
+create_directory "$root_dir/backend"
+create_file "$root_dir/backend/dockerfile"
+
+# Create frontend directory
+create_directory "$root_dir/frontend"
+create_file "$root_dir/frontend/dockerfile"
+
+# Create docker-compose.yml for Docker Compose configuration
+create_file "$root_dir/docker-compose.yml"
+
+# Create scripts directory for setup, start, and stop scripts
+create_directory "$root_dir/scripts"
+create_file "$root_dir/scripts/setup.sh"
+create_file "$root_dir/scripts/start.sh"
+create_file "$root_dir/scripts/stop.sh"
+
+# Create docs directory for documentation
+create_directory "$root_dir/docs"
+create_file "$root_dir/docs/api.md"
+create_file "$root_dir/docs/database.md"
+
+# Create cron directory for automated scheduled actions
+create_directory "$root_dir/cron"
+create_file "$root_dir/cron/cronjobs"
+create_file "$root_dir/cron/tasks"
+
+# Create tests directory for automated tests
+create_directory "$root_dir/tests"
+
+# Create ci-cd directory for GitLab CI/CD configuration
+create_directory "$root_dir/ci-cd"
+create_file "$root_dir/ci-cd/gitlab-ci.yml"
+
+# Create config directory for application settings
+create_directory "$root_dir/config"
+create_file "$root_dir/config/config.yaml"
+
+# Create README.md for project documentation
+create_file "$root_dir/README.md"
+
+# Create .gitignore for Git ignore file
+create_file "$root_dir/.gitignore"
+# Function to create a gitignore file
+create_gitignore() {
+  cat <<EOL > .gitignore
+# Ignore logs
+logs/
+
+# Ignore compiled binaries
+*.exe
+*.dll
+*.out
+
+# Ignore user-specific files
+.idea/
+.vscode/
+
+# Ignore system files
+.DS_Store
+Thumbs.db
+
+# Ignore node modules
+node_modules/
+
+# Ignore compiled TypeScript
+*.js
+*.js.map
+
+# Ignore Go binary
+*.go
+
+# Ignore Docker artifacts
+dockerfile.*
+docker-compose.yml
+
+# Ignore dependencies
+vendor/
+
+# Ignore compiled Python files
+*.pyc
+__pycache__/
+
+# Ignore compiled Java files
+*.class
+
+# Ignore temporary files
+*.tmp
+
+# Ignore editor backup files
+*~
+*.swp
+*.swo
+*.swn
+*.swm
+*.swl
+
+# Ignore environment variables file
+.env
+
+# Ignore build artifacts
+build/
+dist/
+
+# Ignore database migrations
+database/migrations/*.sql
+EOL
+}
+
+initialize_git_repository() {
+  if [ "$feature_git" -ne 0 ]; then
+    if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1;
+    then
+      log_message "Git repo already enabled"
+    else
+      git init --initial-branch=main
+      if [ $? -ne 0 ]; then
+	log_error "Error: Failed to initialize Git repository" >&2
+	error_flag=1
+      else
+	git add -A
+	git commit -m "Initial commit for project: $project_name"
+      fi
+    fi
+  else
+    log_message "Git not enabled"
+  fi
+}
+
+# Function to create a pre-commit hook
+create_pre_commit_hook() {
+  if [ "$feature_git" -ne 0 ]; then
+    local pre_commit_hook=".git/hooks/pre-commit"
+    local hook_script="#!/bin/bash\n\n# This script runs before every commit to perform linting, formatting, or other checks\n# Add your checks or commands here\n\n# Example: Run a linter\n# lint_command=\"your-linter-command\"\n# \$lint_command\n\n# Example: Run a formatter\n# format_command=\"your-formatter-command\"\n# \$format_command\n\n# If any command fails, the commit will be aborted\n"
+
+create_file "$pre_commit_hook"
+echo "$hook_script" > "$pre_commit_hook"
+chmod +x "$pre_commit_hook"
+  fi
+}
+
+# Check for errors
+if [ "$error_flag" -eq 1 ]; then
+  echo "Error: One or more errors occurred during script execution. See the log for details." >&2
+  exit 1
+fi
+
+# Function to create README with a basic structure
+create_readme() {
+  local readme_file="README.md"
+  local readme_content="# $project_name\nThis is a basic README file for the project."
+  create_file "$readme_file"
+  echo "$readme_content" > "$readme_file"
+}
+
+dependencies=("git" "docker")
+for dep in "${dependencies[@]}"; do 
+  echo "$dep"
+done
+
+# Create gitignore file
+create_gitignore
+initialize_git_repository
+create_readme
+generate_gitlab_ci
+
+# Display success message in the log
+echo "Gitignore file created successfully"
+
+# Display success message in the log
+log_message "Project structure for $project_name created successfully"
+
+# Restore default output and close the log file
+exec 1>&3 2>&4
+exec 3>&- 4>&-
+
+# Display log file path
+echo "Log file created at: $log_file"