main
Download
145 lines 4.6 KiBBashModified 2025-12-21executable raw
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
#!/usr/bin/env bash
set -euo pipefail

OWNER="bruce-hill"
REPO="tomo"

# Fetch latest release tag
TAG=$(curl -s "https://api.github.com/repos/$OWNER/$REPO/releases/latest" \
      | grep -Po '"tag_name": "\K.*?(?=")')

if [[ -z "$TAG" ]]; then
    echo "Failed to get latest release tag"
    exit 1
fi

# Detect platform
OS="$(uname -s)"
ARCH="$(uname -m)"
case "$OS" in
    Linux)
        case "$ARCH" in
            x86_64) FILE="tomo-linux-x86_64.tar.gz" ;;
            aarch64|arm64) FILE="tomo-linux-aarch64.tar.gz" ;;
            *) echo "Unsupported architecture: $ARCH"; exit 1 ;;
        esac
        ;;
    Darwin)
        FILE="tomo-macos-universal.tar.gz"
        ;;
    *)
        echo "Unsupported OS: $OS"
        exit 1
        ;;
esac

# Download the artifact (if not present)
if ! [ -e "$FILE" ]; then
    URL="https://github.com/$OWNER/$REPO/releases/download/$TAG/$FILE"
    echo "Downloading $URL ..."
    curl -L -o "$FILE" "$URL"
    echo "Downloaded $FILE"
fi

# Download checksum (if not present)
if ! [ -e "$FILE.sha256" ]; then
    CHECKSUM_URL="$URL.sha256"
    echo "Downloading checksum $CHECKSUM_URL ..."
    curl -L -o "$FILE.sha256" "$CHECKSUM_URL"
fi

# Verify checksum
shasum --check "$FILE.sha256"
echo "Verified checksum"

# Configure `doas` vs `sudo`
if command -v doas >/dev/null 2>&1; then  
    SUDO="doas"  
elif command -v sudo >/dev/null 2>&1; then  
    SUDO="sudo"  
else  
    echo "Neither doas nor sudo found." >&2  
    exit 1  
fi  

# Autodetect package manager:
if [ -z "${PACKAGE_MANAGER:-}" ]; then
    if command -v dnf >/dev/null 2>&1; then
        PACKAGE_MANAGER="dnf"
    elif command -v yay >/dev/null 2>&1; then
        PACKAGE_MANAGER="yay"
    elif command -v paru >/dev/null 2>&1; then
        PACKAGE_MANAGER="paru"
    elif command -v pacman >/dev/null 2>&1; then
        PACKAGE_MANAGER="pacman"
    elif command -v xbps-install >/dev/null 2>&1; then
        PACKAGE_MANAGER="xbps"
    elif command -v pkg_add >/dev/null 2>&1; then
        PACKAGE_MANAGER="pkg_add"
    elif command -v pkg >/dev/null 2>&1; then
        PACKAGE_MANAGER="freebsd-pkg"
    elif command -v brew >/dev/null 2>&1; then
        PACKAGE_MANAGER="brew"
    elif command -v port >/dev/null 2>&1; then
        PACKAGE_MANAGER="macports"
    elif command -v zypper >/dev/null 2>&1; then
        PACKAGE_MANAGER="zypper"
    elif command -v nix-env >/dev/null 2>&1; then
        PACKAGE_MANAGER="nix"
    elif command -v spack >/dev/null 2>&1; then
        PACKAGE_MANAGER="spack"
    elif command -v conda >/dev/null 2>&1; then
        PACKAGE_MANAGER="conda"
    elif command -v apt >/dev/null 2>&1; then
        PACKAGE_MANAGER="apt"
    elif command -v apt-get >/dev/null 2>&1; then
        PACKAGE_MANAGER="apt-get"
    else
        echo "Unsupported package manager" >&2
        exit 1
    fi
fi

# Install packages
echo 'Installing dependencies...'
case "$PACKAGE_MANAGER" in
    apt) $SUDO apt install libgc-dev libunistring-dev binutils libgmp-dev ;;
    apt-get) $SUDO apt-get install libgc-dev libunistring-dev binutils libgmp-dev ;;
    dnf) $SUDO dnf install gc-devel libunistring-devel binutils gmp-devel ;;
    pacman) $SUDO pacman -S gc libunistring binutils gmp ;;
    yay|paru) $PACKAGE_MANAGER -S gc libunistring binutils gmp ;;
    xbps) $SUDO xbps-install -S gc libunistring binutils gmp ;;
    pkg_add) $SUDO pkg_add boehm-gc libunistring binutils gmp ;;
    freebsd-pkg) $SUDO pkg install boehm-gc libunistring binutils gmp ;;
    brew) brew install bdw-gc libunistring binutils llvm gmp ;;
    macports) $SUDO port install boehm-gc libunistring binutils gmp ;;
    zypper) $SUDO zypper install gc-devel libunistring-devel binutils gmp-devel ;;
    nix) nix-env -iA nixpkgs.boehmgc.dev nixpkgs.libunistring nixpkgs.binutils nixpkgs.nixpkgs.gmp ;;
    spack) spack install boehm-gc libunistring binutils gmp ;;
    conda) conda install boehm-gc libunistring binutils gmp ;;
    *)
        echo "Unknown package manager: $PACKAGE_MANAGER" >&2
        exit 1
        ;;
esac

# Choose installation location
default_prefix='/usr/local'
if echo "$PATH" | tr ':' '\n' | grep -qx "$HOME/.local/bin"; then
    default_prefix="~/.local"
fi
printf '\033[1mChoose where to install Tomo (default: %s):\033[m ' "$default_prefix"
read DEST </dev/tty
if [ -z "$DEST" ]; then DEST="$default_prefix"; fi
DEST="${DEST/#\~/$HOME}"

# Install
if ! [ -w "$DEST" ]; then
    USER="$(ls -ld "$DEST" | awk '{print $$3}')"
    $(SUDO) -u "$USER" tar -xzf "$FILE" -C "$DEST" --strip-components=1 "tomo@$TAG"
else
    tar -xzf "$FILE" -C "$DEST" --strip-components=1 "tomo@$TAG"
fi
echo "Installed to $DEST"

rm -f "$FILE" "$FILE.sha256"