Files
hermes-agent/scripts/_activation.sh

51 lines
2.2 KiB
Bash

# Sourced, never executed: the activation staleness check shared by
# scripts/_hermes-python (the shebang prologue) and scripts/run_tests.sh.
#
# pm records, beside the installed-state file named by __HERMES_ACTIVATED, one
# stamp per dependency input carrying the exact mtime that input had when the
# install was last verified against it (pm.environments.record_activation_inputs).
# Any input whose mtime DIFFERS from its stamp (newer or older, since a branch
# switch can move it either way) means the inherited environment may not match
# its inputs. `-nt`/`-ot` are bash builtins, so the check costs no process
# spawn, and every successful activation re-records, so one re-activation
# settles it. Missing stamps or inputs, a dangling sentinel or a literal "1"
# all read as stale.
# hermes_activation_current REPO: status 0 when the inherited environment
# matches REPO's current inputs.
hermes_activation_current() {
local repo="$1" sentinel stamps stamp input stamped=0
[ -n "${__HERMES_ACTIVATED:-}" ] && [ -e "${__HERMES_ACTIVATED}" ] || return 1
# activate.ps1 records a Windows path; Git Bash accepts it with slashes.
sentinel="${__HERMES_ACTIVATED//\\//}"
stamps="${sentinel%/*}/inputs"
[ -f "$stamps/.project-root" ] || return 1
local owner="$repo" recorded
recorded="$(< "$stamps/.project-root")"
if command -v cygpath >/dev/null 2>&1; then
owner="$(cygpath -am "$repo")" || return 1
recorded="${recorded//\\//}"
[ "${owner,,}" = "${recorded,,}" ] || return 1
else
[ "$(cd "$owner" && pwd -P)" = "$recorded" ] || return 1
fi
for stamp in "$stamps"/* "$stamps"/*/*; do
[ -f "$stamp" ] || continue
stamped=1
input="$repo/${stamp#"$stamps"/}"
if [ ! -e "$input" ] || [ "$input" -nt "$stamp" ] || [ "$input" -ot "$stamp" ]; then
return 1
fi
done
[ "$stamped" = 1 ]
}
# hermes_ensure_activated REPO: source REPO/activate unless the inherited
# environment is current. `--` passes no options: `source` without arguments
# would hand activate the CALLER's positional parameters.
hermes_ensure_activated() {
hermes_activation_current "$1" && return 0
# shellcheck source=/dev/null
. "$1/activate" --
}