From aebb4a960129f35887a0186c449403b0de3f4d37 Mon Sep 17 00:00:00 2001 From: Ade Thompson Date: Sat, 9 Aug 2025 09:33:42 +0100 Subject: [PATCH] Amended --- fish_installer.sh | 181 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 136 insertions(+), 45 deletions(-) diff --git a/fish_installer.sh b/fish_installer.sh index cf7f7e9..7f067b9 100644 --- a/fish_installer.sh +++ b/fish_installer.sh @@ -1,38 +1,42 @@ #!/bin/bash set -euo pipefail -# ====================== Defaults & Args ====================== +# ====================== Flags ====================== WITH_TIDE=0 KEEP_PROMPT=0 +REMOVE_TIDE=0 VERBOSE=0 NO_PLUGINS=0 +UPDATE_MODE="prompt" # prompt | yes | no while [[ $# -gt 0 ]]; do case "$1" in - --with-tide) WITH_TIDE=1 ;; - --keep-prompt) KEEP_PROMPT=1 ;; - --verbose) VERBOSE=1 ;; - --no-plugins) NO_PLUGINS=1 ;; - --) shift; break ;; - *) echo "Unknown option: $1"; exit 1 ;; + --with-tide) WITH_TIDE=1 ;; + --keep-prompt) KEEP_PROMPT=1 ;; + --remove-tide) REMOVE_TIDE=1 ;; + --verbose) VERBOSE=1 ;; + --no-plugins) NO_PLUGINS=1 ;; + --update-check) UPDATE_MODE="yes" ;; + --no-update-check) UPDATE_MODE="no" ;; + --) shift; break ;; + *) echo "Unknown option: $1"; exit 1 ;; esac shift done # Default plugin set (safe; no prompt change) PLUGINS=("jethrokuan/z" "jorgebucaran/nvm.fish") -if [[ $WITH_TIDE -eq 1 ]]; then - PLUGINS+=("ilancosman/tide") -fi +[[ $WITH_TIDE -eq 1 ]] && PLUGINS+=("ilancosman/tide") +# ====================== UI Helpers ====================== log() { echo -e "• $*"; } ok() { echo -e "✓ $*"; } warn(){ echo -e "! $*" >&2; } -# ====================== Progress Bar (single line) ====================== padright() { printf "%-28s" "$1"; } draw_bar() { local cur="$1" total="$2" label="$3" width=40 + (( total == 0 )) && total=1 local percent=$(( cur * 100 / total )) (( percent > 100 )) && percent=100 local filled=$(( width * cur / total )) @@ -45,6 +49,17 @@ draw_bar() { "$percent" } +prompt_yn_tty() { + local prompt="${1:-Proceed (y/N): }" + local d="${2:-N}" ans="" + if [ -r /dev/tty ] && [ -w /dev/tty ]; then + read -r -p "$prompt" ans /dev/null | grep -q "^fish/" && sudo apt install -y fish || true ;; - dnf|yum) sudo "$PKG_MGR" check-update || true; "$PKG_MGR" list updates | grep -q "^fish" && sudo "$PKG_MGR" update -y fish || true ;; - pacman) sudo pacman -Sy --noconfirm; pacman -Qu | grep -q "^fish" && sudo pacman -S --noconfirm fish || true ;; - brew) brew update; brew outdated | grep -q "^fish" && brew upgrade fish || true ;; + apt) + if should_check_updates; then + sudo apt update + apt list --upgradable 2>/dev/null | grep -q "^fish/" && sudo apt install -y fish || true + else + ok "Skipped update check" + fi + ;; + dnf|yum) + if should_check_updates; then + sudo "$PKG_MGR" check-update || true + "$PKG_MGR" list updates | grep -q "^fish" && sudo "$PKG_MGR" update -y fish || true + else + ok "Skipped update check" + fi + ;; + pacman) + if should_check_updates; then + sudo pacman -Sy --noconfirm + pacman -Qu | grep -q "^fish" && sudo pacman -S --noconfirm fish || true + else + ok "Skipped update check" + fi + ;; + brew) + if should_check_updates; then + brew update + brew outdated | grep -q "^fish" && brew upgrade fish || true + else + ok "Skipped update check" + fi + ;; esac ok "Fish up to date" } # ====================== Fisher & Plugins ====================== ensure_fisher() { - # install Fisher quietly and idempotently if fish -c 'functions -q fisher' /dev/null 2>&1; then ok "Fisher already present" - return + else + log "Installing Fisher…" + fish -c 'curl -sL https://git.io/fisher | source && fisher install jorgebucaran/fisher' /dev/null 2>&1 + ok "Fisher installed" fi - log "Installing Fisher…" - fish -c 'curl -sL https://git.io/fisher | source && fisher install jorgebucaran/fisher' /dev/null 2>&1 - ok "Fisher installed" } install_plugins() { [[ $NO_PLUGINS -eq 1 ]] && { ok "Skipping plugins (per flag)"; return; } - local total=${#PLUGINS[@]} - [[ $total -eq 0 ]] && { ok "No plugins requested"; return; } + # Current installed plugins + local installed + installed="$(fish -c 'fisher list' /dev/null || true)" - if [[ $VERBOSE -eq 1 ]]; then - for p in "${PLUGINS[@]}"; do - echo "Installing (verbose): $p" - fish -c "fisher install $p" /dev/null 2>&1 ) & - pid=$! - while kill -0 "$pid" 2>/dev/null; do - draw_bar "$((i-1))" "$total" "$p" - sleep 0.08 - done - draw_bar "$i" "$total" "$p" + if ! grep -Fxq "$p" <<<"$installed"; then + missing+=("$p") + fi done - echo - ok "Plugins installed" + + # Nothing to do? + if [[ ${#missing[@]} -eq 0 ]]; then + ok "All requested plugins already installed" + else + if [[ $VERBOSE -eq 1 ]]; then + for p in "${missing[@]}"; do + echo "Installing (verbose): $p" + fish -c "fisher install $p" /dev/null 2>&1 ) & + pid=$! + while kill -0 "$pid" 2>/dev/null; do + draw_bar "$((i-1))" "$total" "$p" + sleep 0.08 + done + draw_bar "$i" "$total" "$p" + done + echo + ok "Plugins installed" + fi + fi # If Tide installed but user wants to keep default prompt if [[ $WITH_TIDE -eq 1 && $KEEP_PROMPT -eq 1 ]]; then @@ -156,15 +222,40 @@ install_plugins() { fi } +remove_tide_if_requested() { + [[ $REMOVE_TIDE -eq 0 ]] && return + + ensure_fisher # make sure fisher exists so removal works + + # Only remove if installed + if fish -c 'fisher list' /dev/null | grep -Fxq "ilancosman/tide"; then + log "Removing Tide…" + if [[ $VERBOSE -eq 1 ]]; then + fish -c "fisher remove ilancosman/tide" /dev/null 2>&1 + fi + fi + + # Clean any prompt overrides + rm -f ~/.config/fish/functions/fish_prompt.fish \ + ~/.config/fish/conf.d/_tide_init.fish 2>/dev/null || true + ok "Tide removed and default prompt restored" +} + # ====================== Main ====================== detect_platform -install_gpg_if_needed + if command -v fish &>/dev/null; then ok "Fish already installed" update_fish_if_available else + install_gpg_if_needed install_fish fi + ensure_fisher install_plugins +remove_tide_if_requested + ok "Fish + Fisher + plugins ready on ${OS}" \ No newline at end of file