From 3305f5a5438e06f5dc0ae61e17922cfb3d85467b Mon Sep 17 00:00:00 2001 From: Hannes Date: Sat, 22 Aug 2026 23:13:18 +0200 Subject: [PATCH] feat: Update updateall script Updated updateall to include comprehensive test coverage, support for Vencord, and improved output formatting. --- configs/arch_config.fish | 530 +++++++++++++++++++++++++++++++++------ 1 file changed, 450 insertions(+), 80 deletions(-) diff --git a/configs/arch_config.fish b/configs/arch_config.fish index 1c87df5..eea7411 100755 --- a/configs/arch_config.fish +++ b/configs/arch_config.fish @@ -4,6 +4,10 @@ source $HOME/.config/fish/configs/uni.fish +# ------------------------------------------------------------------------------ +# Helpers +# ------------------------------------------------------------------------------ + function get_pkg_version set pkg $argv[1] @@ -28,106 +32,472 @@ function kernel_to_pkg end end +# Print a colored section header (cyan) +function _print_section + set -l title $argv[1] + set_color cyan + echo "#### $title ####" + set_color normal +end + +# ------------------------------------------------------------------------------ +# Main: updateall +# Orchestrates system + dotfiles updates with: +# - suppression when up-to-date (short "up to date" line) +# - full output when updates exist (do NOT suppress) +# - per-component summary at the end (git ones are important) +# - --vencord / -v flag gates all discord/vencord queries +# - AUR diff is mandatory (cannot be skipped) +# +# Order (readability): +# 1) Flags / summary init / version snapshot +# 2) System packages: pacman -> AUR -> flatpak +# 3) Dotfiles: git (quickshell/fish/hypr/matugen) +# 4) Optional: discord/vencord (only if --vencord) +# 5) Kernel reboot prompt +# 6) Summary +# ------------------------------------------------------------------------------ + function updateall -######## Get current versions (if installed) - if command -q discord + # ---- 1) Flags ---- + set -l _do_vencord 0 + argparse --name=updateall 'v/vencord' 'h/help' -- $argv + or return 1 + if set -q _flag_help + echo "Usage: updateall [--vencord] [-h/--help]" + echo " --vencord, -v also (re)install/update Vencord when Discord changes or force when up to date" + echo " -h, --help show this help" + return 0 + end + if set -q _flag_vencord + set _do_vencord 1 + end + if test (count $argv) -gt 0 + echo "updateall: unknown argument: $argv" >&2 + return 1 + end + + # Summary tracking - parallel arrays: labels / status / color + set -l _labels + set -l _status + set -l _colors + + # Version snapshot (discord only if --vencord, per request) + set -l discord_version "" + if test $_do_vencord -eq 1; and type -q discord set discord_version (get_pkg_version discord) end - set kernel_version (get_pkg_version (kernel_to_pkg)) + set -l kernel_version (get_pkg_version (kernel_to_pkg)) -######## Run PACMAN updates - set_color cyan - echo "#### Updating pacman ####" - set_color normal - sudo pacman -Syu + # ---------------------------------------------------------------------- + # 2) System packages + # ---------------------------------------------------------------------- -######## Do additional Discord Updates - if command -q discord; and test "$discord_version" != "$(get_pkg_version discord)" - set_color cyan - echo "Discord version changed: $discord_version -> $(get_pkg_version discord)" - set_color normal - if test -e /usr/bin/curl - echo "Running Vencord installer..." - sh -c "$(curl -sS https://raw.githubusercontent.com/Vendicated/VencordInstaller/main/install.sh)" + # ---- pacman (core) ---- + _print_section "Updating pacman" + set -l pacman_status "skipped" + set -l pacman_color yellow + if type -q pacman + set -l has_updates 1 + set -l qu_output "" + if type -q checkupdates + set qu_output (checkupdates 2>&1) + if test $status -eq 0 -a -n "$qu_output" + set has_updates 0 + else if string match -q "*ERROR*Failed to synchronize*" "$qu_output" + set has_updates 0 + end else - echo "'curl' is not installed. Install it to update Discord plugins." + set qu_output (pacman -Qu 2>&1) + if test $status -eq 0 + set has_updates 0 + else if string match -q "*database*" "$qu_output" + set has_updates 0 + end + end + + if test $has_updates -eq 1 + echo "pacman: up to date" + set pacman_status "up to date" + set pacman_color green + else + if test -n "$qu_output" + echo "Pending pacman updates:" + printf "%s\n" $qu_output + end + sudo pacman -Syu + set -l pacman_code $status + if test $pacman_code -eq 0 + set pacman_status "updated" + set pacman_color green + else + set pacman_status "failed ($pacman_code)" + set pacman_color red + end + end + else + echo "pacman not found, skipping" + set pacman_status "not installed" + set pacman_color yellow + end + set -a _labels "pacman" + set -a _status $pacman_status + set -a _colors $pacman_color + + # ---- AUR (paru/yay) - directly after pacman, mandatory diff ---- + _print_section "Updating AUR" + set -l aur_status "skipped" + set -l aur_color yellow + set -l aur_helper "" + if type -q paru + set aur_helper paru + else if type -q yay + set aur_helper yay + end + + if test -n "$aur_helper" + set -l aur_qu ($aur_helper -Qua 2>&1) + set -l aur_qu_code $status + if test $aur_qu_code -ne 0; or test -z "$aur_qu" + if string match -q "*there is nothing to do*" "$aur_qu"; or string match -q "*No AUR*" "$aur_qu"; or test -z "$aur_qu" + echo "AUR: up to date" + set aur_status "up to date" + set aur_color green + else + # Fallback: assume updates, but still enforce review + echo "Failed to check for AUR updates:" + echo "" + set_color yellow + echo "==> AUR PKGBUILD review is MANDATORY - diff cannot be skipped." + echo " Note: PKGBUILDs must NEVER contain 'sudo'. Please verify diffs contain no 'sudo'." + set_color normal + set answer "" + read -P "Update now? [y/N]: " answer + if test "$answer" = "y" -o "$answer" = "Y" + if test "$aur_helper" = "paru" + paru -Sua --sudoloop --review + else + yay -Sua --sudoloop --diffmenu --answerdiff All --answerclean All + end + set -l _aur_code $status + if test $_aur_code -eq 0 + set aur_status "updated" + set aur_color green + else + set aur_status "failed ($_aur_code)" + set aur_color red + end + end + end + else + echo "Pending AUR updates:" + printf "%s\n" $aur_qu + set_color yellow + echo "==> AUR PKGBUILD review is MANDATORY - diff cannot be skipped." + echo " Note: PKGBUILDs must NEVER contain 'sudo'. Please verify diffs contain no 'sudo'." + set_color normal + set answer "" + read -P "Update now? [y/N]: " answer + if test "$answer" = "y" -o "$answer" = "Y" + if test "$aur_helper" = "paru" + paru -Sua --sudoloop --review + else + yay -Sua --sudoloop --diffmenu --answerdiff All --answerclean All + end + set -l _aur_code $status + if test $_aur_code -eq 0 + set aur_status "updated" + set aur_color green + else + set aur_status "failed ($_aur_code)" + set aur_color red + end + end + + end + else + echo "No AUR helper (paru/yay) found, skipping" + set aur_status "no helper" + set aur_color yellow + end + set -a _labels "AUR" + set -a _status $aur_status + set -a _colors $aur_color + + # ---- flatpak ---- + _print_section "Updating flatpak" + set -l flatpak_status "skipped" + set -l flatpak_color yellow + if type -q flatpak + set -l flatpak_has_updates 0 + set -l flatpak_check (flatpak remote-ls --updates 2>&1) + set -l flatpak_check_code $status + if test $flatpak_check_code -eq 0 + if test -z "$flatpak_check" + set flatpak_has_updates 1 + end + else + set flatpak_has_updates 0 + end + + if test $flatpak_has_updates -eq 1 + echo "flatpak: up to date" + set flatpak_status "up to date" + set flatpak_color green + else + if test -n "$flatpak_check" + echo "Pending flatpak updates:" + printf "%s\n" $flatpak_check + end + flatpak update + set -l flatpak_code $status + if test $flatpak_code -eq 0 + set -l flatpak_recheck (flatpak remote-ls --updates 2>&1) + if test -z "$flatpak_recheck" + if test $flatpak_has_updates -eq 0 + set flatpak_status "updated" + else + set flatpak_status "up to date" + end + else + set flatpak_status "updated" + end + set flatpak_color green + else + set flatpak_status "failed ($flatpak_code)" + set flatpak_color red + end + end + else + set flatpak_status "not installed" + set flatpak_color yellow + end + set -a _labels "flatpak" + set -a _status $flatpak_status + set -a _colors $flatpak_color + + # ---------------------------------------------------------------------- + # 3) Dotfiles (git) - always show per-repo success/fail, suppress only when up to date + # ---------------------------------------------------------------------- + set -l git_repos "quickshell:$HOME/.config/quickshell" "fish:$HOME/.config/fish" "hypr:$HOME/.config/hypr" "matugen:$HOME/.config/matugen" + + if not type -q git + echo "git not installed" + set git_status "git not installed" + set git_color yellow + set -a _labels "git" + set -a _status $git_status + set -a _colors $git_color + else + for entry in $git_repos + set -l parts (string split ":" -- $entry) + set -l name $parts[1] + set -l path $parts[2] + _print_section "Updating $name" + set -l git_status "skipped" + set -l git_color yellow + + if not test -d $path/.git + echo "skipped: $path not a git repo" + set git_status "not tracked" + set git_color yellow + else + git -C $path fetch --quiet >/dev/null 2>&1 + set -l fetch_code $status + set -l behind_str (git -C $path rev-list --count HEAD..@{u} 2>&1) + set -l behind_code $status + if test $fetch_code -ne 0 -o $behind_code -ne 0 + set -l git_output (git -C $path pull 2>&1) + set -l git_code $status + if test $git_code -ne 0 + printf "%s\n" $git_output + set git_status "failed ($git_code)" + set git_color red + else if string match -q "*Already up to date*" "$git_output" + echo "$name: up to date" + set git_status "up to date" + set git_color green + else + printf "%s\n" $git_output + set git_status "updated" + set git_color green + end + else if test "$behind_str" = "0" + echo "$name: up to date" + set git_status "up to date" + set git_color green + else + git -C $path pull + set -l pull_code $status + if test $pull_code -eq 0 + set git_status "updated" + set git_color green + else + set git_status "failed ($pull_code)" + set git_color red + end + end + end + set -a _labels "git:$name" + set -a _status $git_status + set -a _colors $git_color end end -######## Run FLATPAK Updates + # ---------------------------------------------------------------------- + # 4) Optional: Discord / Vencord (only when --vencord) + # ---------------------------------------------------------------------- + set -l discord_status "skipped" + set -l discord_color yellow + set -l vencord_status "skipped" + set -l vencord_color yellow + set -l _need_vencord_label 0 + if test $_do_vencord -eq 0 + set discord_status "skipped (use --vencord)" + set discord_color yellow + set vencord_status "skipped (use --vencord)" + set vencord_color yellow + else if type -q discord + set -l new_discord_version (get_pkg_version discord) + if test "$discord_version" != "$new_discord_version" + set_color cyan + echo "Discord version changed: $discord_version -> $new_discord_version" + set_color normal + set discord_status "updated ($new_discord_version)" + set discord_color green + if test $_do_vencord -eq 1 + set _need_vencord_label 1 + if type -q curl + echo "Running Vencord installer (--vencord)..." + sh -c "$(curl -sS https://raw.githubusercontent.com/Vendicated/VencordInstaller/main/install.sh)" + if test $status -eq 0 + set vencord_status "updated ($new_discord_version)" + set vencord_color green + set discord_status "$discord_status + vencord ok" + else + set vencord_status "failed ($status)" + set vencord_color red + set discord_status "$discord_status + vencord failed" + set discord_color red + end + else + echo "'curl' is not installed. Install it to update Discord plugins." + set vencord_status "curl missing" + set vencord_color yellow + set discord_status "$discord_status + vencord skipped (curl missing)" + set discord_color yellow + end + else + set vencord_status "skipped (discord updated, use --vencord)" + set vencord_color yellow + echo "Discord updated, skipping Vencord (use --vencord to update)" + end + else + set discord_status "up to date ($new_discord_version)" + set discord_color green + if test $_do_vencord -eq 1 + set _need_vencord_label 1 + set_color cyan + echo "Discord up to date ($new_discord_version), but --vencord given: running Vencord installer..." + set_color normal + if type -q curl + sh -c "$(curl -sS https://raw.githubusercontent.com/Vendicated/VencordInstaller/main/install.sh)" + if test $status -eq 0 + set vencord_status "refreshed/updated" + set vencord_color green + set discord_status "$discord_status + vencord ok" + else + set vencord_status "failed ($status)" + set vencord_color red + set discord_status "$discord_status + vencord failed" + end + else + echo "'curl' is not installed. Install it to update Discord plugins." + set vencord_status "curl missing" + set vencord_color yellow + end + else + set vencord_status "skipped (use --vencord)" + set vencord_color yellow + end + end + else + set discord_status "not installed" + set discord_color yellow + if test $_do_vencord -eq 1 + set _need_vencord_label 1 + set vencord_status "skipped (discord not installed)" + set vencord_color yellow + echo "Discord not installed, skipping Vencord" + end + end + set -a _labels "discord" + set -a _status $discord_status + set -a _colors $discord_color + if test $_do_vencord -eq 1 + set -a _labels "vencord" + set -a _status $vencord_status + set -a _colors $vencord_color + end - if test -e /usr/bin/flatpak + # ---------------------------------------------------------------------- + # 5) Kernel (needs reboot if package changed) + # ---------------------------------------------------------------------- + set -l kernel_status "up to date" + set -l kernel_color green + set -l new_kernel_version (get_pkg_version (kernel_to_pkg)) + if test "$kernel_version" != "$new_kernel_version" set_color cyan - echo "#### Updating flatpak ####" + echo "Kernel changed: $kernel_version -> $new_kernel_version" set_color normal - flatpak update - end - -######## Run GIT Updates - - set_color cyan - echo "#### Updating quickshell ####" - set_color normal - if test -d ~/.config/quickshell && test -d ~/.config/quickshell/.git - pushd ~/.config/quickshell/ - git pull - popd - end - - set_color cyan - echo "#### Updating fish ####" - set_color normal - if test -d ~/.config/fish && test -d ~/.config/fish/.git - pushd ~/.config/fish/ - git pull - popd - end - - set_color cyan - echo "#### Updating hyprland ####" - set_color normal - if test -d ~/.config/hypr && test -d ~/.config/hypr/.git - pushd ~/.config/hypr/ - git pull - popd - end - - set_color cyan - echo "#### Updating matugen ####" - set_color normal - if test -d ~/.config/matugen && test -d ~/.config/matugen/.git - pushd ~/.config/matugen/ - git pull - popd - end - -######## Run AUR Updates - - set_color cyan - echo "#### Updating AUR ####" - set_color normal - if test -e /usr/bin/paru - paru -Sua --sudoloop - else if test -e /usr/bin/yay - yay -Sua --sudoloop - end - -######## Restart if Kernel Updated - - if test "$kernel_version" != "$(get_pkg_version $(kernel_to_pkg))" - set_color cyan - echo "Kernel changed: $kernel_version -> $(get_pkg_version $(kernel_to_pkg))" + set kernel_status "updated ($kernel_version -> $new_kernel_version)" + set kernel_color green + set answer "" read -P "Reboot now? [y/N]: " answer - set_color normal - if test "$answer" = "y" -o "$answer" = "Y" reboot else echo "Skipping reboot." + set kernel_status "$kernel_status (reboot skipped)" + end + else + set kernel_status "up to date ($new_kernel_version)" + set kernel_color green + end + set -a _labels "kernel" + set -a _status $kernel_status + set -a _colors $kernel_color + + # ---------------------------------------------------------------------- + # 6) Summary (always shown, per-component success/fail) + # ---------------------------------------------------------------------- + echo "" + set_color --bold cyan + echo "#### Update Summary ####" + set_color normal + set -l max_len 0 + for l in $_labels + if test (string length -- $l) -gt $max_len + set max_len (string length -- $l) end end + for i in (seq (count $_labels)) + set -l label $_labels[$i] + set -l stat $_status[$i] + set -l col $_colors[$i] + set -l pad (string repeat -n (math $max_len - (string length -- $label)) " ") + set_color normal + printf "%s%s : " $label $pad + set_color $col + echo $stat + set_color normal + end end +# ------------------------------------------------------------------------------ +# Aliases & small utilities (kept after main for readability) +# ------------------------------------------------------------------------------ + alias fixpacman='sudo rm -f /var/lib/pacman/db.lck' if test -e /usr/bin/expac @@ -193,4 +563,4 @@ function pacman-autoremove else echo "No orphaned packages." end -end \ No newline at end of file +end