Ameneded
This commit is contained in:
@@ -1,140 +1,129 @@
|
||||
#!/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/tty || true
|
||||
else
|
||||
# non-interactive (e.g., curl|bash): use default
|
||||
echo "$prompt$default"
|
||||
ans="$default"
|
||||
fi
|
||||
[[ ${ans:-$default} =~ ^[Yy]$ ]]
|
||||
}
|
||||
|
||||
# 🔍 Detect OS and Package Manager
|
||||
# -- platform detection --------------------------------------------
|
||||
detect_platform() {
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
OS="macos"
|
||||
OS="macos"; PKG_MGR="brew"
|
||||
if ! command -v brew &>/dev/null; then
|
||||
echo "🍺 Homebrew not found. Install it now? (y/N): "
|
||||
read -r confirm
|
||||
if [[ "$confirm" =~ ^[Yy]$ ]]; 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
|
||||
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"
|
||||
OS="debian"; PKG_MGR="apt"
|
||||
elif command -v dnf &>/dev/null; then
|
||||
OS="rhel"
|
||||
PKG_MGR="dnf"
|
||||
OS="rhel"; PKG_MGR="dnf"
|
||||
elif command -v yum &>/dev/null; then
|
||||
OS="rhel"
|
||||
PKG_MGR="yum"
|
||||
OS="rhel"; PKG_MGR="yum"
|
||||
elif command -v pacman &>/dev/null; then
|
||||
OS="arch"
|
||||
PKG_MGR="pacman"
|
||||
OS="arch"; PKG_MGR="pacman"
|
||||
else
|
||||
echo "❌ Unsupported platform."
|
||||
exit 1
|
||||
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..."
|
||||
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
|
||||
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
|
||||
;;
|
||||
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."
|
||||
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
|
||||
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."
|
||||
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
|
||||
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."
|
||||
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
|
||||
read -rp "An update is available. Update Fish? (y/N): " confirm
|
||||
[[ "$confirm" =~ ^[Yy]$ ]] && brew upgrade fish
|
||||
else
|
||||
echo "Fish is already up to date."
|
||||
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
|
||||
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
|
||||
# prevent fisher from reading our script via stdin
|
||||
fish /tmp/install_fisher.fish </dev/null
|
||||
}
|
||||
|
||||
# 🧩 Install plugins via external .fish script (stdin isolated)
|
||||
install_fish_plugins() {
|
||||
echo "Installing recommended Fish plugins..."
|
||||
curl -fsSL https://git.mycod.in/apt/fish_install/raw/branch/main/fish_plugins.fish -o /tmp/fish_plugins.fish
|
||||
curl -fsSL https://git.mycod.in/apt/fish_install/raw/branch/main/fish_plugins.fish \
|
||||
-o /tmp/fish_plugins.fish
|
||||
chmod +x /tmp/fish_plugins.fish
|
||||
fish /tmp/fish_plugins.fish </dev/null
|
||||
# QUIET mode: suppress noisy file listing. Remove redirection if you want verbosity.
|
||||
fish /tmp/fish_plugins.fish </dev/null >/dev/null 2>&1
|
||||
}
|
||||
|
||||
# 🏁 Main script
|
||||
# -- main -----------------------------------------------------------
|
||||
detect_platform
|
||||
install_gpg_if_needed
|
||||
|
||||
@@ -145,9 +134,7 @@ else
|
||||
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
|
||||
if prompt_yn "Install Fisher plugin manager and recommended plugins? (y/N): " N; then
|
||||
install_fisher
|
||||
install_fish_plugins
|
||||
echo "Fisher and plugins installed!"
|
||||
@@ -155,4 +142,4 @@ else
|
||||
echo "Skipping plugin installation."
|
||||
fi
|
||||
|
||||
echo "✅ Fish shell setup complete on $OS!"
|
||||
echo "✅ Fish shell setup complete on ${OS}!"
|
||||
Reference in New Issue
Block a user