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