#!/bin/sh # arch-linux-downgrade.sh # Craig Jennings # 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 }