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