124 lines
3.4 KiB
Bash
124 lines
3.4 KiB
Bash
#!/usr/bin/env bash
|
||
|
||
# ─< Check if the given command exists silently >─────────────────────────────────────────
|
||
command_exists() {
|
||
command -v "$@" >/dev/null 2>&1
|
||
}
|
||
|
||
# WHY:
|
||
# This import will give you the following variables:
|
||
# _sudo="sudo -E" <- only if non root user
|
||
# distro = <distro name, like 'arch', 'debian', 'fedora'..>
|
||
# arch = bool
|
||
# fedora = bool
|
||
# opensuse = bool....
|
||
# You can then use it for, `if $arch; then`
|
||
# Also this gives you the _install command, which installs a package pased on the packagemanager/distro used.
|
||
# CAUTION:
|
||
# This only wokrs for generic package names, like neovim, or vim, or tmux etc..
|
||
# not every package packagemanager has the same packagenames for their packages..
|
||
getImports() {
|
||
i="https://git.k4li.de/scripts/imports/raw/branch/main/distros.sh"
|
||
import="$(mktemp)"
|
||
if command_exists curl; then
|
||
curl -fsSL $i -o $import
|
||
else
|
||
echo "curl is required, but missing.."
|
||
exit 1
|
||
fi
|
||
|
||
source "$import"
|
||
sleep 0.3
|
||
rm "$import"
|
||
pen bold yellow "cleaned $import"
|
||
}
|
||
|
||
generic() {
|
||
set -euo pipefail
|
||
|
||
# Configuration
|
||
INSTALL_DIR="${HOME}/.local/bin" # Prefer ~/.local/bin (add to PATH if not already)
|
||
BINARY_NAME="zellij"
|
||
REPO="zellij-org/zellij"
|
||
TMP_DIR=$(mktemp -d)
|
||
|
||
# Cleanup on exit
|
||
trap 'rm -rf "$TMP_DIR"' EXIT
|
||
|
||
# Ensure install directory exists
|
||
mkdir -p "$INSTALL_DIR"
|
||
|
||
# Check if zellij is already installed
|
||
current_version=""
|
||
if command -v "$BINARY_NAME" >/dev/null 2>&1; then
|
||
current_version=$($BINARY_NAME --version | awk '{print $2}')
|
||
echo "ℹ️ Found existing $BINARY_NAME (version: $current_version)"
|
||
fi
|
||
|
||
# Fetch latest release from GitHub
|
||
pen bold blue "🔍 Checking latest release of $REPO..."
|
||
latest_release=$(curl -s "https://api.github.com/repos/$REPO/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
|
||
latest_version=${latest_release#v} # Remove 'v' prefix (e.g., v0.42.2 → 0.42.2)
|
||
|
||
# Detect system architecture
|
||
ARCH=$(uname -m)
|
||
case "$ARCH" in
|
||
x86_64)
|
||
ARCH="x86_64"
|
||
;;
|
||
aarch64 | arm64)
|
||
ARCH="aarch64"
|
||
;;
|
||
*)
|
||
echo-error "❌ Unsupported architecture: $ARCH" >&2
|
||
exit 1
|
||
;;
|
||
esac
|
||
|
||
download_url="https://github.com/$REPO/releases/download/$latest_release/$BINARY_NAME-$ARCH-unknown-linux-musl.tar.gz"
|
||
|
||
# Skip if already up-to-date
|
||
if [[ "$current_version" == "$latest_version" ]]; then
|
||
pen bold blue "✅ Already on the latest version ($latest_version). No action needed."
|
||
exit 0
|
||
fi
|
||
|
||
# Download and install
|
||
pen bold blue "⬇️ Downloading $BINARY_NAME $latest_version for $ARCH..."
|
||
curl -sL "$download_url" | tar -xz -C "$TMP_DIR"
|
||
|
||
pen bold blue "🛠️ Installing to $INSTALL_DIR..."
|
||
mv -f "$TMP_DIR/$BINARY_NAME" "$INSTALL_DIR/"
|
||
|
||
# Verify
|
||
if [[ -f "$INSTALL_DIR/$BINARY_NAME" ]]; then
|
||
chmod +x "$INSTALL_DIR/$BINARY_NAME"
|
||
pen bold blue "🎉 Successfully installed $BINARY_NAME $latest_version to $INSTALL_DIR/"
|
||
pen bold yellow "💡 Ensure '$INSTALL_DIR' is in your PATH:"
|
||
pen bold yellow " export PATH=\"$INSTALL_DIR:\$PATH\""
|
||
else
|
||
echo-error "❌ Installation failed!" >&2
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
setup() {
|
||
if getImports; then
|
||
case "$@" in
|
||
--silent | -s)
|
||
pen bold yellow "Executing script silently.."
|
||
silent=true
|
||
;;
|
||
*)
|
||
silent=false
|
||
;;
|
||
esac
|
||
fi
|
||
}
|
||
|
||
if setup "$@"; then
|
||
case "$distro" in
|
||
arch | opensuse) _install zellij ;;
|
||
*) generic ;;
|
||
esac
|
||
fi
|