omarchy-migrate-notify.service is a Type=oneshot wanted by graphical-session.target, and systemd complements a target's Wants= with an implicit After=, so the target waited for the notifier to exit. The notifier does not exit quickly: it sends the notification through systemd-run --scope, which is synchronous, and omarchy-notification-send -a blocks until the user clicks. The target stayed in activating for as long as the toast was up. wayland-wm-app-daemon.service is After=graphical-session.target and nothing wants it, so uwsm-app starts it on demand. Clicking the notification runs omarchy-launch-floating-terminal-with-presentation, which execs uwsm-app, which blocks on a systemctl --user restart of that daemon -- a job queued behind the very target the clicked notifier was holding open. The terminal never opened; uwsm-app gave up on its own pipe timeout instead. Declaring After= on the wanted unit suppresses the implicit dependency rather than forming a cycle, so the target is reached without waiting and the notifier runs behind it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
42 lines
1.5 KiB
Bash
Executable File
42 lines
1.5 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# omarchy:summary=Notify the user when Omarchy has pending migrations
|
|
|
|
set -euo pipefail
|
|
|
|
pending_migrations=$(omarchy-migrate --pending 2>/dev/null) || exit 0
|
|
pending_count=$(printf '%s\n' "$pending_migrations" | sed '/^[[:space:]]*$/d' | wc -l)
|
|
|
|
if (( pending_count == 1 )); then
|
|
message="Click to run 1 pending migration."
|
|
else
|
|
message="Click to run $pending_count pending migrations."
|
|
fi
|
|
|
|
notify_command=$(printf 'if [[ -n $(omarchy-notification-send -u critical -g "Pending Omarchy Migrations" %q -a) ]]; then omarchy-launch-floating-terminal-with-presentation omarchy-migrate; fi' "$message")
|
|
|
|
# This runs from omarchy-migrate-notify.service after graphical-session.target,
|
|
# but the target can be reached before the shell has claimed
|
|
# org.freedesktop.Notifications. Without the wait the toast is sent into the
|
|
# void and the user never learns about their pending migrations.
|
|
omarchy-notification-wait || true
|
|
|
|
unit="omarchy-migrations-notification-$(date +%Y%m%d%H%M%S)"
|
|
systemd-run --user --scope --unit="$unit" bash -lc "$notify_command" >/dev/null 2>&1 && exit 0
|
|
|
|
# Reached when there is no user manager to run the scope under, such as a
|
|
# non-graphical shell, so fall back to telling the user in the terminal.
|
|
print_pending_migrations() {
|
|
echo "Omarchy has pending migrations. Run omarchy-migrate in a terminal to apply them:"
|
|
while IFS= read -r migration; do
|
|
[[ -n $migration ]] || continue
|
|
printf ' %s\n' "$migration"
|
|
done <<<"$pending_migrations"
|
|
}
|
|
|
|
if [[ -t 1 ]]; then
|
|
print_pending_migrations
|
|
else
|
|
print_pending_migrations >&2
|
|
fi
|