Replace --exec-arg with an ergonomic --exec that consumes the rest of the line as the click command. The caller's shell tokenizes the words into discrete arguments before the tool sees them, and the shell runs them as positional parameters (never a re-parsed string), so safety is identical to the argv form while the call sites read naturally: `--exec omarchy toggle something`. Crucially the tool never splits a string itself — a single quoted whole-command argument is rejected and points at the unquoted form, because whitespace- splitting a string hands argument boundaries to whoever controls its content (the injection we are avoiding). --exec must come last; migrate every caller.
61 lines
2.0 KiB
Bash
Executable File
61 lines
2.0 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# omarchy:summary=Notify the user when Omarchy has pending migrations
|
|
|
|
set -euo pipefail
|
|
|
|
update_in_progress() {
|
|
local lock="${XDG_RUNTIME_DIR:-}/omarchy-update.lock"
|
|
|
|
[[ -n ${XDG_RUNTIME_DIR:-} && -f $lock ]] || return 1
|
|
|
|
# flock -n only fails here when the lock is held, since the file is ours.
|
|
! flock -n "$lock" true 2>/dev/null
|
|
}
|
|
|
|
if update_in_progress; then
|
|
exit 0
|
|
fi
|
|
|
|
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
|
|
|
|
# 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
|
|
|
|
# That wait is long enough for an update to start underneath us, and the count
|
|
# above is already stale by then, so re-check before spending the toast.
|
|
if update_in_progress; then
|
|
exit 0
|
|
fi
|
|
|
|
# The shell keeps the click command with the toast, so this oneshot can hand the
|
|
# invitation over and exit instead of staying activated until it is answered.
|
|
omarchy-notification-send -u critical -g "Pending Omarchy Migrations" "$message" \
|
|
--exec omarchy-launch-floating-terminal-with-presentation omarchy-migrate && exit 0
|
|
|
|
# Reached when the notification could not be handed off, 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
|