diff --git a/PKGBUILD b/PKGBUILD index f2621a1..3e564b8 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -25,6 +25,7 @@ package() cd "$srcdir"/"$pkgname" install -Dm755 "$pkgname" "$pkgdir"/usr/bin/"$pkgname" install -Dm644 "$pkgname".service "$pkgdir"/usr/lib/systemd/user/"$pkgname".service + install -Dm644 "$pkgname"-quiet.service "$pkgdir"/usr/lib/systemd/user/"$pkgname"-quiet.service install -Dm644 "$pkgname".timer "$pkgdir"/usr/lib/systemd/user/"$pkgname".timer install -Dm644 "$pkgname".path "$pkgdir"/usr/lib/systemd/user/"$pkgname".path install -Dm755 "$pkgname"-refresh "$pkgdir"/usr/lib/"$pkgname"/refresh diff --git a/README.md b/README.md index accfdb0..1ecaa0e 100644 --- a/README.md +++ b/README.md @@ -43,11 +43,11 @@ systemctl --user enable --now update-notify.timer The timer runs 5 minutes after boot, then every 6 hours. -A pacman hook also runs update-notify after every pacman transaction, for each logged-in user whose timer is active, so the notification and the status bar file are current right after an upgrade. +A pacman hook also runs `update-notify --quiet` after every pacman transaction, for each logged-in user whose timer is active, so the status bar file is current right after an upgrade. ### Refresh after building packages -Building into a local repository (`aur build`, `aur sync`) doesn't run pacman, so the hook can't catch it. To run update-notify whenever a repository changes, add the repository files to watch to `update-notify.path`: +Building into a local repository (`aur build`, `aur sync`) doesn't run pacman, so the hook can't catch it. To run `update-notify --quiet` whenever a repository changes, add the repository files to watch to `update-notify.path`: ``` systemctl --user edit update-notify.path @@ -68,11 +68,13 @@ systemctl --user enable --now update-notify.path ## Usage ``` -update-notify [threshold] +update-notify [-q|--quiet] [threshold] ``` `threshold` is the minimum number of updates (repo + AUR) before update counts are shown. It overrides the `THRESHOLD` setting below for that run's notification only; the pending file keeps the configured value. +`--quiet` updates the pending file without notifying. Changes to a notification already shown are recorded, so the next timer run doesn't repeat them; a new notification is left for the timer. The pacman hook and `update-notify.path` use it (through `update-notify-quiet.service`), so building or upgrading many packages doesn't notify after each one. + ## Configuration Settings are read from `$XDG_CONFIG_HOME/update-notify/config` (default `~/.config/update-notify/config`), a bash file that is sourced by the script. All settings are optional: diff --git a/update-notify b/update-notify index e747326..51d9120 100755 --- a/update-notify +++ b/update-notify @@ -19,6 +19,11 @@ if [[ -r $config_file ]]; then # shellcheck source=/dev/null source "$config_file" fi +quiet=0 # refresh the pending file without notifying (path unit and pacman hook) +if [[ ${1:-} == -q || ${1:-} == --quiet ]]; then + quiet=1 + shift +fi config_threshold=$THRESHOLD # written to the pending file, so a one-off argument doesn't change status bars THRESHOLD=${1:-$THRESHOLD} @@ -44,6 +49,12 @@ notify_once() { if [[ -f $file && $(<"$file") == "$body" ]]; then return 0 fi + if (( quiet )); then + # Track changes to a shown notification, so the timer doesn't re-notify them; + # leave a new one for the timer to show + [[ -f $file ]] && printf '%s' "$body" > "$file" + return 0 + fi notify-send "$title" "$body" && printf '%s' "$body" > "$file" } diff --git a/update-notify-quiet.service b/update-notify-quiet.service new file mode 100644 index 0000000..d6c8032 --- /dev/null +++ b/update-notify-quiet.service @@ -0,0 +1,6 @@ +[Unit] +Description=Refresh the update-notify pending file without notifying + +[Service] +ExecStart=/usr/bin/update-notify --quiet +Type=oneshot diff --git a/update-notify-refresh b/update-notify-refresh index bc34b0a..f0cbf1d 100755 --- a/update-notify-refresh +++ b/update-notify-refresh @@ -6,5 +6,5 @@ while read -r unit _; do uid=${uid%.service} user=$(id -nu "$uid") || continue systemctl --user -M "$user@" is-active --quiet update-notify.timer || continue - systemctl --user -M "$user@" start --no-block update-notify.service + systemctl --user -M "$user@" start --no-block update-notify-quiet.service done diff --git a/update-notify.path b/update-notify.path index 3734883..76ea414 100644 --- a/update-notify.path +++ b/update-notify.path @@ -4,7 +4,7 @@ Description=Run update-notify when a local repository changes # Add the repository files to watch with: systemctl --user edit update-notify.path # e.g. PathChanged=/home/aur-local/aur-local.db.tar.gz.sig [Path] -Unit=update-notify.service +Unit=update-notify-quiet.service [Install] WantedBy=default.target