Files
gnome-jarvis/packaging/install.sh
T
snxraven 324f0d5e3a
Rolling release / release (push) Successful in 8m42s
Update Installer
2026-09-11 21:34:34 -04:00

202 lines
8.2 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
command -v zip >/dev/null || { echo "zip is required to register the GNOME extension" >&2; exit 1; }
APP_DIR="${HOME}/.local/share/jarvis-qvac"
EXT_DIR="${XDG_DATA_HOME:-${HOME}/.local/share}/gnome-shell/extensions/[email protected]"
CONFIG_DIR="${HOME}/.config/jarvis"
CACHE_DIR="${XDG_CACHE_HOME:-${HOME}/.cache}/jarvis/models"
APP_PARENT="$(dirname "${APP_DIR}")"
LOG_DIR="${XDG_STATE_HOME:-${HOME}/.local/state}/jarvis"
LOG_FILE="${LOG_DIR}/install.log"
mkdir -p "${APP_PARENT}" "${CONFIG_DIR}" "${HOME}/.config/systemd/user" "${CACHE_DIR}" "${LOG_DIR}"
log() {
local line
line="$(date -Iseconds 2>/dev/null || date '+%Y-%m-%dT%H:%M:%S%z') jarvis-install: $*"
printf '%s\n' "${line}" | tee -a "${LOG_FILE}"
if command -v logger >/dev/null; then
logger --tag jarvis-install -- "$*" 2>/dev/null || logger -t jarvis-install -- "$*" 2>/dev/null || true
fi
}
STAGING=""
EXT_TMP_DIR=""
cleanup_install() {
if [[ -n "${STAGING}" && -e "${STAGING}" ]]; then
log "removing unfinished staging directory ${STAGING}"
rm -rf "${STAGING}"
fi
rm -rf "${EXT_TMP_DIR}"
}
trap cleanup_install EXIT
has_bundled_bare() {
[[ -f "${ROOT_DIR}/node_modules/bare-runtime-linux-x64/bin/bare" || -f "${ROOT_DIR}/node_modules/bare-runtime-linux-arm64/bin/bare" ]]
}
extract_tree() {
local dest="$1"
mkdir -p "${dest}"
if has_bundled_bare; then
log "staging bundled Bare tree from ${ROOT_DIR} into ${dest}"
tar --exclude='.git' --exclude='./.agents' --exclude='./.codex' --exclude='./dist' --exclude='./vendor/agent-harness/node_modules' --exclude='*/__pycache__' --exclude='*.pyc' -cf - -C "${ROOT_DIR}" . | tar -xf - -C "${dest}"
else
log "staging source tree from ${ROOT_DIR} into ${dest} (excluding node_modules)"
tar --exclude='.git' --exclude='./.agents' --exclude='./.codex' --exclude='./dist' --exclude='./node_modules' --exclude='*/node_modules' --exclude='*/__pycache__' --exclude='*.pyc' -cf - -C "${ROOT_DIR}" . | tar -xf - -C "${dest}"
fi
}
log "starting install from ${ROOT_DIR}"
log "application directory ${APP_DIR}; extension ${EXT_DIR}"
log "preserving config ${CONFIG_DIR}, cache ${CACHE_DIR}, and user data under ${HOME}/.local/share/jarvis"
PREVIOUSLY_ACTIVE=false
if command -v systemctl >/dev/null; then
if systemctl --user is-active --quiet jarvisd.service 2>/dev/null; then
PREVIOUSLY_ACTIVE=true
log "stopping running jarvisd.service before replacing files"
if systemctl --user stop jarvisd.service; then
log "stopped jarvisd.service"
else
log "warning: could not stop jarvisd.service; continuing with replacement"
fi
else
log "jarvisd.service was not running"
fi
else
log "systemctl not found; skipped service stop"
fi
if [[ -e "${APP_DIR}" ]]; then
log "previous application tree found at ${APP_DIR}"
else
log "no previous application tree at ${APP_DIR}"
fi
if [[ -e "${EXT_DIR}" ]]; then
log "previous GNOME extension found at ${EXT_DIR}"
else
log "no previous GNOME extension at ${EXT_DIR}"
fi
if command -v gnome-extensions >/dev/null; then
if gnome-extensions disable [email protected] >/dev/null 2>&1; then
log "disabled GNOME extension [email protected]"
else
log "GNOME extension [email protected] was not enabled or could not be disabled"
fi
if gnome-extensions uninstall [email protected] >/dev/null 2>&1; then
log "uninstalled GNOME extension [email protected]"
else
log "GNOME extension [email protected] was not registered or could not be uninstalled"
fi
else
log "gnome-extensions not found; removing extension files directly"
fi
if [[ -e "${EXT_DIR}" ]]; then
log "removing leftover extension files at ${EXT_DIR}"
rm -rf "${EXT_DIR}"
fi
shopt -s nullglob
for leftover in "${APP_PARENT}"/jarvis-qvac.staging.*; do
log "removing leftover staging directory ${leftover}"
rm -rf "${leftover}"
done
shopt -u nullglob
STAGING="$(mktemp -d "${APP_PARENT}/jarvis-qvac.staging.XXXXXX")"
extract_tree "${STAGING}"
if [[ -e "${APP_DIR}" ]]; then
log "removing previous application tree ${APP_DIR}"
rm -rf "${APP_DIR}"
fi
log "moving staged tree ${STAGING} into ${APP_DIR}"
mv "${STAGING}" "${APP_DIR}"
STAGING=""
log "application tree replaced at ${APP_DIR}"
case "$(uname -m)" in
x86_64|amd64) BARE_BIN="${APP_DIR}/node_modules/bare-runtime-linux-x64/bin/bare" ;;
aarch64|arm64) BARE_BIN="${APP_DIR}/node_modules/bare-runtime-linux-arm64/bin/bare" ;;
*) BARE_BIN="" ;;
esac
if [[ ! -x "${BARE_BIN}" ]]; then BARE_BIN="$(command -v bare || true)"; fi
if [[ -z "${BARE_BIN}" || ! -x "${BARE_BIN}" ]]; then
log "error: no Bare runtime for $(uname -m) in the installed bundle"
echo "The installed bundle does not contain a Bare runtime for $(uname -m). Install the official rolling bundle or build it with npm run package:bare." >&2
exit 1
fi
chmod 755 "${BARE_BIN}"
log "using Bare runtime ${BARE_BIN}"
EXT_TMP_DIR="$(mktemp -d "${TMPDIR:-/tmp}/jarvis-extension.XXXXXX")"
EXT_ZIP="${EXT_TMP_DIR}/jarvis-extension.zip"
mkdir -p "${EXT_DIR}"
( cd "${ROOT_DIR}/apps/gnome-extension/[email protected]" && zip -q -r "${EXT_ZIP}" . )
if command -v gnome-extensions >/dev/null; then
if gnome-extensions install --force "${EXT_ZIP}"; then
log "registered GNOME extension from ${EXT_ZIP}"
else
log "warning: GNOME extension registration failed; copying files to ${EXT_DIR}"
echo "GNOME extension registration failed; installing the files directly." >&2
cp -a "${ROOT_DIR}/apps/gnome-extension/[email protected]/." "${EXT_DIR}/"
log "copied GNOME extension files to ${EXT_DIR}"
fi
else
cp -a "${ROOT_DIR}/apps/gnome-extension/[email protected]/." "${EXT_DIR}/"
log "copied GNOME extension files to ${EXT_DIR}"
fi
if command -v glib-compile-schemas >/dev/null && [[ -d "${EXT_DIR}/schemas" ]]; then
glib-compile-schemas "${EXT_DIR}/schemas" >/dev/null
log "compiled GSettings schemas in ${EXT_DIR}/schemas"
fi
sed "s#__JARVIS_BARE__#${BARE_BIN}#" "${ROOT_DIR}/packaging/jarvisd.service" > "${HOME}/.config/systemd/user/jarvisd.service"
log "wrote ${HOME}/.config/systemd/user/jarvisd.service"
if [[ -f "${CONFIG_DIR}/config.json" ]]; then
log "kept existing ${CONFIG_DIR}/config.json"
fi
if [[ ! -f "${CONFIG_DIR}/qvac.config.json" ]]; then
sed "s#__JARVIS_CACHE__#${CACHE_DIR}#g" "${ROOT_DIR}/packaging/qvac.config.template.json" > "${CONFIG_DIR}/qvac.config.json"
log "created ${CONFIG_DIR}/qvac.config.json"
else
log "kept existing ${CONFIG_DIR}/qvac.config.json"
fi
restart_user_service() {
systemctl --user daemon-reload
log "reloaded user systemd units"
if [[ "${1:-}" == "enable" ]]; then
systemctl --user enable jarvisd.service
log "enabled jarvisd.service"
fi
systemctl --user restart jarvisd.service
log "restarted jarvisd.service"
}
if [[ "${1:-}" == "--enable" ]]; then
restart_user_service enable
if command -v gnome-extensions >/dev/null && gnome-extensions enable [email protected] >/dev/null 2>&1; then
log "enabled GNOME extension [email protected]"
elif command -v gsettings >/dev/null && gsettings writable org.gnome.shell enabled-extensions >/dev/null 2>&1; then
# A running GNOME Shell keeps its extension catalogue until the next
# session. Persist the enabled state so the extension starts on login.
ENABLED_EXTENSIONS="$(gsettings get org.gnome.shell enabled-extensions 2>/dev/null || printf '[]')"
if [[ "${ENABLED_EXTENSIONS}" != *"[email protected]"* ]]; then
if [[ "${ENABLED_EXTENSIONS}" == "[]" ]]; then
ENABLED_EXTENSIONS="['[email protected]']"
else
ENABLED_EXTENSIONS="${ENABLED_EXTENSIONS%]}, '[email protected]']"
fi
gsettings set org.gnome.shell enabled-extensions "${ENABLED_EXTENSIONS}"
log "persisted [email protected] in org.gnome.shell enabled-extensions"
fi
log "GNOME Shell will enable Jarvis after the next login (the current Shell session has not rescanned extensions)"
else
log "GNOME Shell has not rescanned extensions; log out and back in, then run: gnome-extensions enable [email protected]"
fi
elif [[ "${PREVIOUSLY_ACTIVE}" == true ]]; then
restart_user_service
log "restarted jarvisd.service with the upgraded files"
fi
log "install complete; log file ${LOG_FILE}"
echo "Installed JARVIS-QVAC to ${APP_DIR}"
echo "Run: ${APP_DIR}/packaging/first-run.sh"