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.
 
 
 
 
 
 

326 lines
8.5 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)
"$@"
local end_time=$(date +%s)
local duration=$((end_time - start_time))
log_success "Completed in ${duration} seconds"
}
# 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 production="${2:-false}"
log_info "Setting up environment for $build_type build"
# 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 VITE_PWA_ENABLED=false
export VITE_DISABLE_PWA=true
export DEBUG_MIGRATIONS=0
;;
"electron")
export VITE_PLATFORM=electron
export VITE_PWA_ENABLED=false
export VITE_DISABLE_PWA=true
export DEBUG_MIGRATIONS=0
;;
"web")
export VITE_PLATFORM=web
export VITE_PWA_ENABLED=true
export VITE_DISABLE_PWA=false
export DEBUG_MIGRATIONS=0
;;
*)
log_warn "Unknown build type: $build_type, using default environment"
export VITE_PLATFORM=web
export VITE_PWA_ENABLED=true
export VITE_DISABLE_PWA=false
export DEBUG_MIGRATIONS=0
;;
esac
# Log environment setup
log_debug "Environment variables set:"
log_debug " VITE_PLATFORM=$VITE_PLATFORM"
log_debug " VITE_PWA_ENABLED=$VITE_PWA_ENABLED"
log_debug " VITE_DISABLE_PWA=$VITE_DISABLE_PWA"
log_debug " DEBUG_MIGRATIONS=$DEBUG_MIGRATIONS"
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