83 lines
3.3 KiB
Bash
83 lines
3.3 KiB
Bash
__devenv_reload_apply() {
|
|
if [ -n "$DEVENV_RELOAD_FILE" ] && [ -f "$DEVENV_RELOAD_FILE" ]; then
|
|
local output
|
|
output=$(DEVENV_RELOAD_FILE="$DEVENV_RELOAD_FILE" bash <<'RELOAD_BASH' 2>/dev/null
|
|
__devenv_ignored_var() {
|
|
case "$1" in
|
|
_*|PWD|OLDPWD|SHLVL|SHELL|SHELLOPTS|BASHOPTS|BASH_*|HISTCMD|HISTFILE)
|
|
return 0 ;;
|
|
PS1|PS2|PS3|PS4|PROMPT|PROMPT_COMMAND|PROMPT_DIRTRIM)
|
|
return 0 ;;
|
|
COMP_*|READLINE_*|MAILCHECK|COLUMNS|LINES|RANDOM|SECONDS|LINENO|EPOCHSECONDS|EPOCHREALTIME|SRANDOM)
|
|
return 0 ;;
|
|
STARSHIP_*|__fish*|DIRENV_*|nix_saved_*)
|
|
return 0 ;;
|
|
*) return 1 ;;
|
|
esac
|
|
}
|
|
__devenv_capture_env() { declare -p -x 2>/dev/null | LC_ALL=C sort; }
|
|
__devenv_serialize_diff() { gzip -c | base64 -w0; }
|
|
__devenv_deserialize_diff() { echo "$1" | base64 -d | gzip -d 2>/dev/null; }
|
|
__devenv_compute_diff() {
|
|
local before_file="$1" after_file diff_content
|
|
after_file=$(mktemp); diff_content=$(mktemp)
|
|
__devenv_capture_env > "$after_file"
|
|
local -A before_vars after_vars
|
|
while IFS= read -r line; do
|
|
[[ "$line" != declare\ -x\ * ]] && continue
|
|
local vardef="${line#declare -x }" var="${vardef%%=*}"
|
|
[[ -z "$var" ]] && continue
|
|
__devenv_ignored_var "$var" && continue
|
|
before_vars["$var"]="$line"
|
|
done < "$before_file"
|
|
while IFS= read -r line; do
|
|
[[ "$line" != declare\ -x\ * ]] && continue
|
|
local vardef="${line#declare -x }" var="${vardef%%=*}"
|
|
[[ -z "$var" ]] && continue
|
|
__devenv_ignored_var "$var" && continue
|
|
after_vars["$var"]="$line"
|
|
done < "$after_file"
|
|
for var in "${!before_vars[@]}"; do
|
|
[[ "${after_vars[$var]}" != "${before_vars[$var]}" ]] && echo "P:${before_vars[$var]}" >> "$diff_content"
|
|
done
|
|
for var in "${!after_vars[@]}"; do
|
|
if [[ -z "${before_vars[$var]+x}" ]]; then echo "N:$var" >> "$diff_content"
|
|
elif [[ "${after_vars[$var]}" != "${before_vars[$var]}" ]]; then echo "N:$var" >> "$diff_content"; fi
|
|
done
|
|
_DEVENV_DIFF=$(__devenv_serialize_diff < "$diff_content"); export _DEVENV_DIFF
|
|
rm -f "$after_file" "$diff_content"
|
|
}
|
|
__devenv_apply_reverse_diff() {
|
|
[[ -z "$_DEVENV_DIFF" ]] && return
|
|
local -A prev_vars
|
|
local diff_content; diff_content=$(__devenv_deserialize_diff "$_DEVENV_DIFF")
|
|
while IFS= read -r line; do
|
|
if [[ "$line" == P:declare\ * ]]; then
|
|
local decl="${line#P:}" var="${decl#declare -x }"; var="${var%%=*}"
|
|
prev_vars["$var"]=1; eval "export ${decl#declare -x }" 2>/dev/null
|
|
fi
|
|
done <<< "$diff_content"
|
|
while IFS= read -r line; do
|
|
if [[ "$line" == N:* ]]; then
|
|
local var="${line#N:}"
|
|
[[ -z "${prev_vars[$var]+x}" ]] && unset "$var"
|
|
fi
|
|
done <<< "$diff_content"
|
|
}
|
|
__devenv_apply_reverse_diff
|
|
_before=$(mktemp); __devenv_capture_env > "$_before"
|
|
if { : >/dev/tty; } 2>/dev/null; then _devenv_reload_out=/dev/tty; else _devenv_reload_out=/dev/null; fi
|
|
source "$DEVENV_RELOAD_FILE" >"$_devenv_reload_out" 2>"$_devenv_reload_out"
|
|
rm -f "$DEVENV_RELOAD_FILE"; unset _devenv_reload_out
|
|
__devenv_compute_diff "$_before"; rm -f "$_before"
|
|
export -p
|
|
RELOAD_BASH
|
|
)
|
|
if [ -n "$output" ]; then eval "$output"; fi
|
|
_DEVENV_PATH="$PATH"
|
|
fi
|
|
}
|
|
__devenv_restore_path() {
|
|
[ -n "$_DEVENV_PATH" ] && export PATH="$_DEVENV_PATH"
|
|
}
|