#!/bin/bash # # Purpose : Show a GNOME notification when a newer CoreDesktop is available. # Clicking it (or its "Update now" button) runs update in a terminal. # Run by coredesktop-update-check.timer (see system/update-notify.sh). # Wrapped in { ...; exit; } so bash reads the whole script up front; update # replaces this file (git pull) while the notification is waiting for a click. { # The newest version the user has been told about. Dismissing a notification # means not hearing about that version again, only about a newer one. NOTIFIED="$HOME/.local/state/coredesktop/update-notified" latest="$("$HOME/.local/bin/version" --check)" || exit 0 [ "$(cat "$NOTIFIED" 2> /dev/null)" = "$latest" ] && exit 0 # Waits until the notification is clicked or dismissed, then prints the action # ("default" is a click on the notification itself, empty if dismissed) action="$(notify-send --wait \ --app-name=CoreDesktop \ --icon=software-update-available \ --action=default=Update \ --action=update="Update now" \ "CoreDesktop update available" \ "Version $latest is ready. Click to run update.")" || exit 0 mkdir -p "$(dirname "$NOTIFIED")" echo "$latest" > "$NOTIFIED" [ "$action" = "default" ] || [ "$action" = "update" ] || exit 0 # Open the first terminal found. bash -i reads ~/.bashrc, as if the user had # typed update themselves, and the window stays open to show how it went. run_update=(bash -ic 'update; echo; read -rp "Press Enter to close this window."') if command -v xdg-terminal-exec &> /dev/null; then terminal=(xdg-terminal-exec) elif command -v kgx &> /dev/null; then terminal=(kgx --) elif command -v ghostty &> /dev/null; then terminal=(ghostty -e) elif command -v kitty &> /dev/null; then terminal=(kitty) else notify-send --app-name=CoreDesktop "No terminal found" "Open a terminal and run update." exit 1 fi # Run the terminal as its own unit: when this service exits, systemd stops # everything still running in it, which would close the terminal mid-update exec systemd-run --user --quiet --collect -- "${terminal[@]}" "${run_update[@]}" }