#!/bin/bash # Ruby Version Manager (rbenv) Setup Script # Installs rbenv and Ruby 3.1+ for CocoaPods compatibility set -e # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } log_step() { echo -e "${BLUE}[STEP]${NC} $1" } # Check if rbenv is already installed if command -v rbenv &> /dev/null; then log_info "rbenv is already installed" RBENV_INSTALLED=true else log_step "Installing rbenv..." RBENV_INSTALLED=false fi # Install rbenv via Homebrew (recommended on macOS) if [ "$RBENV_INSTALLED" = false ]; then if command -v brew &> /dev/null; then log_info "Installing rbenv via Homebrew..." brew install rbenv ruby-build # Initialize rbenv in shell if [ -n "$ZSH_VERSION" ]; then SHELL_CONFIG="$HOME/.zshrc" else SHELL_CONFIG="$HOME/.bash_profile" fi # Add rbenv initialization to shell config if ! grep -q "rbenv init" "$SHELL_CONFIG" 2>/dev/null; then log_info "Adding rbenv initialization to $SHELL_CONFIG..." echo '' >> "$SHELL_CONFIG" echo '# rbenv initialization' >> "$SHELL_CONFIG" echo 'eval "$(rbenv init - zsh)"' >> "$SHELL_CONFIG" fi # Load rbenv in current session eval "$(rbenv init - zsh)" log_info "✓ rbenv installed successfully" else log_warn "Homebrew not found. Installing rbenv manually..." # Manual installation via git if [ ! -d "$HOME/.rbenv" ]; then git clone https://github.com/rbenv/rbenv.git ~/.rbenv fi if [ ! -d "$HOME/.rbenv/plugins/ruby-build" ]; then mkdir -p ~/.rbenv/plugins git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build fi # Add to PATH export PATH="$HOME/.rbenv/bin:$PATH" eval "$(rbenv init - zsh)" # Add to shell config if [ -n "$ZSH_VERSION" ]; then SHELL_CONFIG="$HOME/.zshrc" else SHELL_CONFIG="$HOME/.bash_profile" fi if ! grep -q "rbenv init" "$SHELL_CONFIG" 2>/dev/null; then echo '' >> "$SHELL_CONFIG" echo '# rbenv initialization' >> "$SHELL_CONFIG" echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> "$SHELL_CONFIG" echo 'eval "$(rbenv init - zsh)"' >> "$SHELL_CONFIG" fi log_info "✓ rbenv installed manually" fi fi # Reload shell config log_step "Reloading shell configuration..." if [ -n "$ZSH_VERSION" ]; then source ~/.zshrc 2>/dev/null || true else source ~/.bash_profile 2>/dev/null || true fi # Ensure rbenv is in PATH export PATH="$HOME/.rbenv/bin:$PATH" eval "$(rbenv init - zsh)" 2>/dev/null || eval "$(rbenv init - bash)" 2>/dev/null || true # Check current Ruby version log_step "Checking current Ruby version..." CURRENT_RUBY=$(ruby -v 2>/dev/null | cut -d' ' -f2 | cut -d. -f1,2) || CURRENT_RUBY="unknown" if [ "$CURRENT_RUBY" != "unknown" ]; then RUBY_MAJOR=$(echo "$CURRENT_RUBY" | cut -d. -f1) RUBY_MINOR=$(echo "$CURRENT_RUBY" | cut -d. -f2) if [ "$RUBY_MAJOR" -ge 3 ] && [ "$RUBY_MINOR" -ge 1 ]; then log_info "✓ Ruby version $CURRENT_RUBY is already >= 3.1.0" log_info "You can proceed with CocoaPods installation" exit 0 else log_warn "Current Ruby version: $CURRENT_RUBY (needs 3.1.0+)" fi fi # Check if rbenv has a suitable Ruby version already installed log_step "Checking installed Ruby versions..." if rbenv versions | grep -qE "3\.(1|2|3|4)\."; then INSTALLED_RUBY=$(rbenv versions | grep -E "3\.(1|2|3|4)\." | tail -1 | sed 's/^[[:space:]]*//' | cut -d' ' -f1) log_info "Found installed Ruby version: $INSTALLED_RUBY" # Set as global if not already set CURRENT_GLOBAL=$(rbenv global) if [ "$CURRENT_GLOBAL" != "$INSTALLED_RUBY" ]; then log_info "Setting $INSTALLED_RUBY as default..." rbenv global "$INSTALLED_RUBY" rbenv rehash fi # Verify it works export PATH="$HOME/.rbenv/bin:$PATH" eval "$(rbenv init - zsh)" 2>/dev/null || eval "$(rbenv init - bash)" 2>/dev/null || true if ruby -rpsych -e "true" 2>/dev/null; then VERIFIED_RUBY=$(ruby -v) log_info "✓ Ruby $VERIFIED_RUBY is working correctly" log_info "" log_info "Ruby setup complete!" log_info "" log_info "Next steps:" log_info " 1. Reload your shell: source ~/.zshrc" log_info " 2. Verify Ruby: ruby -v" log_info " 3. Install CocoaPods: gem install cocoapods" exit 0 else log_warn "Installed Ruby $INSTALLED_RUBY found but psych extension not working" log_warn "May need to reinstall Ruby or install libyaml dependencies" fi fi # Check for libyaml dependency (required for psych extension) log_step "Checking for libyaml dependency..." LIBYAML_FOUND=false if command -v brew &> /dev/null; then if brew list libyaml &> /dev/null; then LIBYAML_FOUND=true log_info "✓ libyaml found via Homebrew" else log_warn "libyaml not installed. Installing via Homebrew..." if brew install libyaml; then LIBYAML_FOUND=true log_info "✓ libyaml installed successfully" else log_error "Failed to install libyaml via Homebrew" fi fi else # Check if libyaml headers exist in system locations if find /usr/local /opt /Library -name "yaml.h" 2>/dev/null | grep -q yaml.h; then LIBYAML_FOUND=true log_info "✓ libyaml headers found in system" else log_warn "libyaml not found. Ruby installation may fail." log_warn "Install libyaml via Homebrew: brew install libyaml" log_warn "Or install via MacPorts: sudo port install libyaml" fi fi # List available Ruby versions log_step "Fetching available Ruby versions..." rbenv install --list | grep -E "^[[:space:]]*3\.[1-9]" | tail -5 || log_warn "Could not fetch Ruby versions list" # Install Ruby 3.1.0 (preferred for compatibility) log_step "Installing Ruby 3.1.0..." if rbenv install 3.1.0; then log_info "✓ Ruby 3.1.0 installed successfully" # Set as global default log_step "Setting Ruby 3.1.0 as default..." rbenv global 3.1.0 # Verify installation export PATH="$HOME/.rbenv/bin:$PATH" eval "$(rbenv init - zsh)" 2>/dev/null || eval "$(rbenv init - bash)" 2>/dev/null || true NEW_RUBY=$(ruby -v) log_info "✓ Current Ruby version: $NEW_RUBY" # Verify psych extension works if ruby -rpsych -e "true" 2>/dev/null; then log_info "✓ psych extension verified" else log_warn "psych extension may not be working correctly" log_warn "This may affect CocoaPods installation" fi # Rehash to make Ruby available rbenv rehash log_info "" log_info "Ruby setup complete!" log_info "" log_info "Next steps:" log_info " 1. Reload your shell: source ~/.zshrc" log_info " 2. Verify Ruby: ruby -v" log_info " 3. Install CocoaPods: gem install cocoapods" else log_error "Failed to install Ruby 3.1.0" if [ "$LIBYAML_FOUND" = false ]; then log_error "" log_error "Installation failed. This is likely due to missing libyaml dependency." log_error "" log_error "To fix:" if command -v brew &> /dev/null; then log_error " brew install libyaml" else log_error " Install Homebrew: /bin/bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"" log_error " Then: brew install libyaml" fi log_error "" log_error "After installing libyaml, run this script again." else log_error "Installation failed. Please check your internet connection and try again." fi exit 1 fi