#!/bin/sh # dovmem installer · https://dovmem.com set -eu WHEEL_URL="https://dovmem.com/dl/dovmem-0.3.1-py3-none-any.whl" WHEEL_SHA256="380319659c134a4e8965725bcf7a5576ea629ec60914e66df019f4065a2dbd76" WHEEL_NAME="dovmem-0.3.1-py3-none-any.whl" APP="${DOVMEM_APP_DIR:-$HOME/.devmem/app}" BIN="${DOVMEM_BIN_DIR:-$HOME/.local/bin}" say() { printf '%s\n' "$*"; } fail() { say "✗ $*" >&2; exit 1; } command -v python3 >/dev/null 2>&1 || fail "dovmem needs Python 3.9+. macOS: run 'xcode-select --install' (or 'brew install python'). Linux: install python3." python3 -c 'import sys; sys.exit(0 if sys.version_info >= (3, 9) else 1)' || fail "dovmem needs Python 3.9 or newer." command -v curl >/dev/null 2>&1 || fail "curl is required." TMP=$(mktemp -d 2>/dev/null || mktemp -d -t dovmem) trap 'rm -rf "$TMP"' EXIT INT TERM say "→ Downloading dovmem…" curl -fsSL "$WHEEL_URL" -o "$TMP/$WHEEL_NAME" if command -v shasum >/dev/null 2>&1; then GOT=$(shasum -a 256 "$TMP/$WHEEL_NAME" | cut -d' ' -f1) elif command -v sha256sum >/dev/null 2>&1; then GOT=$(sha256sum "$TMP/$WHEEL_NAME" | cut -d' ' -f1) else GOT=$(python3 -c 'import hashlib,sys; print(hashlib.sha256(open(sys.argv[1],"rb").read()).hexdigest())' "$TMP/$WHEEL_NAME") fi [ "$GOT" = "$WHEEL_SHA256" ] || fail "Checksum mismatch. The download may be corrupted; please try again." say "→ Installing into $APP" python3 -m venv "$APP" 2>/dev/null || fail "Could not create a Python environment. On Debian/Ubuntu: sudo apt install python3-venv" "$APP/bin/python" -m pip install --quiet --disable-pip-version-check --no-deps --upgrade "$TMP/$WHEEL_NAME" \ || fail "pip could not install dovmem." mkdir -p "$BIN" ln -sf "$APP/bin/devmem" "$BIN/devmem" ln -sf "$APP/bin/dovmem" "$BIN/dovmem" say "✓ dovmem installed." case ":$PATH:" in *":$BIN:"*) ;; *) say ""; say "Add dovmem to your PATH (then open a new terminal):" say " echo 'export PATH=\"$BIN:\$PATH\"' >> ~/.zshrc" ;; esac if [ -t 1 ] && [ -r /dev/tty ]; then say "" "$APP/bin/devmem" setup