Replace shell instances with quickshell's synchronous kill
With quickshell-git, qs kill blocks until the instance has fully exited, so restarting no longer needs to resolve pids and wait for them to die. Kill in a loop until none remain - each call takes the oldest, and duplicates from stale sessions are the reason this script exists. The timeout bounds a wedged shell that can't process the quit message: its kill would otherwise report success after Qt's 30s wait gives up, re-killing the same undead instance forever. The test mock now kills real processes synchronously to match. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
21eacb324a
commit
afcbcc0e36
@@ -18,15 +18,10 @@ if [[ $(hyprctl -j monitors 2>/dev/null) == *'"LOCK"'* ]]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for (( attempt = 0; attempt < 50; attempt++ )); do
|
# Each kill stops the oldest matching instance and only returns once it has
|
||||||
quickshell kill -p "$CONFIG_DIR" --any-display >/dev/null 2>&1 || break
|
# fully exited, so the no-duplicate launch below can't race a dying shell.
|
||||||
sleep 0.1
|
# Requires our quickshell-git build; 0.3.0's kill returns immediately.
|
||||||
done
|
while timeout 5 quickshell kill -p "$CONFIG_DIR" --any-display >/dev/null 2>&1; do :; done
|
||||||
|
|
||||||
if (( attempt == 50 )); then
|
|
||||||
echo "Could not stop all Omarchy shell instances." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
setsid quickshell -n -p "$CONFIG_DIR" >/dev/null 2>&1 &
|
setsid quickshell -n -p "$CONFIG_DIR" >/dev/null 2>&1 &
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,15 @@ set -euo pipefail
|
|||||||
source "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)/base-test.sh"
|
source "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)/base-test.sh"
|
||||||
|
|
||||||
test_tmp=$(mktemp -d)
|
test_tmp=$(mktemp -d)
|
||||||
trap 'rm -rf "$test_tmp"' EXIT
|
restart_pid_one=""
|
||||||
|
restart_pid_two=""
|
||||||
|
|
||||||
|
cleanup() {
|
||||||
|
[[ -n $restart_pid_one ]] && kill "$restart_pid_one" 2>/dev/null || true
|
||||||
|
[[ -n $restart_pid_two ]] && kill "$restart_pid_two" 2>/dev/null || true
|
||||||
|
rm -rf "$test_tmp"
|
||||||
|
}
|
||||||
|
trap cleanup EXIT
|
||||||
|
|
||||||
wrapper_root="$test_tmp/wrapper-root"
|
wrapper_root="$test_tmp/wrapper-root"
|
||||||
wrapper_bin="$test_tmp/wrapper-bin"
|
wrapper_bin="$test_tmp/wrapper-bin"
|
||||||
@@ -74,7 +82,8 @@ case " $* " in
|
|||||||
*' kill -p '*)
|
*' kill -p '*)
|
||||||
pid=$(head -n 1 "$OMARCHY_TEST_QS_STATE")
|
pid=$(head -n 1 "$OMARCHY_TEST_QS_STATE")
|
||||||
[[ $pid =~ ^[0-9]+$ ]] || exit 1
|
[[ $pid =~ ^[0-9]+$ ]] || exit 1
|
||||||
printf 'stopped:%s\n' "$pid" >>"$OMARCHY_TEST_QS_LOG"
|
kill "$pid" 2>/dev/null
|
||||||
|
while kill -0 "$pid" 2>/dev/null; do sleep 0.01; done
|
||||||
awk 'NR > 1' "$OMARCHY_TEST_QS_STATE" >"$OMARCHY_TEST_QS_STATE.next"
|
awk 'NR > 1' "$OMARCHY_TEST_QS_STATE" >"$OMARCHY_TEST_QS_STATE.next"
|
||||||
mv "$OMARCHY_TEST_QS_STATE.next" "$OMARCHY_TEST_QS_STATE"
|
mv "$OMARCHY_TEST_QS_STATE.next" "$OMARCHY_TEST_QS_STATE"
|
||||||
;;
|
;;
|
||||||
@@ -98,7 +107,11 @@ SH
|
|||||||
|
|
||||||
chmod +x "$restart_bin/qs" "$restart_bin/quickshell" "$restart_bin/hyprctl"
|
chmod +x "$restart_bin/qs" "$restart_bin/quickshell" "$restart_bin/hyprctl"
|
||||||
|
|
||||||
printf '101\n202\n' >"$restart_state"
|
sleep 30 &
|
||||||
|
restart_pid_one=$!
|
||||||
|
sleep 30 &
|
||||||
|
restart_pid_two=$!
|
||||||
|
printf '%s\n%s\n' "$restart_pid_one" "$restart_pid_two" >"$restart_state"
|
||||||
|
|
||||||
PATH="$restart_bin:$PATH" \
|
PATH="$restart_bin:$PATH" \
|
||||||
OMARCHY_PATH="$restart_root" \
|
OMARCHY_PATH="$restart_root" \
|
||||||
@@ -108,8 +121,16 @@ OMARCHY_TEST_QS_LOG="$restart_log" \
|
|||||||
OMARCHY_TEST_IPC_LOG="$ipc_log" \
|
OMARCHY_TEST_IPC_LOG="$ipc_log" \
|
||||||
timeout 5 "$ROOT/bin/omarchy-restart-shell"
|
timeout 5 "$ROOT/bin/omarchy-restart-shell"
|
||||||
|
|
||||||
grep -F 'stopped:101' "$restart_log" >/dev/null || fail "restart stops the first matching shell instance"
|
if kill -0 "$restart_pid_one" 2>/dev/null; then
|
||||||
grep -F 'stopped:202' "$restart_log" >/dev/null || fail "restart stops duplicate matching shell instances"
|
fail "restart stops the first matching shell instance"
|
||||||
|
fi
|
||||||
|
if kill -0 "$restart_pid_two" 2>/dev/null; then
|
||||||
|
fail "restart stops duplicate matching shell instances"
|
||||||
|
fi
|
||||||
|
wait "$restart_pid_one" 2>/dev/null || true
|
||||||
|
wait "$restart_pid_two" 2>/dev/null || true
|
||||||
|
restart_pid_one=""
|
||||||
|
restart_pid_two=""
|
||||||
[[ $(<"$restart_state") == 303 ]] || fail "restart leaves exactly one fresh shell instance"
|
[[ $(<"$restart_state") == 303 ]] || fail "restart leaves exactly one fresh shell instance"
|
||||||
[[ $(grep -c '^-n -p ' "$restart_log") == 1 ]] || fail "restart launches one fresh shell process"
|
[[ $(grep -c '^-n -p ' "$restart_log") == 1 ]] || fail "restart launches one fresh shell process"
|
||||||
grep -F 'shell ping' "$ipc_log" >/dev/null || fail "restart waits for fresh shell IPC readiness"
|
grep -F 'shell ping' "$ipc_log" >/dev/null || fail "restart waits for fresh shell IPC readiness"
|
||||||
|
|||||||
Reference in New Issue
Block a user