main dotfiles / bin / pacm
Eric Bower  ·  2026-08-28
 1#!/usr/bin/env bash
 2set -euo pipefail
 3
 4PKGFILE="${2:-$HOME/.config/pacm/pkgfile.txt}"
 5
 6usage() {
 7  echo "usage: pacm [init|edit|install|clean|sync|missing] [pkgfile]" >&2
 8}
 9
10must_pkgfile() {
11  if ! test -e "$PKGFILE"; then
12    usage
13    echo "must provide pkgfile at $HOME/.config/pacm/pkgfile.txt or as an argument" >&2
14    exit 1
15  fi
16}
17
18do_missing() {
19  comm -23 <(sed '/^[[:space:]]*$/d' "$PKGFILE" | sort -u) <(pacman -Qq | sort)
20}
21
22do_install() {
23  local pkgs
24  pkgs=$(do_missing)
25  if [[ -n "$pkgs" ]]; then
26    sudo pacman -S --needed $pkgs
27  fi
28}
29
30do_clean() {
31  local pkgs
32  pkgs=$(comm -23 <(pacman -Qqn | sort) <(sort "$PKGFILE"))
33  if [[ -n "$pkgs" ]]; then
34    sudo pacman -Rsu $pkgs
35  fi
36}
37
38case "${1:-}" in
39init)
40  pacman -Qqen >"$PKGFILE"
41  ;;
42edit)
43  must_pkgfile
44  "$EDITOR" "$PKGFILE"
45  ;;
46install)
47  must_pkgfile
48  do_install
49  ;;
50clean)
51  must_pkgfile
52  do_clean
53  ;;
54sync)
55  must_pkgfile
56  do_install
57  do_clean
58  ;;
59missing)
60  must_pkgfile
61  do_missing
62  ;;
63*)
64  usage
65  exit 1
66  ;;
67esac
68
69# filetype: bash