* Add a theme-set sample hook that mirrors themes to herdr machines Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Mirror theme changes to herdr machines by default Replaces the sample hook with omarchy-theme-sync, which omarchy-theme-set starts detached after every theme change, and a theme-sync-off toggle that stops a machine from both sending and receiving. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Rename omarchy-theme-sync to omarchy-theme-set-herdr-machines Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Label the toggle Herdr Theme Sync and extract its menu guard Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Answer the Herdr Theme Sync menu guard from omarchy-theme-set-herdr-machines Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sync herdr machines one at a time and drop the dry run Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Check the theme sync toggle under the lock and stop special-casing this machine Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Make herdr theme sync opt-in Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
169 lines
6.2 KiB
Bash
169 lines
6.2 KiB
Bash
#!/bin/bash
|
|
|
|
set -euo pipefail
|
|
|
|
source "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)/base-test.sh"
|
|
|
|
require_command jq
|
|
|
|
SYNC_TEST=$(mktemp -d)
|
|
trap 'rm -rf "$SYNC_TEST"' EXIT
|
|
export SYNC_TEST
|
|
|
|
local_home="$SYNC_TEST/home"
|
|
stub_bin="$SYNC_TEST/bin"
|
|
remote_bin="$SYNC_TEST/remote-bin"
|
|
mkdir -p "$local_home/.local/state/omarchy/current" "$stub_bin" "$remote_bin" "$SYNC_TEST/run"
|
|
|
|
# herdr lists one unreachable machine first, this machine, and a disabled one.
|
|
cat >"$stub_bin/herdr" <<'EOF'
|
|
#!/bin/bash
|
|
printf '%s\t%s\t%s\t%s\t%s\n' \
|
|
1 down down default enabled \
|
|
2 alpha alpha default enabled \
|
|
3 beta beta default enabled \
|
|
4 gamma gamma default enabled \
|
|
5 local-box local-box default enabled \
|
|
6 retired retired default disabled
|
|
EOF
|
|
|
|
cat >"$stub_bin/hostname" <<'EOF'
|
|
#!/bin/bash
|
|
echo local-box
|
|
EOF
|
|
|
|
# ssh runs the script it receives against a fake home for that machine, as the remote would.
|
|
cat >"$stub_bin/ssh" <<'EOF'
|
|
#!/bin/bash
|
|
while [[ $1 == "-o" ]]; do
|
|
shift 2
|
|
done
|
|
target=$1
|
|
echo "$target" >>"$SYNC_TEST/ssh-calls"
|
|
remote="$SYNC_TEST/remotes/$target"
|
|
if [[ ! -d $remote ]]; then
|
|
echo "ssh: connect to host $target port 22: Connection refused" >&2
|
|
exit 255
|
|
fi
|
|
HOME="$remote" PATH="$SYNC_TEST/remote-bin:/usr/bin:/bin" bash -s
|
|
EOF
|
|
|
|
cat >"$remote_bin/omarchy" <<'EOF'
|
|
#!/bin/bash
|
|
echo "$* from=$OMARCHY_THEME_SYNC_FROM session=$WAYLAND_DISPLAY" >>"$HOME/set.log"
|
|
EOF
|
|
|
|
cat >"$remote_bin/hyprctl" <<'EOF'
|
|
#!/bin/bash
|
|
echo '[{"instance":"old","time":1,"wl_socket":"wayland-0"},{"instance":"live","time":2,"wl_socket":"wayland-1"}]'
|
|
EOF
|
|
|
|
chmod +x "$stub_bin"/* "$remote_bin"/*
|
|
|
|
reset_remotes() {
|
|
rm -rf "$SYNC_TEST/remotes" "$SYNC_TEST/ssh-calls"
|
|
local machine
|
|
for machine in alpha beta gamma local-box; do
|
|
mkdir -p "$SYNC_TEST/remotes/$machine/.local/state/omarchy/current"
|
|
echo "tokyo-night" >"$SYNC_TEST/remotes/$machine/.local/state/omarchy/current/theme.name"
|
|
mkdir -p "$SYNC_TEST/remotes/$machine/.local/state/omarchy/toggles"
|
|
touch "$SYNC_TEST/remotes/$machine/.local/state/omarchy/toggles/herdr-theme-sync"
|
|
done
|
|
}
|
|
|
|
local_toggle="$local_home/.local/state/omarchy/toggles/herdr-theme-sync"
|
|
|
|
set_local_theme() {
|
|
echo "$1" >"$local_home/.local/state/omarchy/current/theme.name"
|
|
}
|
|
|
|
run_sync() {
|
|
HOME="$local_home" XDG_RUNTIME_DIR="$SYNC_TEST/run" PATH="$stub_bin:$ROOT/bin:$PATH" omarchy-theme-set-herdr-machines "$@"
|
|
}
|
|
|
|
set_log() {
|
|
cat "$SYNC_TEST/remotes/$1/set.log" 2>/dev/null || true
|
|
}
|
|
|
|
# Sync is off until it is turned on.
|
|
reset_remotes
|
|
set_local_theme lumon
|
|
run_sync >/dev/null
|
|
[[ ! -e $SYNC_TEST/ssh-calls ]] || fail "theme sync is off by default"
|
|
pass "theme sync is off by default"
|
|
mkdir -p "${local_toggle%/*}"
|
|
touch "$local_toggle"
|
|
|
|
# Syncs every enabled machine except this one, skipping machines already on the theme.
|
|
reset_remotes
|
|
set_local_theme lumon
|
|
echo "lumon" >"$SYNC_TEST/remotes/beta/.local/state/omarchy/current/theme.name"
|
|
echo "lumon" >"$SYNC_TEST/remotes/local-box/.local/state/omarchy/current/theme.name"
|
|
output=$(run_sync)
|
|
[[ $(set_log alpha) == "theme set lumon from=local-box session=wayland-1" ]] || fail "sets the theme inside the newest Hyprland session"
|
|
pass "sets the theme inside the newest Hyprland session"
|
|
[[ -z $(set_log beta) && $output == *"beta: already on lumon"* ]] || fail "skips a machine already on the theme"
|
|
pass "skips a machine already on the theme"
|
|
! grep -qx retired "$SYNC_TEST/ssh-calls" || fail "skips disabled machines"
|
|
pass "skips disabled machines"
|
|
[[ -z $(set_log local-box) && $output == *"local-box: already on lumon"* ]] || fail "leaves this machine alone when it is listed"
|
|
pass "leaves this machine alone when it is listed"
|
|
[[ $output == *"down: ssh: connect to host down"* ]] || fail "logs an unreachable machine"
|
|
pass "logs an unreachable machine"
|
|
|
|
# Connects one machine at a time, so an SSH agent asks for approval at most once.
|
|
[[ $(paste -sd ' ' "$SYNC_TEST/ssh-calls") == "down alpha beta gamma local-box" ]] || fail "connects to machines one at a time in order"
|
|
pass "connects to machines one at a time in order"
|
|
|
|
# A machine with the toggle off refuses themes from other machines.
|
|
reset_remotes
|
|
rm "$SYNC_TEST/remotes/gamma/.local/state/omarchy/toggles/herdr-theme-sync"
|
|
output=$(run_sync)
|
|
[[ -z $(set_log gamma) && $output == *"gamma: theme sync is off"* ]] || fail "a remote with theme sync off keeps its theme"
|
|
pass "a remote with theme sync off keeps its theme"
|
|
|
|
# A machine with the toggle off sends nothing.
|
|
reset_remotes
|
|
rm "$local_toggle"
|
|
run_sync >/dev/null
|
|
[[ ! -e $SYNC_TEST/ssh-calls ]] || fail "theme sync off stops sending"
|
|
pass "theme sync off stops sending"
|
|
touch "$local_toggle"
|
|
|
|
# Turning sync off also stops a run that is still waiting for an earlier one to finish.
|
|
reset_remotes
|
|
exec 8>"$SYNC_TEST/run/omarchy-theme-set-herdr-machines.lock"
|
|
flock 8
|
|
run_sync >/dev/null &
|
|
queued=$!
|
|
sleep 0.5
|
|
rm "$local_toggle"
|
|
flock -u 8
|
|
wait $queued
|
|
[[ ! -e $SYNC_TEST/ssh-calls ]] || fail "turning sync off stops a queued run"
|
|
pass "turning sync off stops a queued run"
|
|
touch "$local_toggle"
|
|
|
|
# A theme that arrived from another machine is never sent on.
|
|
reset_remotes
|
|
OMARCHY_THEME_SYNC_FROM=elsewhere run_sync >/dev/null
|
|
[[ ! -e $SYNC_TEST/ssh-calls ]] || fail "a mirrored theme change is not mirrored again"
|
|
pass "a mirrored theme change is not mirrored again"
|
|
|
|
# The theme name reaches the remote as data, never as shell code.
|
|
reset_remotes
|
|
set_local_theme 'demo$(touch "$HOME/injected")'
|
|
run_sync >/dev/null
|
|
[[ ! -e $SYNC_TEST/remotes/alpha/injected ]] || fail "a theme name cannot run commands on the remote"
|
|
[[ $(set_log alpha) == 'theme set demo$(touch "$HOME/injected") from=local-box session=wayland-1' ]] || fail "a theme name reaches the remote verbatim"
|
|
pass "a theme name reaches the remote verbatim without running commands"
|
|
|
|
# The menu shows Herdr Theme Sync whenever herdr has an enabled machine, with sync on or off,
|
|
# so the toggle is there to turn it on.
|
|
rm "$local_toggle"
|
|
run_sync --available || fail "an enabled herdr machine makes theme sync available"
|
|
pass "an enabled herdr machine makes theme sync available while it is off"
|
|
printf '#!/bin/bash\nprintf "1\\tretired\\tretired\\tdefault\\tdisabled\\n"\n' >"$stub_bin/herdr"
|
|
! run_sync --available || fail "only disabled herdr machines make theme sync unavailable"
|
|
pass "only disabled herdr machines make theme sync unavailable"
|