You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							347 lines
						
					
					
						
							9.8 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							347 lines
						
					
					
						
							9.8 KiB
						
					
					
				| #!/bin/bash | |
| # common.sh | |
| # Author: Matthew Raymer | |
| # Description: Common utilities and functions for TimeSafari build scripts | |
| # This script provides shared logging, timing, and utility functions | |
| # that can be sourced by other build scripts to eliminate redundancy. | |
| # | |
| # Usage: source ./scripts/common.sh | |
| # | |
| # Provides: | |
| # - Color constants | |
| # - Logging functions (log_info, log_success, log_warn, log_error) | |
| # - Timing function (measure_time) | |
| # - Common utility functions | |
| # - Environment variable management | |
| 
 | |
| # ANSI color codes for better output formatting | |
| readonly RED='\033[0;31m' | |
| readonly GREEN='\033[0;32m' | |
| readonly YELLOW='\033[1;33m' | |
| readonly BLUE='\033[0;34m' | |
| readonly PURPLE='\033[0;35m' | |
| readonly CYAN='\033[0;36m' | |
| readonly NC='\033[0m' # No Color | |
| 
 | |
| # Logging functions | |
| log_info() { | |
|     echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')] [INFO]${NC} $1" | |
| } | |
| 
 | |
| log_success() { | |
|     echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] [SUCCESS]${NC} $1" | |
| } | |
| 
 | |
| log_warn() { | |
|     echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] [WARN]${NC} $1" | |
| } | |
| 
 | |
| log_error() { | |
|     echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] [ERROR]${NC} $1" | |
| } | |
| 
 | |
| log_debug() { | |
|     echo -e "${PURPLE}[$(date '+%Y-%m-%d %H:%M:%S')] [DEBUG]${NC} $1" | |
| } | |
| 
 | |
| log_step() { | |
|     echo -e "${CYAN}[$(date '+%Y-%m-%d %H:%M:%S')] [STEP]${NC} $1" | |
| } | |
| 
 | |
| # Function to measure and log execution time | |
| measure_time() { | |
|     local start_time=$(date +%s) | |
|     if "$@"; then | |
|         local end_time=$(date +%s) | |
|         local duration=$((end_time - start_time)) | |
|         log_success "Completed in ${duration} seconds" | |
|         return 0 | |
|     else | |
|         local exit_code=$? | |
|         local end_time=$(date +%s) | |
|         local duration=$((end_time - start_time)) | |
|         log_error "Failed after ${duration} seconds (exit code: ${exit_code})" | |
|         return $exit_code | |
|     fi | |
| } | |
| 
 | |
| # Function to print section headers | |
| print_header() { | |
|     local title="$1" | |
|     echo -e "\n${BLUE}=== $title ===${NC}\n" | |
| } | |
| 
 | |
| print_footer() { | |
|     local title="$1" | |
|     echo -e "\n${GREEN}=== $title Complete ===${NC}\n" | |
| } | |
| 
 | |
| # Function to check if a command exists | |
| check_command() { | |
|     if ! command -v "$1" &> /dev/null; then | |
|         log_error "$1 is required but not installed." | |
|         return 1 | |
|     fi | |
|     log_debug "Found $1: $(command -v "$1")" | |
|     return 0 | |
| } | |
| 
 | |
| # Function to check if a directory exists | |
| check_directory() { | |
|     if [ ! -d "$1" ]; then | |
|         log_error "Directory not found: $1" | |
|         return 1 | |
|     fi | |
|     log_debug "Directory exists: $1" | |
|     return 0 | |
| } | |
| 
 | |
| # Function to check if a file exists | |
| check_file() { | |
|     if [ ! -f "$1" ]; then | |
|         log_error "File not found: $1" | |
|         return 1 | |
|     fi | |
|     log_debug "File exists: $1" | |
|     return 0 | |
| } | |
| 
 | |
| # Function to safely execute a command with error handling | |
| safe_execute() { | |
|     local step_name="$1" | |
|     local command="$2" | |
|      | |
|     log_step "$step_name" | |
|     if ! measure_time eval "$command"; then | |
|         log_error "$step_name failed!" | |
|         return 1 | |
|     fi | |
|     return 0 | |
| } | |
| 
 | |
| # Function to check virtual environment for Python scripts | |
| check_venv() { | |
|     if [ ! -d ".venv" ]; then | |
|         log_error "Virtual environment not found. Please create it first:" | |
|         log_error "python -m venv .venv" | |
|         log_error "source .venv/bin/activate" | |
|         log_error "pip install -r requirements.txt" | |
|         return 1 | |
|     fi | |
|     log_debug "Virtual environment found: .venv" | |
|     return 0 | |
| } | |
| 
 | |
| # Function to get git hash for versioning | |
| get_git_hash() { | |
|     if command -v git &> /dev/null; then | |
|         git log -1 --pretty=format:%h 2>/dev/null || echo "unknown" | |
|     else | |
|         echo "unknown" | |
|     fi | |
| } | |
| 
 | |
| # Function to clean build artifacts | |
| clean_build_artifacts() { | |
|     local artifacts=("$@") | |
|     for artifact in "${artifacts[@]}"; do | |
|         if [ -e "$artifact" ]; then | |
|             log_info "Cleaning $artifact" | |
|             rm -rf "$artifact" | |
|         fi | |
|     done | |
| } | |
| 
 | |
| # Function to validate environment variables | |
| validate_env_vars() { | |
|     local required_vars=("$@") | |
|     local missing_vars=() | |
|      | |
|     for var in "${required_vars[@]}"; do | |
|         if [ -z "${!var}" ]; then | |
|             missing_vars+=("$var") | |
|         fi | |
|     done | |
|      | |
|     if [ ${#missing_vars[@]} -gt 0 ]; then | |
|         log_error "Missing required environment variables: ${missing_vars[*]}" | |
|         return 1 | |
|     fi | |
|      | |
|     return 0 | |
| } | |
| 
 | |
| # Function to set environment variables for different build types | |
| setup_build_env() { | |
|     local build_type="$1" | |
|     local build_mode="${2:-development}" | |
|      | |
|     log_info "Setting up environment for $build_type build (mode: $build_mode)" | |
|      | |
|     # Get git hash for versioning | |
|     local git_hash=$(get_git_hash) | |
|     export VITE_GIT_HASH="$git_hash" | |
|     log_debug "Set VITE_GIT_HASH=$git_hash" | |
|      | |
|     case $build_type in | |
|         "capacitor") | |
|             export VITE_PLATFORM=capacitor | |
|             export DEBUG_MIGRATIONS=0 | |
|             ;; | |
|         "electron") | |
|             export VITE_PLATFORM=electron | |
|             export DEBUG_MIGRATIONS=0 | |
|             ;; | |
|         "web") | |
|             export VITE_PLATFORM=web | |
|             export DEBUG_MIGRATIONS=0 | |
|             ;; | |
|         *) | |
|             log_warn "Unknown build type: $build_type, using default environment" | |
|             export VITE_PLATFORM=web | |
|             export DEBUG_MIGRATIONS=0 | |
|             ;; | |
|     esac | |
|      | |
|     # Set API server environment variables based on build mode | |
|     if [ "$build_mode" = "development" ]; then | |
|         # For Capacitor development, use localhost by default | |
|         # Android builds will override this in build-android.sh | |
|         export VITE_DEFAULT_ENDORSER_API_SERVER="http://localhost:3000" | |
|         export VITE_DEFAULT_PARTNER_API_SERVER="http://localhost:3000" | |
|         log_debug "Development mode: Using localhost for Endorser and Partner APIs" | |
|         export VITE_DEFAULT_IMAGE_API_SERVER="https://image-api.timesafari.app" | |
|     elif [ "$build_mode" = "test" ]; then | |
|         export VITE_DEFAULT_ENDORSER_API_SERVER="https://test-api.endorser.ch" | |
|         export VITE_DEFAULT_PARTNER_API_SERVER="https://test-partner-api.endorser.ch" | |
|         log_debug "Test mode: Using test Endorser and Partner APIs" | |
|         export VITE_DEFAULT_IMAGE_API_SERVER="https://image-api.timesafari.app" | |
|     elif [ "$build_mode" = "production" ]; then | |
|         export VITE_DEFAULT_ENDORSER_API_SERVER="https://api.endorser.ch" | |
|         export VITE_DEFAULT_PARTNER_API_SERVER="https://partner-api.endorser.ch" | |
|         log_debug "Production mode: Using production API servers" | |
|         export VITE_DEFAULT_IMAGE_API_SERVER="https://image-api.timesafari.app" | |
|     fi | |
|      | |
|     # Log environment setup | |
|     log_debug "Environment variables set:" | |
|     log_debug "  VITE_PLATFORM=$VITE_PLATFORM" | |
|     log_debug "  DEBUG_MIGRATIONS=$DEBUG_MIGRATIONS" | |
|     log_debug "  VITE_DEFAULT_ENDORSER_API_SERVER=$VITE_DEFAULT_ENDORSER_API_SERVER" | |
|     log_debug "  VITE_DEFAULT_IMAGE_API_SERVER=$VITE_DEFAULT_IMAGE_API_SERVER" | |
|     log_debug "  VITE_DEFAULT_PARTNER_API_SERVER=$VITE_DEFAULT_PARTNER_API_SERVER" | |
|     if [ -n "$NODE_ENV" ]; then | |
|         log_debug "  NODE_ENV=$NODE_ENV" | |
|     fi | |
| } | |
| 
 | |
| # Function to create application directories | |
| setup_app_directories() { | |
|     log_info "Setting up application directories..." | |
|      | |
|     # Create TimeSafari data directory | |
|     mkdir -p ~/.local/share/TimeSafari/timesafari | |
|      | |
|     # Create build directories if they don't exist | |
|     mkdir -p dist | |
|      | |
|     log_debug "Application directories created" | |
| } | |
| 
 | |
| # Function to load environment from .env file if it exists | |
| load_env_file() { | |
|     local env_file="$1" | |
|      | |
|     if [ -f "$env_file" ]; then | |
|         log_info "Loading environment from $env_file" | |
|         # Export variables from .env file (simple key=value format) | |
|         while IFS='=' read -r key value; do | |
|             # Skip comments and empty lines | |
|             [[ $key =~ ^#.*$ ]] && continue | |
|             [[ -z $key ]] && continue | |
|              | |
|             # Remove quotes from value if present | |
|             value=$(echo "$value" | sed 's/^["'\'']//;s/["'\'']$//') | |
|              | |
|             export "$key=$value" | |
|             log_debug "Loaded: $key=$value" | |
|         done < "$env_file" | |
|     else | |
|         log_debug "No $env_file file found" | |
|     fi | |
| } | |
| 
 | |
| # Function to print current environment variables | |
| print_env_vars() { | |
|     local prefix="$1" | |
|      | |
|     if [ -n "$prefix" ]; then | |
|         log_info "Environment variables with prefix '$prefix':" | |
|         env | grep "^$prefix" | sort | while read -r line; do | |
|             log_debug "  $line" | |
|         done | |
|     else | |
|         log_info "Current environment variables:" | |
|         env | sort | while read -r line; do | |
|             log_debug "  $line" | |
|         done | |
|     fi | |
| } | |
| 
 | |
| # Function to print script usage | |
| print_usage() { | |
|     local script_name="$1" | |
|     local usage_text="$2" | |
|      | |
|     echo "Usage: $script_name $usage_text" | |
|     echo "" | |
|     echo "Options:" | |
|     echo "  -h, --help     Show this help message" | |
|     echo "  -v, --verbose  Enable verbose logging" | |
|     echo "  -e, --env      Show environment variables" | |
|     echo "" | |
| } | |
| 
 | |
| # Function to parse command line arguments | |
| parse_args() { | |
|     local args=("$@") | |
|     local verbose=false | |
|     local show_env=false | |
|      | |
|     for arg in "${args[@]}"; do | |
|         case $arg in | |
|             -h|--help) | |
|                 print_usage "$0" "[options]" | |
|                 exit 0 | |
|                 ;; | |
|             -v|--verbose) | |
|                 verbose=true | |
|                 ;; | |
|             -e|--env) | |
|                 show_env=true | |
|                 ;; | |
|             *) | |
|                 # Handle other arguments in child scripts | |
|                 ;; | |
|         esac | |
|     done | |
|      | |
|     if [ "$verbose" = true ]; then | |
|         # Enable debug logging | |
|         set -x | |
|     fi | |
|      | |
|     if [ "$show_env" = true ]; then | |
|         print_env_vars "VITE_" | |
|         exit 0 | |
|     fi | |
| } | |
| 
 | |
| # Export functions for use in child scripts | |
| export -f log_info log_success log_warn log_error log_debug log_step | |
| export -f measure_time print_header print_footer | |
| export -f check_command check_directory check_file | |
| export -f safe_execute check_venv get_git_hash | |
| export -f clean_build_artifacts validate_env_vars | |
| export -f setup_build_env setup_app_directories load_env_file print_env_vars | |
| export -f print_usage parse_args  |