diff --git a/Makefile b/Makefile index 0d552d4..23dcbf3 100644 --- a/Makefile +++ b/Makefile @@ -1,18 +1,23 @@ # Makefile for Dotfiles # Tells Make that these targets are not actual files -.PHONY: all setup stow clean update docker-test +.PHONY: all setup stow clean update docker-test test-ubuntu test-arch storagebox # Default target (runs when you just type 'make') all: stow # Full Setup setup: - bash setup.sh + bash ./scripts/setup.sh + bash ./scripts/node.sh + bash ./scripts/go.sh + bash ./scripts/rust.sh + bash ./scripts/python.sh + @echo "Full setup completed." # Just stow the dotfiles stow: - stow . --target=$$HOME --ignore="setup.sh" --ignore=".git" --ignore=".gitignore" --ignore="README.md" --ignore=".zsh_secrets" --ignore=".zsh_secrets.example" --ignore="LICENSE" --ignore="Makefile" --ignore="provision.sh" --ignore="storagebox.sh" + stow . --target=$$HOME --ignore=".git" --ignore=".gitignore" --ignore="README.md" --ignore=".zsh_secrets" --ignore=".zsh_secrets.example" --ignore="LICENSE" --ignore="Makefile" @echo "Dotfiles linked." # Clean old files and links @@ -25,9 +30,22 @@ update: git pull origin main make setup +# Language Setups +node: + bash ./scripts/node.sh + +go: + bash ./scripts/go.sh + +rust: + bash ./scripts/rust.sh + +python: + bash ./scripts/python.sh + # Setup StorageBox storagebox: - bash storagebox.sh + bash ./scripts/storagebox.sh # Docker Tests test-ubuntu: diff --git a/bin/eza b/bin/eza new file mode 100644 index 0000000..84a5edf Binary files /dev/null and b/bin/eza differ diff --git a/scripts/go.sh b/scripts/go.sh new file mode 100644 index 0000000..4d56a79 --- /dev/null +++ b/scripts/go.sh @@ -0,0 +1,46 @@ +#!/bin/bash +set -e +BLUE='\033[1;34m' +YELLOW='\033[1;33m' +GREEN='\033[1;32m' +RED='\033[1;31m' +NC='\033[0m' + +echo -e "${BLUE} LOG:${YELLOW} Setting up Go (GVM)...${NC}" + +# 1. Install GVM dependencies +unalias cd 2>/dev/null || true + +# 2. Install GVM if missing +if [ ! -d "$HOME/.gvm" ]; then + bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer) +fi + +# 3. Load GVM +[[ -s "$HOME/.gvm/scripts/gvm" ]] && source "$HOME/.gvm/scripts/gvm" + +# 4. Install Go +# Use a known stable version that exists. 1.24.11 is speculative. 1.24.0 is real. +TARGET_GO="go1.24.0" + +if command -v gvm &> /dev/null; then + if [[ $(gvm list) != *"$TARGET_GO"* ]]; then + echo -e "${BLUE} LOG:${YELLOW} Installing $TARGET_GO...${NC}" + + # Try Binary install first (Fastest/Safest) + gvm install "$TARGET_GO" -B || { + echo -e "${RED} LOG: Binary failed. Bootstrapping via go1.22.9...${NC}" + gvm install go1.22.9 -B + gvm use go1.22.9 + gvm install "$TARGET_GO" + } + + gvm use "$TARGET_GO" --default + echo -e "${GREEN} LOG: Go setup complete.$(go version)${NC}" + else + echo -e "${GREEN} LOG: $TARGET_GO already installed.${NC}" + fi +else + echo -e "${RED} ERROR: GVM failed to load.${NC}" + exit 1 +fi \ No newline at end of file diff --git a/scripts/node.sh b/scripts/node.sh new file mode 100644 index 0000000..2f44962 --- /dev/null +++ b/scripts/node.sh @@ -0,0 +1,33 @@ +#!/bin/bash +set -e # Exit on error +BLUE='\033[1;34m' +YELLOW='\033[1;33m' +GREEN='\033[1;32m' +NC='\033[0m' + +echo -e "${BLUE} LOG:${YELLOW} Setting up Node.js (NVM)...${NC}" + +export NVM_DIR="$HOME/.nvm" + +# 1. Install NVM +if [ ! -d "$NVM_DIR" ]; then + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash +fi + +# 2. Load NVM +[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" + +# 3. Install Node +if command -v nvm &> /dev/null; then + echo -e "${BLUE} LOG:${YELLOW} Installing LTS...${NC}" + nvm install --lts + nvm use --lts + + echo -e "${BLUE} LOG:${YELLOW} Installing Global Tools...${NC}" + # set +e is safer for npm global installs which can be noisy + set +e + npm install -g pnpm yarn + set -e + + echo -e "${GREEN} LOG: Node setup complete.$(node -v)${NC}" +fi \ No newline at end of file diff --git a/provision.sh b/scripts/provision.sh similarity index 76% rename from provision.sh rename to scripts/provision.sh index b48b988..83df489 100755 --- a/provision.sh +++ b/scripts/provision.sh @@ -7,6 +7,10 @@ YELLOW='\033[1;33m' RED='\033[1;31m' NC='\033[0m' +DEFAULT_USER="mangopig" +DEFAULT_UID="1000" +DEFAULT_GID="1000" + # Root Check if [ "$EUID" -ne 0 ]; then echo -e "${RED}Please run this script as root.${NC}" @@ -48,18 +52,26 @@ else fi # Interactive Prompts -echo -e "${GREEN}---------------------------------------${NC}" -echo -e "${GREEN} USER PROVISIONING WIZARD ${NC}" -echo -e "${GREEN}---------------------------------------${NC}" +if [ -t 0 ]; then + echo -e "${GREEN}---------------------------------------${NC}" + echo -e "${GREEN} USER PROVISIONING WIZARD ${NC}" + echo -e "${GREEN}---------------------------------------${NC}" -read -p "Enter Username (default: mangopig): " USERNAME -USERNAME=${USERNAME:-mangopig} + read -p "Enter Username (default: $DEFAULT_USER): " INPUT_USER + USERNAME=${INPUT_USER:-$DEFAULT_USER} -read -p "Enter UID (default: 1000): " USER_UID -USER_UID=${USER_UID:-1000} + read -p "Enter UID (default: $DEFAULT_UID): " INPUT_UID + USER_UID=${INPUT_UID:-$DEFAULT_UID} -read -p "Enter GID (default: 1000): " USER_GID -USER_GID=${USER_GID:-1000} + read -p "Enter GID (default: $DEFAULT_GID): " INPUT_GID + USER_GID=${INPUT_GID:-$DEFAULT_GID} +else + echo -e "${YELLOW}LOG: Non-interactive session detected. Using defaults.${NC}" + # Allow Environment Variables to override defaults in Docker/Headless + USERNAME=${USERNAME:-$DEFAULT_USER} + USER_UID=${USER_UID:-$DEFAULT_UID} + USER_GID=${USER_GID:-$DEFAULT_GID} +fi # Group Creation if getent group "$USER_GID" >/dev/null; then diff --git a/scripts/python.sh b/scripts/python.sh new file mode 100644 index 0000000..0158da4 --- /dev/null +++ b/scripts/python.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +set -e + +# Bold Colors +YELLOW='\033[1;33m' +BLUE='\033[1;34m' +RED='\033[1;31m' +GREEN='\033[1;32m' +NC='\033[0m' + +# Python Setup +echo -e "${BLUE} LOG:${YELLOW} Setting up Python environment...${NC}" + +# MiniConda Installation \ No newline at end of file diff --git a/scripts/rust.sh b/scripts/rust.sh new file mode 100644 index 0000000..e6f4a5a --- /dev/null +++ b/scripts/rust.sh @@ -0,0 +1,23 @@ +#!/bin/bash +set -e +BLUE='\033[1;34m' +YELLOW='\033[1;33m' +GREEN='\033[1;32m' +NC='\033[0m' + +echo -e "${BLUE} LOG:${YELLOW} Setting up Rust (Rustup)...${NC}" + +# 1. Install Rustup +if ! command -v rustup &> /dev/null; then + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y +fi + +# 2. Source Environment +[ -f "$HOME/.cargo/env" ] && source "$HOME/.cargo/env" + +# 3. Update to Stable +if command -v cargo &> /dev/null; then + rustup default stable + rustup update + echo -e "${GREEN} LOG: Rust setup complete.$(cargo --version)${NC}" +fi \ No newline at end of file diff --git a/scripts/setup.sh b/scripts/setup.sh new file mode 100755 index 0000000..93089ca --- /dev/null +++ b/scripts/setup.sh @@ -0,0 +1,116 @@ +#!/bin/bash +set -e + +# Colors +BLUE='\033[1;34m' +YELLOW='\033[1;33m' +GREEN='\033[1;32m' +RED='\033[1;31m' +NC='\033[0m' + +echo -e "${BLUE} LOG:${YELLOW} Initializing Base System Layer...${NC}" + +# OS Detection +if [ -f /etc/os-release ]; then + . /etc/os-release + OS=$ID +fi + +# Confirm Architecture +ARCH=$(uname -m) +if [ "$ARCH" != "x86_64" ] && [ "$ARCH" != "aarch64" ]; then + echo -e "${RED} ERROR: Unsupported architecture: $ARCH${NC}" + exit 1 +fi + +# 2. Package Installation (OS Dependencies) +# Note: Removed 'go', 'npm', 'cargo' - these are handled by specific scripts +PACKAGES=( + curl wget git sudo zsh tmux unzip tar gzip + build-essential openssl python bison mercurial + ripgrep fd bat fzf jq btop httpie gnupg zoxide stow + bind nmap socat tcpdump net-tools strace gdb hexyl + rclone + # 'eza' is REMOVED from here for Ubuntu logic below +) + +if [ "$OS" == "arch" ] || [ "$OS" == "manjaro" ]; then + # Arch has eza in the community repo + sudo pacman -Sy --noconfirm --needed "${PACKAGES[@]}" eza base-devel +elif [ "$OS" == "ubuntu" ] || [ "$OS" == "debian" ]; then + sudo DEBIAN_FRONTEND=noninteractive apt-get update + sudo DEBIAN_FRONTEND=noninteractive apt-get install -y "${PACKAGES[@]}" bsdmainutils pkg-config cmake + + # ----------------------------------------------------------------- + # EZA BINARY INSTALL (Ubuntu/Debian) + # ----------------------------------------------------------------- + if ! command -v eza &> /dev/null; then + echo -e "${BLUE} LOG:${YELLOW} Fetching eza binary (skipping compilation)...${NC}" + + # 1. Define Version (Check releases page for latest) + EZA_VER="v0.18.11" + EZA_URL="https://github.com/eza-community/eza/releases/download/${EZA_VER}/eza_x86_64-unknown-linux-gnu.tar.gz" + + # 2. Download and Extract directly to a temp location + wget -qO- "$EZA_URL" | tar xz -C /tmp + + # 3. Move to local bin (No sudo needed if ~/.local/bin is in PATH) + mkdir -p "$HOME/.local/bin" + mv /tmp/eza "$HOME/.local/bin/" + chmod +x "$HOME/.local/bin/eza" + + echo -e "${GREEN} LOG: eza installed to ~/.local/bin${NC}" + fi +fi +# 3. Docker Installation +if command -v docker &> /dev/null; then + echo -e "${GREEN} LOG: Docker is already installed.${NC}" +else + if grep -qEi "(Microsoft|WSL)" /proc/version &> /dev/null; then + echo -e "${RED} LOG: WSL Detected! Skipping Native Docker.${NC}" + echo -e "${RED} >>> Please install Docker Desktop on Windows.${NC}" + else + echo -e "${BLUE} LOG:${YELLOW} Installing Native Docker...${NC}" + if [ "$OS" == "arch" ]; then + sudo pacman -S --noconfirm --needed docker docker-compose + sudo systemctl enable --now docker + elif [ "$OS" == "ubuntu" ]; then + # (Simplified for brevity - standard Docker install logic) + curl -fsSL https://get.docker.com | sh + fi + + # Add user to group + sudo usermod -aG docker $(whoami) + fi +fi + +# 4. Zsh & Configuration +if [ ! -d "$HOME/.oh-my-zsh" ]; then + echo -e "${BLUE} LOG:${YELLOW} Installing Oh My Zsh...${NC}" + sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended +fi + +# Plugins +ZSH_CUSTOM="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}" +mkdir -p "$ZSH_CUSTOM/plugins" +[ ! -d "$ZSH_CUSTOM/plugins/zsh-syntax-highlighting" ] && git clone https://github.com/zsh-users/zsh-syntax-highlighting.git "$ZSH_CUSTOM/plugins/zsh-syntax-highlighting" +[ ! -d "$ZSH_CUSTOM/plugins/zsh-autosuggestions" ] && git clone https://github.com/zsh-users/zsh-autosuggestions "$ZSH_CUSTOM/plugins/zsh-autosuggestions" + +# 5. Git Credentials (WSL Bridge) +if grep -qEi "(Microsoft|WSL)" /proc/version &> /dev/null; then + GCM_WIN="/mnt/c/Program Files/Git/mingw64/bin/git-credential-manager.exe" + [ -f "$GCM_WIN" ] && git config --global credential.helper "! \"$GCM_WIN\"" +else + git config --global credential.helper 'cache --timeout=43200' +fi + +# 6. Cleanup & Secrets +rm -f "$HOME/.zshrc" "$HOME/.zsh_aliases" +touch "$HOME/.zsh_secrets" + +# 7. Set Shell +if [ "$SHELL" != "$(which zsh)" ]; then + sudo chsh -s "$(which zsh)" $(whoami) +fi + +echo -e "${GREEN} LOG: Base System Setup Complete.${NC}" \ No newline at end of file diff --git a/storagebox.sh b/scripts/storagebox.sh similarity index 100% rename from storagebox.sh rename to scripts/storagebox.sh diff --git a/setup.sh b/setup.sh deleted file mode 100755 index e4b1162..0000000 --- a/setup.sh +++ /dev/null @@ -1,268 +0,0 @@ -#!/bin/bash -set -e - -# Variables -ZSH_CUSTOM="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}" -DOTFILES_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -# Bold Colors -YELLOW='\033[1;33m' -BLUE='\033[1;34m' -RED='\033[1;31m' -GREEN='\033[1;32m' -NC='\033[0m' - -# OS Detection -echo -e "${BLUE} LOG:${YELLOW} Checking System...${NC}" - -OS="unknown" -if [ -f /etc/os-release ]; then - . /etc/os-release - OS=$ID -fi - -if [ "$OS" = "unknown" ] || [ -z "$OS" ]; then - echo -e "${RED} ERROR:${NC} Could not detect operating system. /etc/os-release not found or ID not set." - exit 1 -fi -# Package Installation -PACKAGES=( - curl wget git sudo - zsh tmux - unzip tar gzip - build-essential - openssl - python bison mercurial - ripgrep fd bat fzf jq - btop httpie gnupg - zoxide stow - bind nmap socat tcpdump net-tools - strace gdb hexyl - rclone -) - -FINAL_LIST="" - -for pkg in "${PACKAGES[@]}"; do - case "$pkg" in - "build-essential") - [ "$OS" == "arch" ] && pkg="base-devel" - [ "$OS" == "ubuntu" ] && pkg="build-essential" - ;; - "python") - [ "$OS" == "arch" ] && pkg="python" - [ "$OS" == "ubuntu" ] && pkg="python3 python3-pip python3-venv" - ;; - "fd") - [ "$OS" == "arch" ] && pkg="fd" - [ "$OS" == "ubuntu" ] && pkg="fd-find" - ;; - "bat") - [ "$OS" == "arch" ] && pkg="bat" - [ "$OS" == "ubuntu" ] && pkg="bat" - ;; - "openssl") - [ "$OS" == "arch" ] && pkg="openssl" - [ "$OS" == "ubuntu" ] && pkg="libssl-dev" - ;; - "bind") - [ "$OS" == "arch" ] && pkg="bind" - [ "$OS" == "ubuntu" ] && pkg="dnsutils" - ;; - *) - esac - - FINAL_LIST="$FINAL_LIST $pkg" -done - -# Extra packages for specific distros -if [ "$OS" == "arch" ] || [ "$OS" == "manjaro" ]; then - FINAL_LIST="$FINAL_LIST eza" -fi - -if [ "$OS" == "ubuntu" ] || [ "$OS" == "debian" ]; then - FINAL_LIST="$FINAL_LIST ca-certificates bsdmainutils pkg-config cmake" -fi - -echo -e "${BLUE} LOG:${YELLOW} Installing: ${NC}$FINAL_LIST" - -if [ "$OS" == "arch" ] || [ "$OS" == "manjaro" ]; then - sudo pacman -S --noconfirm --needed $FINAL_LIST - -elif [ "$OS" == "ubuntu" ] || [ "$OS" == "debian" ]; then - sudo DEBIAN_FRONTEND=noninteractive apt-get update - sudo DEBIAN_FRONTEND=noninteractive apt-get install -y $FINAL_LIST -fi - -if [ "$OS" == "ubuntu" ] || [ "$OS" == "debian" ]; then - echo -e "${BLUE} LOG:${YELLOW} Fixing Ubuntu binary names...${NC}" - [ -f /usr/bin/fdfind ] && sudo ln -sf /usr/bin/fdfind /usr/local/bin/fd - [ -f /usr/bin/batcat ] && sudo ln -sf /usr/bin/batcat /usr/local/bin/bat -fi - -# Docker Installation -if command -v docker &> /dev/null; then - echo -e "${GREEN} LOG: Docker is already installed. Skipping...${NC}" -else - # Check if we are running in WSL - if grep -qEi "(Microsoft|WSL)" /proc/version &> /dev/null; then - echo -e "${RED} LOG: WSL Detected! Skipping Native Docker installation.${NC}" - echo -e "${RED} >>> ACTION REQUIRED: Please install Docker Desktop for Windows.${NC}" - echo -e "${RED} >>> Ensure 'Use WSL 2 based engine' is enabled in Docker settings.${NC}" - else - echo -e "${BLUE} LOG:${YELLOW} Docker not found. Installing Native Docker Engine...${NC}" - - # ARCH LINUX - if [ "$OS" == "arch" ] || [ "$OS" == "manjaro" ]; then - sudo pacman -S --noconfirm --needed docker docker-compose - sudo systemctl enable --now docker - fi - - # UBUNTU / DEBIAN - if [ "$OS" == "ubuntu" ] || [ "$OS" == "debian" ]; then - echo -e "${BLUE} LOG:${YELLOW} Setting up Official Docker Repository...${NC}" - sudo install -m 0755 -d /etc/apt/keyrings - sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc - sudo chmod a+r /etc/apt/keyrings/docker.asc - - echo \ - "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ - $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \ - sudo tee /etc/apt/sources.list.d/docker.list > /dev/null - - sudo DEBIAN_FRONTEND=noninteractive apt-get update - sudo DEBIAN_FRONTEND=noninteractive apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin - fi - fi -fi - -# Install NVM, GVM, Rustup -echo -e "${BLUE} LOG:${YELLOW} Installing NVM, GVM and Rustup...${NC}" - -# NVM -if [ ! -d "$HOME/.nvm" ]; then - curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash -fi - -# Go and GVM -wget https://go.dev/dl/go1.25.4.linux-amd64.tar.gz -O /tmp/go1.25.4.linux-amd64.tar.gz -sudo rm -rf /usr/local/go -sudo tar -C /usr/local -xzf /tmp/go1.25.4.linux-amd64.tar.gz -rm -f /tmp/go1.25.4.linux-amd64.tar.gz - -if [ ! -d "$HOME/.gvm" ]; then - bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer) -fi - -# Rustup -if ! command -v rustup &> /dev/null; then - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y -fi - -# Install Eza with Cargo -echo -e "${BLUE} LOG:${YELLOW} Installing Eza via Cargo...${NC}" -if ! command -v eza &> /dev/null; then - source "$HOME/.cargo/env" - cargo install eza -fi - -# --------------------------------------------------------------------- -# GIT CREDENTIAL CONFIGURATION -# --------------------------------------------------------------------- -echo -e "${BLUE} LOG:${YELLOW} Configuring Git Credentials...${NC}" - -if grep -qEi "(Microsoft|WSL)" /proc/version &> /dev/null; then - # Linux Server: Cache credentials for 12 hours - if [ -f "$GCM_WIN" ]; then - git config --global credential.helper "! \"$GCM_WIN\"" - fi -else - # Linux Server: Cache credentials for 12 hour - git config --global credential.helper 'cache --timeout=43200' --replace-all -fi - -# Docker Group -echo -e "${BLUE} LOG:${YELLOW} Setting up Docker group...${NC}" -if ! getent group docker > /dev/null 2>&1; then - sudo groupadd docker -fi -sudo usermod -aG docker $(whoami) - -# Zsh and Oh My Zsh Setup -echo -e "${BLUE} LOG:${YELLOW} Setting up Oh My Zsh...${NC}" -if [ ! -d "$HOME/.oh-my-zsh" ]; then - sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended -fi - -echo -e "${BLUE} LOG:${YELLOW} Installing Zsh plugins...${NC}" -if [ ! -d "$ZSH_CUSTOM/plugins/zsh-syntax-highlighting" ]; then - git clone https://github.com/zsh-users/zsh-syntax-highlighting.git "$ZSH_CUSTOM/plugins/zsh-syntax-highlighting" -fi - -if [ ! -d "$ZSH_CUSTOM/plugins/zsh-autosuggestions" ]; then - git clone https://github.com/zsh-users/zsh-autosuggestions "$ZSH_CUSTOM/plugins/zsh-autosuggestions" -fi - -# Making Zsh the default shell -echo -e "${BLUE} LOG:${YELLOW} Setting Zsh as the default shell...${NC}" -if [ "$SHELL" != "$(which zsh)" ]; then - sudo chsh -s "$(which zsh)" $(whoami) -fi - -# File Cleanup -echo -e "${BLUE} LOG:${YELLOW} Cleaning up old configs...${NC}" -rm -f "$HOME/.zshrc" "$HOME/.zsh_aliases" - -# Ensure secrets file exists -echo -e "${BLUE} LOG:${YELLOW} Ensuring secrets file exists...${NC}" -touch "$HOME/.zsh_secrets" - -# Stow Dotfiles -echo -e "${BLUE} LOG:${YELLOW} Stowing dotfiles...${NC}" -cd "$DOTFILES_DIR" -stow . --target="$HOME" --ignore="setup.sh" --ignore=".git" --ignore=".gitignore" --ignore="README.md" --ignore=".zsh_secrets" --ignore=".zsh_secrets.example" --ignore="LICENSE" --ignore="Makefile" --ignore="provision.sh" --ignore="storagebox.sh" - -# Language Setup -echo -e "${BLUE} LOG:${YELLOW} Finalizing Language Setup...${NC}" -set +e - -# 1. Setup Node (NVM) -export NVM_DIR="$HOME/.nvm" -[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" - -if command -v nvm &> /dev/null; then - echo -e "${BLUE} LOG:${YELLOW} Installing Node LTS...${NC}" - nvm install --lts - nvm use --lts - echo -e "${BLUE} LOG:${YELLOW} Installing Global Tools (pnpm, yarn)...${NC}" - npm install -g pnpm yarn || true -fi -# 2. Setup Go (GVM) -unalias cd 2>/dev/null || true - -[[ -s "$HOME/.gvm/scripts/gvm" ]] && source "$HOME/.gvm/scripts/gvm" - -if command -v gvm &> /dev/null; then - echo -e "${BLUE} LOG:${YELLOW} Installing Go 1.24.11...${NC}" - gvm install go1.24.11 -B - gvm use go1.24.11 --default - if [ $? -eq 0 ]; then - echo -e "${BLUE} LOG:${YELLOW} Go version: $(go version)${NC}" - else - echo -e "${RED} ERROR:${NC} GVM failed to install Go 1.24.11" - fi -fi - -# 3. Setup Rust -[ -f "$HOME/.cargo/env" ] && source "$HOME/.cargo/env" - -if command -v rustup &> /dev/null; then - echo -e "${BLUE} LOG:${YELLOW} Updating Rust to stable...${NC}" - rustup default stable - rustup update -fi - -set -e - -# Finish -echo -e "${GREEN} LOG: Setup Complete! Please restart your terminal to apply all changes. ${NC} " \ No newline at end of file