Files
tui/tui/tui-shell.bash
2026-10-13 10:48:28 +02:00

118 lines
3.4 KiB
Bash

# Bash integration for TUI.
# This file is sourced automatically by the installer from ~/.bashrc.
# Actions are executed by this Bash process, not by a child shell in Python.
tui() {
local tui_python
tui_python="${TUI_PYTHON:-$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/tui.py}"
if [[ ! -f "$tui_python" ]]; then
echo "tui: cannot find $tui_python" >&2
return 127
fi
local tui_dir="."
local show_all=0
local arg
for arg in "$@"; do
case "$arg" in
-a|--all) show_all=1 ;;
-v|--version) python3 "$tui_python" --version; return $? ;;
*) tui_dir="$arg" ;;
esac
done
local command_file
local cwd_file
local all_file
local rc
local cmd
local tui_cwd
local tui_all
local -a tui_commands
command_file="$(mktemp)"
cwd_file="$(mktemp)"
all_file="$(mktemp)"
printf '%s\n' "$show_all" > "$all_file"
while :; do
: > "$command_file"
: > "$cwd_file"
: > "$all_file"
if (( show_all )); then
TUI_COMMAND_FILE="$command_file" \
TUI_CWD_FILE="$cwd_file" \
TUI_ALL_FILE="$all_file" \
python3 "$tui_python" -a "$tui_dir"
else
TUI_COMMAND_FILE="$command_file" \
TUI_CWD_FILE="$cwd_file" \
TUI_ALL_FILE="$all_file" \
python3 "$tui_python" "$tui_dir"
fi
rc=$?
tui_cwd="$(<"$cwd_file")"
tui_all="$(<"$all_file")"
if [[ "$tui_all" == "1" ]]; then
show_all=1
elif [[ "$tui_all" == "0" ]]; then
show_all=0
fi
# Ctrl+C exits TUI. Apply the last directory in the parent Bash
# process, then return to the caller.
if (( rc == 43 )); then
if [[ -n "$tui_cwd" && -d "$tui_cwd" ]]; then
cd -- "$tui_cwd" || {
rm -f "$command_file" "$cwd_file" "$all_file"
return 1
}
fi
rm -f "$command_file" "$cwd_file" "$all_file"
return 0
fi
if (( rc != 42 )); then
rm -f "$command_file" "$cwd_file" "$all_file"
return "$rc"
fi
if [[ -z "$tui_cwd" || ! -d "$tui_cwd" ]]; then
echo "tui: invalid TUI working directory" >&2
rm -f "$command_file" "$cwd_file" "$all_file"
return 1
fi
# Execute all commands belonging to one TUI action before starting
# TUI again. Each command remains a normal Bash command and gets its
# own history entry. If a command fails, stop the action and pause so
# the user has time to see the error.
pushd "$tui_cwd" >/dev/null || {
rm -f "$command_file" "$cwd_file" "$all_file"
return 1
}
mapfile -t tui_commands < "$command_file"
for cmd in "${tui_commands[@]}"; do
[[ -z "$cmd" ]] && continue
history -s -- "$cmd"
eval "$cmd"
rc=$?
if (( rc != 0 )); then
printf '\nTUI: command failed (exit %d)\n' "$rc" >&2
read -rp 'Tryck Enter för att fortsätta...' _
break
fi
done
popd >/dev/null || true
# Re-enter TUI at the directory in which the action was created.
tui_dir="$tui_cwd"
done
}