diff --git a/zellij.sh b/zellij.sh new file mode 100644 index 0000000..bd5ab5e --- /dev/null +++ b/zellij.sh @@ -0,0 +1,124 @@ +#!/usr/bin/env bash +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 + echo "🔍 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) + download_url="https://github.com/$REPO/releases/download/$latest_release/$BINARY_NAME-x86_64-unknown-linux-musl.tar.gz" + + # Skip if already up-to-date + if [[ "$current_version" == "$latest_version" ]]; then + echo "✅ Already on the latest version ($latest_version). No action needed." + exit 0 + fi + + # Download and install + echo "âŦ‡ī¸ Downloading $BINARY_NAME $latest_version..." + curl -sL "$download_url" | tar -xz -C "$TMP_DIR" + + echo "đŸ› ī¸ 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" + echo "🎉 Successfully installed $BINARY_NAME $latest_version to $INSTALL_DIR/" + echo "💡 Ensure '$INSTALL_DIR' is in your PATH:" + echo " export PATH=\"$INSTALL_DIR:\$PATH\"" + else + echo "❌ Installation failed!" >&2 + exit 1 + fi +} + +# ─< Check if the given command exists silently >───────────────────────────────────────── +command_exists() { + command -v "$@" >/dev/null 2>&1 +} + +# ─< Check if the user is root and set sudo variable if necessary >─────────────────────── +check_root() { + if [ "$(id -u)" -ne 0 ]; then + if command_exists sudo; then + echo_info "User is not root. Using sudo for privileged operations." + _sudo="sudo" + else + echo_error "No sudo found and you're not root! Can't install packages." + return 1 + fi + else + echo_info "Root access confirmed." + _sudo="" + fi +} + +# ─< Distribution detection and installation >──────────────────────────────────────── +get_packager() { + if [ -e /etc/os-release ]; then + echo_info "Detecting distribution..." + . /etc/os-release + + # ─< Convert $ID and $ID_LIKE to lowercase >────────────────────────────────────────────── + ID=$(printf "%s" "$ID" | tr '[:upper:]' '[:lower:]') + ID_LIKE=$(printf "%s" "$ID_LIKE" | tr '[:upper:]' '[:lower:]') + + case "$ID" in + ubuntu | pop) generic ;; + debian) generic ;; + fedora) generic ;; + alpine) generic ;; + arch | manjaro | garuda | endeavour) + if command_exists paru; then + paru -S --noconfirm zellij + elif command_exists yay; then + yay -S --noconfirm zellij + fi + ;; + opensuse*) generic ;; + *) + if [ "${ID_LIKE#*debian}" != "$ID_LIKE" ]; then + generic + elif [ "${ID_LIKE#*ubuntu}" != "$ID_LIKE" ]; then + generic + elif [ "${ID_LIKE#*arch}" != "$ID_LIKE" ]; then + $_sudo pacman -S zellij + elif [ "${ID_LIKE#*fedora}" != "$ID_LIKE" ]; then + generic + elif [ "${ID_LIKE#*suse}" != "$ID_LIKE" ]; then + generic + else + echo_error "Unsupported distribution: $ID" + exit 1 + fi + ;; + esac + else + echo_error "Unable to detect distribution. /etc/os-release not found." + exit 1 + fi +} + +if check_root; then + get_packager +fi