summaryrefslogtreecommitdiff
path: root/dotfiles/system/.profile.d/arch-linux-downgrade.sh
blob: d97a2dc9d46c803e7b96aa0e53c5599fc761c2c3 (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
48
49
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
}