main dotfiles / bin / pacm
Eric Bower  ·  2026-07-11
 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] [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_install() {
19  xargs -a "$PKGFILE" sudo pacman -S --needed
20}
21
22do_clean() {
23  local pkgs
24  pkgs=$(comm -23 <(pacman -Qqn | sort) <(sort "$PKGFILE"))
25  if [[ -n "$pkgs" ]]; then
26    sudo pacman -Rsu $pkgs
27  fi
28}
29
30case "${1:-}" in
31init)
32  pacman -Qqen >"$PKGFILE"
33  ;;
34edit)
35  must_pkgfile
36  "$EDITOR" "$PKGFILE"
37  ;;
38install)
39  must_pkgfile
40  do_install
41  ;;
42clean)
43  must_pkgfile
44  do_clean
45  ;;
46sync)
47  must_pkgfile
48  do_clean
49  do_install
50  ;;
51*)
52  usage
53  exit 1
54  ;;
55esac
56
57# filetype: bash