#!/bin/bash # ABOUTME: Moonarch system updater — updates packages and reconciles package lists. # ABOUTME: Shipped as /usr/bin/moonarch-update by the moonarch-git package. set -euo pipefail # --- i18n --- # Reuse pacman's gettext catalog for prompts that match upstream msgids. # For moonarch-specific strings fall back to _t() inline translation. export TEXTDOMAIN=pacman export TEXTDOMAINDIR=/usr/share/locale YN=$(gettext "[Y/n]") _t() { # _t "english" "deutsch" — picks by $LANG case "${LANG%%.*}" in de_*) printf '%s' "$2" ;; *) printf '%s' "$1" ;; esac } # --- Helper functions --- log() { echo -e "\e[1;34m[Moonarch]\e[0m $*" } err() { echo -e "\e[1;31m[Moonarch ERROR]\e[0m $*" >&2 } read_packages() { grep -v '^\s*#' "$1" | grep -v '^\s*$' } confirm() { read -r -p ":: $1 $YN " response [[ -z "$response" || "$response" =~ ^[yYjJ]$ ]] } OFFICIAL_PACKAGES="/usr/share/moonarch/official.txt" AUR_PACKAGES="/usr/share/moonarch/aur.txt" # --- Prerequisites --- if [[ $EUID -eq 0 ]]; then err "$(_t "Do NOT run as root. The script uses sudo where needed." "Nicht als root ausführen. Das Script verwendet sudo wo nötig.")" exit 1 fi # --- 1. Update system packages --- log "=== $(gettext $'Starting full system upgrade...\n' | tr -d '\n.') ===" if confirm "$(_t "Run pacman -Syu?" "pacman -Syu ausführen?")"; then sudo pacman -Syu else log "$(_t "System update skipped." "Systemaktualisierung übersprungen.")" fi if command -v paru &>/dev/null; then if confirm "$(_t "Update AUR packages (paru -Sua)?" "AUR-Pakete aktualisieren (paru -Sua)?")"; then paru -Sua else log "$(_t "AUR update skipped." "AUR-Aktualisierung übersprungen.")" fi fi # --- 2. Reconcile package lists --- log "=== $(_t "Reconcile package lists" "Paketlisten abgleichen") ===" if [[ -f "$OFFICIAL_PACKAGES" ]]; then MISSING_OFFICIAL=$(comm -23 <(read_packages "$OFFICIAL_PACKAGES" | sort) <(pacman -Qq | sort) || true) if [[ -n "$MISSING_OFFICIAL" ]]; then log "$(_t "Missing official packages:" "Fehlende offizielle Pakete:")" echo "$MISSING_OFFICIAL" if confirm "$(gettext 'Proceed with installation?')"; then # shellcheck disable=SC2086 sudo pacman -S --needed --noconfirm $MISSING_OFFICIAL fi else log "$(_t "All official packages installed." "Alle offiziellen Pakete installiert.")" fi fi if [[ -f "$AUR_PACKAGES" ]] && command -v paru &>/dev/null; then MISSING_AUR=$(comm -23 <(read_packages "$AUR_PACKAGES" | sort) <(pacman -Qq | sort) || true) if [[ -n "$MISSING_AUR" ]]; then log "$(_t "Missing AUR packages:" "Fehlende AUR-Pakete:")" echo "$MISSING_AUR" if confirm "$(gettext 'Proceed with installation?')"; then # shellcheck disable=SC2086 paru -S --needed --noconfirm $MISSING_AUR fi else log "$(_t "All AUR packages installed." "Alle AUR-Pakete installiert.")" fi fi # --- 3. Orphaned packages --- log "=== $(_t "Orphaned packages" "Verwaiste Pakete") ===" ORPHANS=$(pacman -Qdtq 2>/dev/null || true) if [[ -n "$ORPHANS" ]]; then log "$(_t "Orphaned packages found:" "Verwaiste Pakete gefunden:")" echo "$ORPHANS" if confirm "$(gettext 'Do you want to remove these packages?')"; then # shellcheck disable=SC2086 sudo pacman -Rsn --noconfirm $ORPHANS fi else log "$(_t "No orphaned packages." "Keine verwaisten Pakete.")" fi # --- Done --- log "" log "============================================" log " $(_t "Moonarch update complete!" "Moonarch-Aktualisierung abgeschlossen!")" log "============================================" # Keep terminal open when launched from a GUI (e.g. Waybar on-click) if [[ -t 0 ]]; then echo read -n 1 -s -r -p "$(_t "Press any key to close..." "Beliebige Taste drücken zum Schließen …")" fi