diff options
| -rwxr-xr-x | dotfiles/system/.profile.d/arch-linux-downgrade.sh | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/dotfiles/system/.profile.d/arch-linux-downgrade.sh b/dotfiles/system/.profile.d/arch-linux-downgrade.sh new file mode 100755 index 0000000..d97a2dc --- /dev/null +++ b/dotfiles/system/.profile.d/arch-linux-downgrade.sh @@ -0,0 +1,50 @@ +#!/bin/sh + +# arch-linux-downgrade.sh +# Craig Jennings <c@cjennings.net> +# Downgrade an explicitly installed Arch package, chosen via fzf. + +# Config: +# export DG_HELPER=pacman # or yay, paru, etc. Must support -Qe, -Qi, -Si +# export DG_FZF_OPTS="..." # optional extra fzf flags + +dg() { + emulate -L zsh + set -u + set -o pipefail + + local helper="${DG_HELPER:-pacman}" + + # Check dependencies + for cmd in "$helper" fzf sudo downgrade awk sort; do + if ! command -v "${cmd%% *}" >/dev/null 2>&1; then + print -u2 -- "Missing dependency: $cmd" + return 1 + fi + done + + # List explicitly installed packages + local selection + selection="$( + "$helper" -Qe 2>/dev/null \ + | fzf --no-multi \ + --prompt="Pick package to downgrade > " \ + --height=80% \ + --reverse \ + --delimiter=' ' \ + --preview-window=right:60%:wrap \ + --preview "$helper -Qi {1} 2>/dev/null || $helper -Si {1}" \ + ${DG_FZF_OPTS:-} + )" + + # If fzf or pacman fails, just return + [[ $? -ne 0 || -z "$selection" ]] && return 0 + + local pkg + pkg="$(print -r -- "$selection" | head -n1 | awk '{print $1}')" + + if ! sudo downgrade "$pkg"; then + print -u2 -- "Downgrade failed for $pkg" + return 1 + fi +} |
