From a27ae7faf4b5897964032b120ffd0ebd1959a487 Mon Sep 17 00:00:00 2001 From: shuki Date: Thu, 5 Mar 2026 22:20:00 +0200 Subject: [PATCH] Bundle gum binary with gniza installation - Install script auto-downloads gum from GitHub releases into $INSTALL_DIR/bin/gum (supports x86_64, arm64, armv7, i386) - Skips download if gum is already installed system-wide - bin/gniza adds $GNIZA_DIR/bin to PATH so bundled gum is found - No system package installation required Co-Authored-By: Claude Opus 4.6 --- README.md | 4 +++- bin/gniza | 3 +++ scripts/install.sh | 53 ++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 57 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6d68174..6e16f1b 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,9 @@ Root mode installs to `/usr/local/gniza`. User mode installs to `~/.local/share/ ### Dependencies - **Required**: bash 4+, rsync -- **Optional**: ssh, [gum](https://github.com/charmbracelet/gum) (TUI), curl (SMTP notifications), rclone (S3/GDrive) +- **Optional**: ssh, curl (SMTP notifications), rclone (S3/GDrive) + +> **Note**: [gum](https://github.com/charmbracelet/gum) (TUI engine) is automatically downloaded during installation. ## Quick Start diff --git a/bin/gniza b/bin/gniza index 3003a0c..ad7c295 100755 --- a/bin/gniza +++ b/bin/gniza @@ -5,6 +5,9 @@ set -euo pipefail GNIZA_DIR="$(cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")/.." && pwd)" export GNIZA_DIR +# Add bundled binaries (gum) to PATH if present +[[ -d "$GNIZA_DIR/bin" ]] && export PATH="$GNIZA_DIR/bin:$PATH" + # ── Source libraries in dependency order ───────────────────── source "$GNIZA_DIR/lib/constants.sh" source "$GNIZA_DIR/lib/utils.sh" diff --git a/scripts/install.sh b/scripts/install.sh index 2919eed..9562792 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -68,12 +68,61 @@ for cmd in bash rsync; do fi done -for cmd in ssh gum curl; do +for cmd in ssh curl; do if ! command -v "$cmd" &>/dev/null; then warn "Optional dependency not found: $cmd" fi done +# ── Install bundled gum binary ─────────────────────────────── +GUM_VERSION="0.17.0" + +_detect_arch() { + local arch; arch=$(uname -m) + case "$arch" in + x86_64) echo "x86_64" ;; + aarch64) echo "arm64" ;; + armv7*) echo "armv7" ;; + i386|i686) echo "i386" ;; + *) echo "" ;; + esac +} + +if command -v gum &>/dev/null; then + info "gum already installed: $(command -v gum)" +else + GUM_ARCH=$(_detect_arch) + if [[ -n "$GUM_ARCH" ]] && command -v curl &>/dev/null; then + GUM_URL="https://github.com/charmbracelet/gum/releases/download/v${GUM_VERSION}/gum_${GUM_VERSION}_Linux_${GUM_ARCH}.tar.gz" + info "Downloading gum v${GUM_VERSION} (${GUM_ARCH})..." + GUM_TMP=$(mktemp -d) + if curl -fsSL "$GUM_URL" | tar xz -C "$GUM_TMP" 2>/dev/null; then + mkdir -p "$INSTALL_DIR/bin" + # The tarball extracts to a subdirectory + if [[ -f "$GUM_TMP/gum_${GUM_VERSION}_Linux_${GUM_ARCH}/gum" ]]; then + cp "$GUM_TMP/gum_${GUM_VERSION}_Linux_${GUM_ARCH}/gum" "$INSTALL_DIR/bin/gum" + elif [[ -f "$GUM_TMP/gum" ]]; then + cp "$GUM_TMP/gum" "$INSTALL_DIR/bin/gum" + fi + if [[ -f "$INSTALL_DIR/bin/gum" ]]; then + chmod +x "$INSTALL_DIR/bin/gum" + info "Installed gum to $INSTALL_DIR/bin/gum" + else + warn "Failed to locate gum binary in archive" + fi + else + warn "Failed to download gum (TUI will not be available)" + fi + rm -rf "$GUM_TMP" + else + if [[ -z "${GUM_ARCH:-}" ]]; then + warn "Unsupported architecture for gum: $(uname -m)" + else + warn "curl not found, cannot download gum (TUI will not be available)" + fi + fi +fi + # ── Install files ──────────────────────────────────────────── info "Installing to $INSTALL_DIR..." mkdir -p "$INSTALL_DIR" @@ -140,5 +189,5 @@ echo " Logs: $LOG_DIR" echo "" echo "Get started:" echo " gniza --help Show CLI help" -echo " gniza Launch TUI (requires gum)" +echo " gniza Launch TUI" echo ""