summaryrefslogtreecommitdiff
path: root/dotfiles/system/.zshrc.d/arch-downgrade.sh
blob: f1d01a76939069a328b291f4afd46e2436e560af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# arch-downgrade.sh
# Craig Jennings <c@cjennings.net>
# Downgrade Arch packages with fzf (zsh only)

# Config:
#   export DG_HELPER=pacman   # or yay, paru, etc.
#   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:-}
    )"

    [[ $? -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
}