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.
		
		
		
		
		
			
		
			
				
					
					
						
							343 lines
						
					
					
						
							10 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							343 lines
						
					
					
						
							10 KiB
						
					
					
				| #!/bin/bash | |
| # auto-run.sh | |
| # Author: Matthew Raymer | |
| # Description: Smart auto-run script that detects devices and automatically launches | |
| # the appropriate target for test and production builds | |
| # | |
| # This script can: | |
| # - Detect connected Android devices vs emulators | |
| # - Detect connected iOS devices vs simulators   | |
| # - Automatically launch Electron app | |
| # - Choose the best available target for each platform | |
| # | |
| # Usage: | |
| #   ./scripts/auto-run.sh [--test|--prod] [--platform=ios|android|electron|all] | |
| # | |
| # Exit Codes: | |
| # 0 - Success | |
| # 1 - No devices found | |
| # 2 - Build failed | |
| # 3 - Launch failed | |
| 
 | |
| # Exit on any error | |
| set -e | |
| 
 | |
| # Source common utilities | |
| source "$(dirname "$0")/common.sh" | |
| 
 | |
| # Default values | |
| BUILD_MODE="development" | |
| PLATFORM="all" | |
| AUTO_CONFIRM=false | |
| 
 | |
| # Parse command line arguments | |
| while [[ $# -gt 0 ]]; do | |
|     case $1 in | |
|         --test) | |
|             BUILD_MODE="test" | |
|             shift | |
|             ;; | |
|         --prod) | |
|             BUILD_MODE="production" | |
|             shift | |
|             ;; | |
|         --platform=*) | |
|             PLATFORM="${1#*=}" | |
|             shift | |
|             ;; | |
|         --auto) | |
|             AUTO_CONFIRM=true | |
|             shift | |
|             ;; | |
|         --help) | |
|             echo "Usage: $0 [--test|--prod] [--platform=ios|android|electron|all] [--auto]" | |
|             echo "" | |
|             echo "Options:" | |
|             echo "  --test          Build and run in test mode" | |
|             echo "  --prod          Build and run in production mode" | |
|             echo "  --platform=PLATFORM  Target platform (ios|android|electron|all)" | |
|             echo "  --auto          Skip confirmation prompts" | |
|             echo "  --help          Show this help message" | |
|             exit 0 | |
|             ;; | |
|         *) | |
|             log_error "Unknown option: $1" | |
|             exit 1 | |
|             ;; | |
|     esac | |
| done | |
| 
 | |
| # Print header | |
| print_header "TimeSafari Auto-Run" | |
| log_info "Build mode: $BUILD_MODE" | |
| log_info "Target platform: $PLATFORM" | |
| log_info "Auto confirm: $AUTO_CONFIRM" | |
| 
 | |
| # Function to detect Android devices | |
| detect_android_devices() { | |
|     log_step "Detecting Android devices..." | |
|      | |
|     # Check if adb is available | |
|     if ! command -v adb &> /dev/null; then | |
|         log_warn "ADB not found - Android detection skipped" | |
|         return 1 | |
|     fi | |
|      | |
|     # Get list of devices | |
|     local devices_output=$(adb devices 2>/dev/null || echo "") | |
|     local devices=() | |
|     local emulators=() | |
|      | |
|     # Parse device list | |
|     while IFS= read -r line; do | |
|         if [[ $line =~ ^([a-zA-Z0-9.-]+)[[:space:]]+device$ ]]; then | |
|             local device_id="${BASH_REMATCH[1]}" | |
|              | |
|             # Check if it's an emulator (emulator IDs typically contain 'emulator') | |
|             if [[ $device_id == *"emulator"* ]]; then | |
|                 emulators+=("$device_id") | |
|             else | |
|                 devices+=("$device_id") | |
|             fi | |
|         fi | |
|     done <<< "$devices_output" | |
|      | |
|     # Log results | |
|     if [ ${#devices[@]} -gt 0 ]; then | |
|         log_success "Found ${#devices[@]} real Android device(s): ${devices[*]}" | |
|     fi | |
|      | |
|     if [ ${#emulators[@]} -gt 0 ]; then | |
|         log_success "Found ${#emulators[@]} Android emulator(s): ${emulators[*]}" | |
|     fi | |
|      | |
|     if [ ${#devices[@]} -eq 0 ] && [ ${#emulators[@]} -eq 0 ]; then | |
|         log_warn "No Android devices or emulators found" | |
|         return 1 | |
|     fi | |
|      | |
|     # Return device type and ID | |
|     if [ ${#devices[@]} -gt 0 ]; then | |
|         echo "real:${devices[0]}" | |
|     else | |
|         echo "emulator:${emulators[0]}" | |
|     fi | |
| } | |
| 
 | |
| # Function to detect iOS devices | |
| detect_ios_devices() { | |
|     log_step "Detecting iOS devices..." | |
|      | |
|     # Check if xcrun is available | |
|     if ! command -v xcrun &> /dev/null; then | |
|         log_warn "xcrun not found - iOS detection skipped" | |
|         return 1 | |
|     fi | |
|      | |
|     # Get list of devices | |
|     local devices_output=$(xcrun xctrace list devices 2>/dev/null || echo "") | |
|     local devices=() | |
|     local simulators=() | |
|      | |
|     # Parse device list | |
|     while IFS= read -r line; do | |
|         # Look for real devices (containing "iPhone" or "iPad" but not "Simulator") | |
|         if [[ $line =~ iPhone|iPad ]] && [[ $line != *"Simulator"* ]]; then | |
|             if [[ $line =~ \(([A-F0-9-]+)\) ]]; then | |
|                 local device_id="${BASH_REMATCH[1]}" | |
|                 devices+=("$device_id") | |
|             fi | |
|         fi | |
|          | |
|         # Look for simulators | |
|         if [[ $line =~ Simulator ]]; then | |
|             if [[ $line =~ \(([A-F0-9-]+)\) ]]; then | |
|                 local simulator_id="${BASH_REMATCH[1]}" | |
|                 simulators+=("$simulator_id") | |
|             fi | |
|         fi | |
|     done <<< "$devices_output" | |
|      | |
|     # Log results | |
|     if [ ${#devices[@]} -gt 0 ]; then | |
|         log_success "Found ${#devices[@]} real iOS device(s): ${devices[*]}" | |
|     fi | |
|      | |
|     if [ ${#simulators[@]} -gt 0 ]; then | |
|         log_success "Found ${#simulators[@]} iOS simulator(s): ${simulators[*]}" | |
|     fi | |
|      | |
|     if [ ${#devices[@]} -eq 0 ] && [ ${#simulators[@]} -eq 0 ]; then | |
|         log_warn "No iOS devices or simulators found" | |
|         return 1 | |
|     fi | |
|      | |
|     # Return device type and ID | |
|     if [ ${#devices[@]} -gt 0 ]; then | |
|         echo "real:${devices[0]}" | |
|     else | |
|         echo "simulator:${simulators[0]}" | |
|     fi | |
| } | |
| 
 | |
| # Function to build and run Android | |
| run_android() { | |
|     local device_info=$1 | |
|     local device_type=$(echo "$device_info" | cut -d: -f1) | |
|     local device_id=$(echo "$device_info" | cut -d: -f2) | |
|      | |
|     log_step "Building and running Android ($device_type: $device_id)..." | |
|      | |
|     # Build the app | |
|     if [ "$BUILD_MODE" = "test" ]; then | |
|         safe_execute "Building Android (test)" "npm run build:android:test" | |
|     elif [ "$BUILD_MODE" = "production" ]; then | |
|         safe_execute "Building Android (production)" "npm run build:android:prod" | |
|     else | |
|         safe_execute "Building Android (development)" "npm run build:android:dev" | |
|     fi | |
|      | |
|     # Run the app | |
|     if [ "$device_type" = "real" ]; then | |
|         log_info "Installing and launching on real device: $device_id" | |
|         safe_execute "Installing APK" "adb -s $device_id install -r android/app/build/outputs/apk/debug/app-debug.apk" | |
|         safe_execute "Launching app" "adb -s $device_id shell am start -n app.timesafari.app/app.timesafari.MainActivity" | |
|     else | |
|         log_info "Launching emulator and installing app" | |
|         safe_execute "Launching app" "npx cap run android" | |
|     fi | |
| } | |
| 
 | |
| # Function to build and run iOS | |
| run_ios() { | |
|     local device_info=$1 | |
|     local device_type=$(echo "$device_info" | cut -d: -f1) | |
|     local device_id=$(echo "$device_info" | cut -d: -f2) | |
|      | |
|     log_step "Building and running iOS ($device_type: $device_id)..." | |
|      | |
|     # Build the app | |
|     if [ "$BUILD_MODE" = "test" ]; then | |
|         safe_execute "Building iOS (test)" "npm run build:ios:test" | |
|     elif [ "$BUILD_MODE" = "production" ]; then | |
|         safe_execute "Building iOS (production)" "npm run build:ios:prod" | |
|     else | |
|         safe_execute "Building iOS (development)" "npm run build:ios:dev" | |
|     fi | |
|      | |
|     # Run the app | |
|     if [ "$device_type" = "real" ]; then | |
|         log_info "Building and installing on real device: $device_id" | |
|         safe_execute "Building for device" "npm run build:ios:release" | |
|         # Note: For real devices, you'd typically need to use Xcode | |
|         log_warn "Real device deployment requires Xcode setup" | |
|     else | |
|         log_info "Launching simulator and installing app" | |
|         safe_execute "Launching app" "npx cap run ios" | |
|     fi | |
| } | |
| 
 | |
| # Function to build and run Electron | |
| run_electron() { | |
|     log_step "Building and running Electron..." | |
|      | |
|     # Build the app | |
|     if [ "$BUILD_MODE" = "test" ]; then | |
|         safe_execute "Building Electron (test)" "npm run build:electron:test" | |
|     elif [ "$BUILD_MODE" = "production" ]; then | |
|         safe_execute "Building Electron (production)" "npm run build:electron:prod" | |
|     else | |
|         safe_execute "Building Electron (development)" "npm run build:electron:dev" | |
|     fi | |
|      | |
|     # Run the app | |
|     log_info "Launching Electron app" | |
|     safe_execute "Launching Electron" "npm run electron:start" | |
| } | |
| 
 | |
| # Main execution | |
| main() { | |
|     log_info "Starting auto-run at $(date)" | |
|      | |
|     # Detect available platforms | |
|     local android_device="" | |
|     local ios_device="" | |
|     local electron_available=true | |
|      | |
|     # Check Android | |
|     if [ "$PLATFORM" = "all" ] || [ "$PLATFORM" = "android" ]; then | |
|         android_device=$(detect_android_devices) || log_warn "Android not available" | |
|     fi | |
|      | |
|     # Check iOS (only on macOS) | |
|     if [ "$PLATFORM" = "all" ] || [ "$PLATFORM" = "ios" ]; then | |
|         if [ "$(uname)" = "Darwin" ]; then | |
|             ios_device=$(detect_ios_devices) || log_warn "iOS not available" | |
|         else | |
|             log_warn "iOS not available on non-macOS platform" | |
|         fi | |
|     fi | |
|      | |
|     # Check Electron | |
|     if [ "$PLATFORM" = "all" ] || [ "$PLATFORM" = "electron" ]; then | |
|         if ! command -v electron &> /dev/null; then | |
|             log_warn "Electron not available" | |
|             electron_available=false | |
|         fi | |
|     fi | |
|      | |
|     # Show available options | |
|     log_info "Available targets:" | |
|     [ -n "$android_device" ] && log_info "  Android: $android_device" | |
|     [ -n "$ios_device" ] && log_info "  iOS: $ios_device" | |
|     [ "$electron_available" = true ] && log_info "  Electron: available" | |
|      | |
|     # Confirm with user (unless auto mode) | |
|     if [ "$AUTO_CONFIRM" = false ]; then | |
|         echo "" | |
|         read -p "Continue with auto-run? (y/N): " -n 1 -r | |
|         echo "" | |
|         if [[ ! $REPLY =~ ^[Yy]$ ]]; then | |
|             log_info "Auto-run cancelled by user" | |
|             exit 0 | |
|         fi | |
|     fi | |
|      | |
|     # Execute based on platform selection | |
|     local success_count=0 | |
|      | |
|     if [ "$PLATFORM" = "android" ] || [ "$PLATFORM" = "all" ]; then | |
|         if [ -n "$android_device" ]; then | |
|             if run_android "$android_device"; then | |
|                 ((success_count++)) | |
|             fi | |
|         fi | |
|     fi | |
|      | |
|     if [ "$PLATFORM" = "ios" ] || [ "$PLATFORM" = "all" ]; then | |
|         if [ -n "$ios_device" ]; then | |
|             if run_ios "$ios_device"; then | |
|                 ((success_count++)) | |
|             fi | |
|         fi | |
|     fi | |
|      | |
|     if [ "$PLATFORM" = "electron" ] || [ "$PLATFORM" = "all" ]; then | |
|         if [ "$electron_available" = true ]; then | |
|             if run_electron; then | |
|                 ((success_count++)) | |
|             fi | |
|         fi | |
|     fi | |
|      | |
|     # Summary | |
|     if [ $success_count -gt 0 ]; then | |
|         log_success "Auto-run completed successfully! $success_count platform(s) launched." | |
|     else | |
|         log_error "No platforms were successfully launched" | |
|         exit 1 | |
|     fi | |
| } | |
| 
 | |
| # Run main function | |
| main "$@"  |