diff --git a/install.sh b/install.sh index ce432945c..c65e0e316 100755 --- a/install.sh +++ b/install.sh @@ -1,4 +1,5 @@ #!/bin/bash +# @version 0.8.1 # Repository information used for downloading files and images from GitHub REPO_OWNER="lanedirt" @@ -22,7 +23,6 @@ REQUIRED_DIRS=( RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' -BLUE='\033[0;34m' MAGENTA='\033[0;35m' CYAN='\033[0;36m' NC='\033[0m' @@ -891,6 +891,9 @@ handle_update() { printf "${YELLOW}+++ Checking for AliasVault updates +++${NC}\n" printf "\n" + # First check for install.sh updates + check_install_script_update || true + # Check current version if ! grep -q "^ALIASVAULT_VERSION=" "$ENV_FILE"; then printf "${YELLOW}> No version information found. Running first-time update check...${NC}\n" @@ -934,6 +937,116 @@ handle_update() { printf "${GREEN}> Update completed successfully!${NC}\n" } +# Function to extract version +extract_version() { + local file="$1" + local version=$(head -n 2 "$file" | grep '@version' | cut -d' ' -f3) + echo "$version" +} + +# Function to compare semantic versions +compare_versions() { + local version1="$1" + local version2="$2" + + # Split versions into arrays + IFS='.' read -ra v1_parts <<< "$version1" + IFS='.' read -ra v2_parts <<< "$version2" + + # Compare each part numerically + for i in {0..2}; do + # Default to 0 if part doesn't exist + local v1_part=${v1_parts[$i]:-0} + local v2_part=${v2_parts[$i]:-0} + + # Compare numerically + if [ "$v1_part" -gt "$v2_part" ]; then + echo "1" # version1 is greater + return + elif [ "$v1_part" -lt "$v2_part" ]; then + echo "-1" # version1 is lesser + return + fi + done + + echo "0" # versions are equal +} + +# Function to check if install.sh needs updating +check_install_script_update() { + printf "${CYAN}> Checking for install script updates...${NC}\n" + + # Download latest install.sh to temporary file + if ! curl -sSf "${GITHUB_RAW_URL}/install.sh" -o "install.sh.tmp"; then + printf "${RED}> Failed to check for install script updates. Continuing with current version.${NC}\n" + rm -f install.sh.tmp + return 1 + fi + + # Get versions + local current_version=$(extract_version "install.sh") + local new_version=$(extract_version "install.sh.tmp") + + # Check if versions could be extracted + if [ -z "$current_version" ] || [ -z "$new_version" ]; then + printf "${YELLOW}> Could not determine script versions. Falling back to file comparison...${NC}\n" + # Fall back to file comparison + if ! cmp -s "install.sh" "install.sh.tmp"; then + printf "${YELLOW}> Changes detected in install script.${NC}\n" + else + printf "${GREEN}> Install script is up to date.${NC}\n" + rm -f install.sh.tmp + return 0 + fi + else + printf "${CYAN}> Current version: ${current_version}${NC}\n" + printf "${CYAN}> Latest version: ${new_version}${NC}\n" + + # Compare versions using semver comparison + if [ "$current_version" = "$new_version" ]; then + printf "${GREEN}> Install script is up to date.${NC}\n" + rm -f install.sh.tmp + return 0 + else + local compare_result=$(compare_versions "$current_version" "$new_version") + + if [ "$compare_result" -ge "0" ]; then + printf "${GREEN}> Install script is up to date.${NC}\n" + rm -f install.sh.tmp + return 0 + fi + fi + fi + + # If we get here, an update is available + printf "${YELLOW}> A new version of the install script is available.${NC}\n" + printf "Would you like to update the install script before proceeding? [Y/n]: " + read -r reply + + if [[ ! $reply =~ ^[Nn]$ ]]; then + # Create backup of current script + cp "install.sh" "install.sh.backup" + + if mv "install.sh.tmp" "install.sh"; then + chmod +x "install.sh" + printf "${GREEN}> Install script updated successfully.${NC}\n" + printf "${GREEN}> Backup of previous version saved as install.sh.backup${NC}\n" + printf "${YELLOW}> Please run the update command again to continue with the update process.${NC}\n" + exit 0 + else + printf "${RED}> Failed to update install script. Continuing with current version.${NC}\n" + # Restore from backup if update failed + mv "install.sh.backup" "install.sh" + rm -f install.sh.tmp + return 1 + fi + else + printf "${YELLOW}> Continuing with current install script version.${NC}\n" + rm -f install.sh.tmp + return 0 + fi +} + # Function to perform the actual installation with specific version handle_install_version() { local target_version="$1"