From a6d0bcfb5f65a4c2ccd6b01cab131c43f752ae5a Mon Sep 17 00:00:00 2001 From: v4n <105587619+v4n00@users.noreply.github.com> Date: Thu, 16 Jan 2025 13:49:16 +0200 Subject: [PATCH] feat: installer treat breaking changes --- README.md | 2 +- h2mm | 7 +++-- install.sh | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a579672..2bd3204 100644 --- a/README.md +++ b/README.md @@ -130,6 +130,6 @@ Feel free to contribute to this project by creating a pull request or opening an - [ ] Easier way to change mod presets - [ ] Find a way to make use of `manifest.json` and simplify installing variants - [x] [DEV] Change to `.tar.gz` for exporting and importing -- [ ] [DEV] Provide fixes for breaking updates +- [x] [DEV] Provide fixes for breaking updates - [ ] [DEV] Optimize code - throw errors in 1 line - [ ] [DEV] Rewrite some code to be more readable diff --git a/h2mm b/h2mm index 6e0ffee..c0e42d7 100755 --- a/h2mm +++ b/h2mm @@ -1,6 +1,6 @@ #!/bin/bash -VERSION="0.1.6" +VERSION="0.2.0" # --- Globals --- @@ -14,7 +14,7 @@ MODS_DIR="" DB_FILE="" LAST_CHECKED_UPDATE_FILE="${HOME}/.config/h2mm/last_update" -VERSION_URL="https://raw.githubusercontent.com/v4n00/h2mm-cli/refs/heads/dev/version" +VERSION_URL="https://raw.githubusercontent.com/v4n00/h2mm-cli/refs/heads/master/version" REPO_URL="https://github.com/v4n00/h2mm-cli" # --- Utility Functions --- @@ -685,6 +685,9 @@ function main() { reset|r) mod_reset "$@" ;; + version|v|-v|--version) + echo "${VERSION}" + ;; help|--help|-h|h) display_help ;; diff --git a/install.sh b/install.sh index b82f531..f098826 100755 --- a/install.sh +++ b/install.sh @@ -2,6 +2,8 @@ set -e RED='\033[0;31m' +GREEN='\033[0;32m' +ORANGE='\033[0;33m' NC='\033[0m' DESTINATION_PATH="/usr/local/bin" @@ -12,13 +14,87 @@ if [ "$(id -u)" -eq 0 ]; then exit 1 fi +# --- Main --- + +# Warning + echo -e "!!! ${RED}WARNING${NC} !!!" echo -e "This script will install Helldivers 2 Mod Manager CLI for Linux to $DESTINATION_PATH/$SCRIPT_NAME." echo -e "Running this script will require sudo permissions. ${RED}DO NOT TRUST${NC} random scripts from the internet." echo -e "If you want to review the script before running it, check out the mod repository for yourself:" echo -e "https://github.com/v4n00/h2mm-cli" +echo -e "!!! ${RED}WARNING${NC} !!!" echo +# Check if update + +# Breaking changes hash table + +breaking_changes_patches=( + ["2"]='sed -i "s/^\([0-9]\+\),/\1,ENABLED,/" "$1/mods.csv"' +) + +# Script + +if [[ -x "$(command -v $SCRIPT_NAME)" ]]; then + installed_version=$($SCRIPT_NAME --version) + # version 1 show the help message, if the first character is not a 0, store installed version as 0.1.6 + [[ ${installed_version:0:1} != "0" ]] && { installed_version="0.1.6"; } + + latest_version=$(curl -sS https://raw.githubusercontent.com/v4n00/h2mm-cli/refs/heads/master/version) + if [[ "$latest_version" == "$installed_version" ]]; then + echo -e "You are reinstalling version $installed_version." + else + echo -e "You are upgrading from ${ORANGE}$installed_version${NC} -> ${GREEN}$latest_version${NC}." + fi + + # split version numbers + installed_major="" + latest_major="" + IFS='.' read -r _1 installed_major _2 <<< "$installed_version" + IFS='.' read -r _1 latest_major _2 <<< "$latest_version" + + if [[ $latest_major -gt $installed_major ]]; then + echo -e "${ORANGE}Warning:${NC} Major version upgrade detected." + echo "The script will proceed to upgrade ${SCRIPT_NAME} to avoid breaking changes." + + # find hd2 path + search_dir="${HOME}" + target_dir="Steam/steamapps/common/Helldivers\ 2/data" + echo "Searching for the Helldivers 2 data directory..." >&2 + game_dir=$(find "$search_dir" -type d -path "*/$target_dir" 2>/dev/null | head -n 1) + if [[ -z "$game_dir" ]]; then + echo "Could not find the Helldivers 2 data directory automatically." >&2 + read -p "Please enter the path to the Helldivers 2 data directory: " game_dir + game_dir=$(eval echo "$game_dir") + + if [[ ! -d "$game_dir" ]]; then + echo -e "${RED}Error${NC}: Provided path is not a valid directory." >&2 + exit 1 + fi + fi + + [[ ! -f "$game_dir/mods.csv" ]] && { echo -e "${RED}Error:${NC} mods.csv not found in $game_dir."; exit 1; } + + # iterate from installed major number to latest major number + for ((i = installed_major + 1; i <= latest_major; i++)); do + echo -e "${RED}[ ]${NC} Applying breaking changes patch for version $i." + + [[ -n "${breaking_changes_patches[$i]}" ]] && eval $(echo "${breaking_changes_patches[$i]}" | sed "s:\$1:$game_dir:") + if [[ $? -ne 0 ]]; then + echo -ne "${RED}Error:${NC} Failed to apply breaking changes patch for version $i. Do you want to continue? (Y/n): " + read -r response + + [[ "$response" != "y" && "$response" != "Y" && -n "$response" ]] && { echo "Exiting. Uninstall the script first the retry the install script."; exit 1; } + else + echo -e "${GREEN}[X]${NC} Breaking changes patch for version $i applied successfully." + fi + done + fi +fi + +# Install + read -p "Install the script to $DESTINATION_PATH or specify another path (must be included in \$PATH)? (Y/path): " response if [[ "$response" != "y" && "$response" != "Y" && -n "$response" ]]; then