#!/bin/sh set -eu release_root="https://memoree.dev/releases" version="${MEMOREE_VERSION:-}" install_dir="${MEMOREE_INSTALL_DIR:-}" temp_dir="" fail() { printf 'memoree installer: %s\n' "$1" >&2 exit 1 } cleanup() { if [ -n "$temp_dir" ] && [ -d "$temp_dir" ]; then rm -rf -- "$temp_dir" fi } trap cleanup 0 trap 'exit 1' HUP INT TERM for command_name in curl tar awk uname mktemp mkdir install mv rm grep tr; do command -v "$command_name" >/dev/null 2>&1 || fail "$command_name is required" done if [ -z "$version" ]; then version="$(curl --proto '=https' --tlsv1.2 -sfL "$release_root/latest.txt" | tr -d '\r\n')" fi printf '%s' "$version" | grep -Eq '^v[0-9]+\.[0-9]+\.[0-9]+([-.][0-9A-Za-z.-]+)?$' || fail "invalid version: $version" kernel="$(uname -s)" machine="$(uname -m)" case "$kernel:$machine" in Darwin:arm64 | Darwin:aarch64) target="aarch64-apple-darwin" ;; Darwin:x86_64 | Darwin:amd64) target="x86_64-apple-darwin" ;; Linux:aarch64 | Linux:arm64) target="aarch64-unknown-linux-musl" ;; Linux:x86_64 | Linux:amd64) target="x86_64-unknown-linux-musl" ;; *) fail "unsupported platform: $kernel $machine" ;; esac if [ -z "$install_dir" ]; then if [ -n "${CARGO_HOME:-}" ]; then install_dir="$CARGO_HOME/bin" else [ -n "${HOME:-}" ] || fail "HOME is required when MEMOREE_INSTALL_DIR is unset" install_dir="$HOME/.local/bin" fi fi archive="memoree-$target.tar.gz" download_root="$release_root/download/$version" temp_dir="$(mktemp -d "${TMPDIR:-/tmp}/memoree-install.XXXXXXXX")" archive_path="$temp_dir/$archive" checksum_path="$archive_path.sha256" printf 'Downloading memoree %s for %s...\n' "$version" "$target" curl --proto '=https' --tlsv1.2 -fsSL --retry 3 -o "$archive_path" "$download_root/$archive" curl --proto '=https' --tlsv1.2 -fsSL --retry 3 -o "$checksum_path" "$download_root/$archive.sha256" expected="$(awk 'NR == 1 { print $1 }' "$checksum_path")" printf '%s' "$expected" | grep -Eq '^[0-9a-fA-F]{64}$' || fail "invalid SHA-256 checksum file" if command -v sha256sum >/dev/null 2>&1; then actual="$(sha256sum "$archive_path" | awk '{ print $1 }')" elif command -v shasum >/dev/null 2>&1; then actual="$(shasum -a 256 "$archive_path" | awk '{ print $1 }')" else fail "sha256sum or shasum is required" fi [ "$actual" = "$expected" ] || fail "SHA-256 verification failed" mkdir -p "$temp_dir/unpack" "$install_dir" tar -xzf "$archive_path" -C "$temp_dir/unpack" package_dir="$temp_dir/unpack/memoree-$target" [ -f "$package_dir/memoree" ] || fail "release archive does not contain memoree" [ -f "$package_dir/memoree-eval" ] || fail "release archive does not contain memoree-eval" install -m 755 "$package_dir/memoree" "$install_dir/.memoree.new.$$" install -m 755 "$package_dir/memoree-eval" "$install_dir/.memoree-eval.new.$$" mv -f "$install_dir/.memoree.new.$$" "$install_dir/memoree" mv -f "$install_dir/.memoree-eval.new.$$" "$install_dir/memoree-eval" printf 'Installed memoree %s to %s\n' "$version" "$install_dir" printf 'If a daemon is already running, run: memoree daemon restart\n'