#!/bin/sh set -eu release_base="${XTAZY_DEALER_RELEASE_BASE:-https://dealer.xtazy.dev}" install_dir="${XTAZY_DEALER_BIN_DIR:-$HOME/.local/bin}" dealer_home="${DEALER_HOME:-$HOME/.dealer}" need_cmd() { if ! command -v "$1" >/dev/null 2>&1; then printf 'xtazy install: missing required command: %s\n' "$1" >&2 exit 1 fi } sha256_file() { if command -v sha256sum >/dev/null 2>&1; then sha256sum "$1" | awk '{print $1}' return fi if command -v shasum >/dev/null 2>&1; then shasum -a 256 "$1" | awk '{print $1}' return fi printf 'xtazy install: missing sha256sum or shasum\n' >&2 exit 1 } download() { url="$1" out="$2" curl --proto '=https' --tlsv1.2 -fsSL "$url" -o "$out" } need_cmd awk need_cmd chmod need_cmd cp need_cmd curl need_cmd mkdir need_cmd mv need_cmd rm need_cmd tar need_cmd uname if ! command -v sha256sum >/dev/null 2>&1 && ! command -v shasum >/dev/null 2>&1; then printf 'xtazy install: missing required command: sha256sum or shasum\n' >&2 exit 1 fi os="$(uname -s)" arch="$(uname -m)" family="unix" lookup_key="${os}_${arch}" case "$os" in Linux|Darwin) ;; *) printf 'xtazy install: unsupported OS for this script: %s\n' "$os" >&2 printf 'xtazy install: Windows installer is separate.\n' >&2 exit 1 ;; esac if command -v mktemp >/dev/null 2>&1; then tmp="$(mktemp -d "${TMPDIR:-/tmp}/xtazy-install.XXXXXX")" else tmp="${TMPDIR:-/tmp}/xtazy-install.$$" mkdir -p "$tmp" fi cleanup() { rm -rf "$tmp" } trap cleanup EXIT INT TERM targets="$tmp/targets.tsv" version_file="$tmp/version.txt" download "$release_base/targets.tsv" "$targets" download "$release_base/version.txt" "$version_file" version="$(awk 'NF { print $1; exit }' "$version_file")" if [ -z "$version" ]; then printf 'xtazy install: downloaded empty version.txt\n' >&2 exit 1 fi if [ -x "$install_dir/dealer" ]; then installed_version="$("$install_dir/dealer" --version 2>/dev/null | awk '{print $2}' || true)" if [ -n "$installed_version" ]; then if [ "$installed_version" != "$version" ]; then printf 'xtazy install: dealer v%s is currently installed, but v%s is available.\n' "$installed_version" "$version" printf 'xtazy install: Would you like to securely update using `dealer self update`? [Y/n]: ' if read -r ans < /dev/tty 2>/dev/null; then case "$ans" in [Nn]*) printf 'xtazy install: skipping update.\n' exit 0 ;; *) "$install_dir/dealer" self update exit 0 ;; esac else printf '\nxtazy install: non-interactive shell detected, skipping update.\n' printf 'xtazy install: to update manually, run `%s/dealer self update`\n' "$install_dir" exit 0 fi else printf 'xtazy install: dealer v%s is already installed and up to date.\n' "$installed_version" auto_status="$("$install_dir/dealer" self auto-update status 2>/dev/null || true)" case "$auto_status" in *"is off"*) printf 'xtazy install: Would you like to enable automatic updates for dealer? [y/N]: ' if read -r ans < /dev/tty 2>/dev/null; then case "$ans" in [Yy]*) "$install_dir/dealer" self auto-update on ;; esac fi ;; esac if [ "${XTAZY_SKIP_TOOLCHAIN_INSTALL:-0}" != "1" ]; then mkdir -p "$dealer_home" DEALER_HOME="$dealer_home" "$install_dir/dealer" xtazy update fi exit 0 fi fi fi row="$(awk -F ' ' -v family="$family" -v key="$lookup_key" '$1 == family && $2 == key { print; exit }' "$targets")" if [ -z "$row" ]; then printf 'xtazy install: no dealer target for %s %s\n' "$os" "$arch" >&2 printf 'xtazy install: expected lookup row: %s %s\n' "$family" "$lookup_key" >&2 exit 1 fi IFS=' ' read -r _ _ suffix expected_sha <&2 exit 1 fi archive_name="dealer-${version}-${suffix}.tar.gz" archive="$tmp/$archive_name" download "$release_base/$archive_name" "$archive" actual_sha="$(sha256_file "$archive")" if [ "$actual_sha" != "$expected_sha" ]; then printf 'xtazy install: sha256 mismatch for %s\n' "$archive_name" >&2 printf 'xtazy install: expected %s\n' "$expected_sha" >&2 printf 'xtazy install: actual %s\n' "$actual_sha" >&2 exit 1 fi unpack_dir="$tmp/unpack" mkdir -p "$unpack_dir" tar -xzf "$archive" -C "$unpack_dir" dealer_bin="$unpack_dir/dealer/dealer" if [ ! -f "$dealer_bin" ]; then printf 'xtazy install: archive does not contain dealer/dealer\n' >&2 exit 1 fi mkdir -p "$install_dir" chmod +x "$dealer_bin" cp "$dealer_bin" "$install_dir/dealer.tmp" mv "$install_dir/dealer.tmp" "$install_dir/dealer" printf 'xtazy install: installed dealer to %s/dealer\n' "$install_dir" case ":$PATH:" in *":$install_dir:"*) ;; *) printf 'xtazy install: %s is not in PATH\n' "$install_dir" >&2 printf 'xtazy install: add this to your shell profile:\n' >&2 printf 'export PATH="%s:$PATH"\n' "$install_dir" >&2 ;; esac if [ "${XTAZY_SKIP_TOOLCHAIN_INSTALL:-0}" != "1" ]; then mkdir -p "$dealer_home" DEALER_HOME="$dealer_home" "$install_dir/dealer" xtazy update fi