`activate` is bash syntax, so fish users had no way to take on the dev environment. `activate.fish` does what `activate` does: snapshots the keys it will change, applies the composed env, defines a `hermes` function that refuses outside the worktree, adds the prompt prefix, and defines `deactivate`. It shells out to the same bash library, so composition is not reimplemented. `pm.environments --format fish` emits the env as `set -gx` statements. fish's read-only names (`PWD`, `SHLVL`, `_`, ...) are skipped because `set -gx PWD` aborts the script, and values named `*PATH` stay lists. `hermes_compose_env` takes the dialect (`sh` or `fish`) as its second argument.
112 lines
3.7 KiB
Fish
Executable File
112 lines
3.7 KiB
Fish
Executable File
# venv-style activation of the Hermes dev environment for fish.
|
|
#
|
|
# source ./activate.fish
|
|
#
|
|
# The fish counterpart of ./activate: applies the composed pm env to the
|
|
# CURRENT shell, with save/restore (`deactivate` undoes exactly what activation
|
|
# changed), makes `hermes` a function for this checkout, and prefixes the prompt
|
|
# with the worktree name. Scripts and other processes run under
|
|
# `scripts/run-in-hermes-env` instead.
|
|
#
|
|
# Options: `--test-extras a,b` selects the test environment's runtime extras
|
|
# (default: [all]).
|
|
#
|
|
# Composition (setup sync, bootstrap Python, pm env) is shared with ./activate
|
|
# through scripts/_activation.sh, so this file only applies its output.
|
|
|
|
set -l repo (path resolve (path dirname (status filename)))
|
|
|
|
argparse 'test-extras=' -- $argv
|
|
or return 2
|
|
set -l test_environment --test-environment
|
|
if set -q _flag_test_extras
|
|
set test_environment --test-environment=$_flag_test_extras
|
|
end
|
|
|
|
set -l library '. "$1/scripts/_activation.sh"'
|
|
bash -c "$library; hermes_sync \"\$1\" \"\$2\"" _ $repo $test_environment >&2
|
|
or begin
|
|
echo 'activate.fish: setup failed; shell environment unchanged' >&2
|
|
return 1
|
|
end
|
|
|
|
# Re-activating deactivates first, as ./activate does.
|
|
functions -q deactivate
|
|
and deactivate
|
|
|
|
set -l composed (bash -c "$library; hermes_compose_env \"\$1\" fish" _ $repo)
|
|
or begin
|
|
echo 'activate.fish: could not compose the environment (see above)' >&2
|
|
return 1
|
|
end
|
|
|
|
# --- snapshot what we are about to change (deactivate restores this) ---
|
|
set -g __hermes_keys (string replace -rf '^set -gx (\S+) .*' '$1' -- $composed)
|
|
for name in $__hermes_keys
|
|
if set -q $name
|
|
set -g __hermes_had_$name 1
|
|
set -g __hermes_prior_$name $$name
|
|
end
|
|
end
|
|
string join \n -- $composed | source
|
|
|
|
# This checkout, not whichever `hermes` PATH finds. A function beats PATH.
|
|
set -g __hermes_worktree $repo
|
|
# The branch names the worktree. A checkout cannot share a branch with another.
|
|
set -g __hermes_worktree_name (git -C $repo rev-parse --abbrev-ref HEAD 2>/dev/null)
|
|
if test -z "$__hermes_worktree_name" -o "$__hermes_worktree_name" = HEAD
|
|
set __hermes_worktree_name (path basename $repo)
|
|
end
|
|
|
|
function __hermes_worktree_here
|
|
set -l top (git rev-parse --show-toplevel 2>/dev/null)
|
|
or return 1
|
|
test (path resolve $top) = (path resolve $__hermes_worktree)
|
|
end
|
|
|
|
function hermes --description 'hermes of the activated checkout'
|
|
if not __hermes_worktree_here
|
|
echo "hermes: $PWD is outside $__hermes_worktree; refusing (the installed command is hidden while this checkout is active)" >&2
|
|
return 1
|
|
end
|
|
set -l python python
|
|
if set -q PYTHON
|
|
set python $PYTHON
|
|
else if test -x $__hermes_worktree/.venv/bin/python
|
|
set python $__hermes_worktree/.venv/bin/python
|
|
else if test -x $__hermes_worktree/venv/bin/python
|
|
set python $__hermes_worktree/venv/bin/python
|
|
end
|
|
pushd $__hermes_worktree >/dev/null
|
|
$python hermes $argv
|
|
set -l code $status
|
|
popd >/dev/null
|
|
return $code
|
|
end
|
|
|
|
functions -c fish_prompt __hermes_saved_fish_prompt
|
|
function fish_prompt
|
|
if __hermes_worktree_here
|
|
printf '(%s) ' $__hermes_worktree_name
|
|
end
|
|
__hermes_saved_fish_prompt
|
|
end
|
|
|
|
function deactivate --description 'undo activate.fish'
|
|
for name in $__hermes_keys
|
|
set -l had __hermes_had_$name
|
|
set -l prior __hermes_prior_$name
|
|
if set -q $had
|
|
set -gx $name $$prior
|
|
else
|
|
set -eg $name
|
|
end
|
|
set -eg $had $prior
|
|
end
|
|
functions -e fish_prompt
|
|
functions -c __hermes_saved_fish_prompt fish_prompt
|
|
functions -e __hermes_saved_fish_prompt
|
|
set -eg __hermes_keys __hermes_worktree __hermes_worktree_name
|
|
functions -e deactivate hermes __hermes_worktree_here
|
|
end
|