#!/bin/bash # Herolib Rust Installation Script # This script installs the herolib_rust repository and its dependencies # Can be run locally or curled from remote 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 # Configuration REPO_URL="https://git.ourworld.tf/herocode/herolib_rust" REPO_NAME="herolib_rust" MIN_RUST_VERSION="1.70.0" # Set CODEROOT (default to ~/code unless already set) if [ -z "$CODEROOT" ]; then CODEROOT="$HOME/code" fi TARGET_DIR="$CODEROOT/git.ourworld.tf/herocode/$REPO_NAME" echo -e "${BLUE}===============================================${NC}" echo -e "${BLUE} Herolib Rust Installation Script${NC}" echo -e "${BLUE}===============================================${NC}" echo "" echo -e "${BLUE}Repository:${NC} $REPO_URL" echo -e "${BLUE}Target Directory:${NC} $TARGET_DIR" echo -e "${BLUE}CODEROOT:${NC} $CODEROOT" echo "" # Function to check if command exists command_exists() { command -v "$1" >/dev/null 2>&1 } # Function to compare version numbers version_ge() { printf '%s\n%s\n' "$2" "$1" | sort -V -C } # Function to get Rust version get_rust_version() { if command_exists rustc; then rustc --version | cut -d' ' -f2 else echo "0.0.0" fi } # Function to install Rust install_rust() { echo -e "${YELLOW}๐Ÿ“ฆ Installing Rust...${NC}" if command_exists curl; then curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y elif command_exists wget; then wget -qO- https://sh.rustup.rs | sh -s -- -y else echo -e "${RED}โŒ Error: Neither curl nor wget is available. Please install one of them first.${NC}" exit 1 fi # Source the cargo environment source "$HOME/.cargo/env" echo -e "${GREEN}โœ… Rust installed successfully${NC}" } # Function to update Rust update_rust() { echo -e "${YELLOW}๐Ÿ“ฆ Updating Rust...${NC}" rustup update echo -e "${GREEN}โœ… Rust updated successfully${NC}" } # Check system requirements echo -e "${YELLOW}๐Ÿ” Checking system requirements...${NC}" # Check for git if ! command_exists git; then echo -e "${RED}โŒ Error: git is required but not installed${NC}" echo "Please install git first:" echo " macOS: brew install git" echo " Ubuntu/Debian: sudo apt-get install git" echo " CentOS/RHEL: sudo yum install git" exit 1 fi echo -e "${GREEN}โœ… git found${NC}" # Check for curl or wget if ! command_exists curl && ! command_exists wget; then echo -e "${RED}โŒ Error: Either curl or wget is required${NC}" echo "Please install one of them first:" echo " macOS: curl is usually pre-installed" echo " Ubuntu/Debian: sudo apt-get install curl" echo " CentOS/RHEL: sudo yum install curl" exit 1 fi if command_exists curl; then echo -e "${GREEN}โœ… curl found${NC}" else echo -e "${GREEN}โœ… wget found${NC}" fi # Check Rust installation current_rust_version=$(get_rust_version) if [ "$current_rust_version" = "0.0.0" ]; then echo -e "${YELLOW}โš ๏ธ Rust not found${NC}" install_rust elif ! version_ge "$current_rust_version" "$MIN_RUST_VERSION"; then echo -e "${YELLOW}โš ๏ธ Rust version $current_rust_version is below minimum required $MIN_RUST_VERSION${NC}" update_rust else echo -e "${GREEN}โœ… Rust $current_rust_version found (>= $MIN_RUST_VERSION required)${NC}" fi # Check cargo if ! command_exists cargo; then echo -e "${RED}โŒ Error: cargo not found after Rust installation${NC}" exit 1 fi echo -e "${GREEN}โœ… cargo found${NC}" echo "" # Clone or update repository hero git clone $REPO_URL REPO_PATH=$(hero git path $REPO_URL) cd "$REPO_PATH" # Install dependencies and build echo -e "${YELLOW}๐Ÿ”ง Installing dependencies and building...${NC}" # Check if we can build the workspace echo -e "${BLUE} ๐Ÿ“‹ Checking workspace...${NC}" if ! cargo check --workspace; then echo -e "${RED}โŒ Error: Workspace check failed${NC}" exit 1 fi echo -e "${GREEN}โœ… Workspace check passed${NC}" # Build the workspace echo -e "${BLUE} ๐Ÿ”จ Building workspace...${NC}" if ! cargo build --workspace; then echo -e "${RED}โŒ Error: Build failed${NC}" exit 1 fi echo -e "${GREEN}โœ… Workspace built successfully${NC}" # Build herodo binary echo -e "${BLUE} ๐Ÿ”จ Building herodo binary...${NC}" if [ -d "herodo" ]; then cd herodo if cargo build --release; then echo -e "${GREEN}โœ… herodo binary built successfully${NC}" # Install herodo binary if [ "$EUID" -eq 0 ]; then # Running as root, install to /usr/local/bin INSTALL_DIR="/usr/local/bin" else # Running as user, install to ~/hero/bin INSTALL_DIR="$HOME/hero/bin" mkdir -p "$INSTALL_DIR" fi cp ../target/release/herodo "$INSTALL_DIR/" chmod +x "$INSTALL_DIR/herodo" echo -e "${GREEN}โœ… herodo installed to $INSTALL_DIR${NC}" # Add to PATH if not already there if [[ ":$PATH:" != *":$INSTALL_DIR:"* ]]; then echo -e "${YELLOW}๐Ÿ“ Adding $INSTALL_DIR to PATH${NC}" echo "export PATH=\"$INSTALL_DIR:\$PATH\"" >> "$HOME/.bashrc" echo "export PATH=\"$INSTALL_DIR:\$PATH\"" >> "$HOME/.zshrc" 2>/dev/null || true echo -e "${BLUE} Note: Restart your shell or run 'source ~/.bashrc' to use herodo${NC}" fi else echo -e "${YELLOW}โš ๏ธ herodo build failed, but continuing...${NC}" fi cd .. else echo -e "${YELLOW}โš ๏ธ herodo directory not found, skipping binary build${NC}" fi # Run tests to verify installation echo -e "${YELLOW}๐Ÿงช Running tests to verify installation...${NC}" if cargo test --workspace --lib; then echo -e "${GREEN}โœ… All tests passed${NC}" else echo -e "${YELLOW}โš ๏ธ Some tests failed, but installation completed${NC}" fi echo "" echo -e "${GREEN}===============================================${NC}" echo -e "${GREEN} Installation Complete!${NC}" echo -e "${GREEN}===============================================${NC}" echo "" echo -e "${GREEN}๐ŸŽ‰ Herolib Rust has been successfully installed!${NC}" echo "" echo -e "${BLUE}Installation Details:${NC}" echo -e " Repository: $TARGET_DIR" echo -e " CODEROOT: $CODEROOT" echo -e " Rust Version: $(rustc --version | cut -d' ' -f2)" echo -e " Cargo Version: $(cargo --version | cut -d' ' -f2)" echo "" echo -e "${BLUE}Available Scripts:${NC}" echo -e " Build herodo: $TARGET_DIR/build_herodo.sh" echo -e " Run Rhai tests: $TARGET_DIR/run_rhai_tests.sh" echo -e " Publish crates: $TARGET_DIR/scripts/publish-all.sh" echo "" echo -e "${BLUE}Getting Started:${NC}" echo -e " cd $TARGET_DIR" echo -e " ./build_herodo.sh" echo -e " ./run_rhai_tests.sh" echo "" echo -e "${BLUE}Documentation:${NC}" echo -e " README: $TARGET_DIR/README.md" echo -e " Examples: $TARGET_DIR/examples/" echo "" # Set environment variable for future use echo "export HEROLIB_RUST_PATH=\"$TARGET_DIR\"" >> "$HOME/.bashrc" echo "export HEROLIB_RUST_PATH=\"$TARGET_DIR\"" >> "$HOME/.zshrc" 2>/dev/null || true echo -e "${GREEN}Happy coding! ๐Ÿš€${NC}" echo ""