From 7d4775e2b33809d79d98def6feab7dfd5c13f3da Mon Sep 17 00:00:00 2001 From: Ade Thompson Date: Sat, 9 Aug 2025 08:45:37 +0100 Subject: [PATCH] Ameneded --- fish_installer.sh | 233 ++++++++++++++++++++++------------------------ 1 file changed, 110 insertions(+), 123 deletions(-) diff --git a/fish_installer.sh b/fish_installer.sh index 098d905..ed24765 100644 --- a/fish_installer.sh +++ b/fish_installer.sh @@ -1,158 +1,145 @@ #!/bin/bash +set -euo pipefail -set -e +# -- utils --------------------------------------------------------- +prompt_yn() { + # usage: prompt_yn "Question (y/N): " N + local prompt="${1:-Proceed (y/N): }" + local default="${2:-N}" + local ans="" + if [ -t 0 ] && [ -t 1 ]; then + # interactive: read from the TTY (not stdin) + read -r -p "$prompt" ans /dev/null; then - echo "🍺 Homebrew not found. Install it now? (y/N): " - read -r confirm - if [[ "$confirm" =~ ^[Yy]$ ]]; then - /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile - eval "$(/opt/homebrew/bin/brew shellenv)" - else - echo "❌ Homebrew is required to install Fish on macOS. Exiting." - exit 1 - fi - fi - PKG_MGR="brew" - elif command -v apt &>/dev/null; then - OS="debian" - PKG_MGR="apt" - elif command -v dnf &>/dev/null; then - OS="rhel" - PKG_MGR="dnf" - elif command -v yum &>/dev/null; then - OS="rhel" - PKG_MGR="yum" - elif command -v pacman &>/dev/null; then - OS="arch" - PKG_MGR="pacman" - else - echo "❌ Unsupported platform." - exit 1 + if [[ "$OSTYPE" == "darwin"* ]]; then + OS="macos"; PKG_MGR="brew" + if ! command -v brew &>/dev/null; then + if prompt_yn "Homebrew not found. Install it now? (y/N): " N; then + /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile + eval "$(/opt/homebrew/bin/brew shellenv)" + else + echo "Homebrew is required to install Fish on macOS. Exiting."; exit 1 + fi fi + elif command -v apt &>/dev/null; then + OS="debian"; PKG_MGR="apt" + elif command -v dnf &>/dev/null; then + OS="rhel"; PKG_MGR="dnf" + elif command -v yum &>/dev/null; then + OS="rhel"; PKG_MGR="yum" + elif command -v pacman &>/dev/null; then + OS="arch"; PKG_MGR="pacman" + else + echo "Unsupported platform."; exit 1 + fi } -# 🔐 Install gpg if not present (Debian only) +# -- debian repo/key ----------------------------------------------- install_gpg_if_needed() { - if [[ "$OS" == "debian" ]] && ! command -v gpg &>/dev/null; then - echo "🔑 gpg not found. Installing..." - sudo apt update && sudo apt install -y gnupg - fi + if [[ "${OS}" == "debian" ]] && ! command -v gpg &>/dev/null; then + sudo apt update && sudo apt install -y gnupg + fi } -# 📦 Add Fish shell repo for Debian/Ubuntu add_fish_repo_debian() { - echo "Adding Fish shell repo for Debian/Ubuntu..." - echo 'deb http://download.opensuse.org/repositories/shells:/fish:/release:/4/Debian_12/ /' | \ - sudo tee /etc/apt/sources.list.d/fish.list - curl -fsSL https://download.opensuse.org/repositories/shells:fish:release:4/Debian_12/Release.key | \ - gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/fish.gpg > /dev/null - sudo apt update + echo 'deb http://download.opensuse.org/repositories/shells:/fish:/release:/4/Debian_12/ /' \ + | sudo tee /etc/apt/sources.list.d/fish.list >/dev/null + curl -fsSL https://download.opensuse.org/repositories/shells:fish:release:4/Debian_12/Release.key \ + | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/fish.gpg >/dev/null + sudo apt update } -# 🐟 Install Fish shell +# -- install/update fish ------------------------------------------- install_fish() { - echo "🐟 Installing Fish shell for $OS..." - case "$OS" in - debian) - add_fish_repo_debian - sudo apt install -y fish - ;; - rhel) - sudo $PKG_MGR install -y fish - ;; - arch) - sudo pacman -Sy --noconfirm fish - ;; - macos) - brew install fish - ;; - esac + case "$OS" in + debian) add_fish_repo_debian; sudo apt install -y fish ;; + rhel) sudo "$PKG_MGR" install -y fish ;; + arch) sudo pacman -Sy --noconfirm fish ;; + macos) brew install fish ;; + esac } -# ♻️ Update Fish shell if needed update_fish() { - echo "🔄 Checking for updates to Fish shell..." - case "$PKG_MGR" in - apt) - sudo apt update - if apt list --upgradable 2>/dev/null | grep -q "^fish/"; then - read -rp "An update is available. Update Fish? (y/N): " confirm - [[ "$confirm" =~ ^[Yy]$ ]] && sudo apt install -y fish - else - echo "Fish is already up to date." - fi - ;; - dnf|yum) - sudo $PKG_MGR check-update || true - if $PKG_MGR list updates | grep -q "^fish"; then - read -rp "An update is available. Update Fish? (y/N): " confirm - [[ "$confirm" =~ ^[Yy]$ ]] && sudo $PKG_MGR update -y fish - else - echo "Fish is already up to date." - fi - ;; - pacman) - sudo pacman -Sy --noconfirm - if pacman -Qu | grep -q "^fish"; then - read -rp "An update is available. Update Fish? (y/N): " confirm - [[ "$confirm" =~ ^[Yy]$ ]] && sudo pacman -S --noconfirm fish - else - echo "Fish is already up to date." - fi - ;; - brew) - brew update - if brew outdated | grep -q "^fish"; then - read -rp "An update is available. Update Fish? (y/N): " confirm - [[ "$confirm" =~ ^[Yy]$ ]] && brew upgrade fish - else - echo "Fish is already up to date." - fi - ;; - esac + case "$PKG_MGR" in + apt) + sudo apt update + if apt list --upgradable 2>/dev/null | grep -q "^fish/"; then + if prompt_yn "Fish update available. Update now? (y/N): " N; then + sudo apt install -y fish + fi + fi + ;; + dnf|yum) + sudo "$PKG_MGR" check-update || true + if "$PKG_MGR" list updates | grep -q "^fish"; then + if prompt_yn "Fish update available. Update now? (y/N): " N; then + sudo "$PKG_MGR" update -y fish + fi + fi + ;; + pacman) + sudo pacman -Sy --noconfirm + if pacman -Qu | grep -q "^fish"; then + if prompt_yn "Fish update available. Update now? (y/N): " N; then + sudo pacman -S --noconfirm fish + fi + fi + ;; + brew) + brew update + if brew outdated | grep -q "^fish"; then + if prompt_yn "Fish update available. Update now? (y/N): " N; then + brew upgrade fish + fi + fi + ;; + esac } -# 🎣 Install Fisher plugin manager (stdin isolated) +# -- fisher & plugins ---------------------------------------------- install_fisher() { - echo "Installing Fisher plugin manager..." - curl -fsSL https://git.mycod.in/apt/fish_install/raw/branch/main/install_fisher.fish -o /tmp/install_fisher.fish - chmod +x /tmp/install_fisher.fish - fish /tmp/install_fisher.fish /dev/null 2>&1 } -# 🏁 Main script +# -- main ----------------------------------------------------------- detect_platform install_gpg_if_needed if command -v fish &>/dev/null; then - echo "Fish shell is already installed." - update_fish + echo "Fish shell is already installed." + update_fish else - install_fish + install_fish fi -# Ask if user wants to install Fisher and plugins -read -rp "Do you want to install Fisher plugin manager and some plugins? (y/N): " install_plugins -if [[ "$install_plugins" =~ ^[Yy]$ ]]; then - install_fisher - install_fish_plugins - echo "Fisher and plugins installed!" +if prompt_yn "Install Fisher plugin manager and recommended plugins? (y/N): " N; then + install_fisher + install_fish_plugins + echo "Fisher and plugins installed!" else - echo "Skipping plugin installation." + echo "Skipping plugin installation." fi -echo "✅ Fish shell setup complete on $OS!" \ No newline at end of file +echo "✅ Fish shell setup complete on ${OS}!" \ No newline at end of file