summaryrefslogtreecommitdiff
path: root/packages.sh
blob: 88e4ec05f48b54dc44e1003a35bcdd733b60a992 (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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#!/usr/bin/env bash

# parse packages.txt
all=($(< packages.txt sed 's/#.*//' | xargs printf -- '%s\n' | sort -u))
grps=($(printf -- '%s\n' "${all[@]}" | sed -n 's/^g://p'))
pkgs=($(printf -- '%s\n' "${all[@]}" | sed -n 's/^p://p'))
excl=($(printf -- '%s\n' "${all[@]}" | sed -n 's/^x://p'))
bads=($(printf -- '%s\n' "${all[@]}" | grep -v '^[gpx]:'))
if [[ ${#bads[@]} -gt 0 ]]; then
	echo ' => Invalid entries in packages.txt'
	printf '  -> %s\n' "${bads[@]}"
	exit 1
fi

# set up tmpdir
tmpdir="$(mktemp --tmpdir -d "${0##*/}.XXXXXXXXXX")"
#trap "cd / && rm -rf -- $(printf '%q' "$tmpdir")" EXIT
cd "$tmpdir"

# list dependencies
{
	pacman -Sgq -- "${grps[@]}"|grep -vFx -f <(printf '%s\n' "${excl[@]}")
	printf '%s\n' "${pkgs[@]}"
} | sort -u > depends.txt
pacman -Qq | sort -u > installed.txt
pseudo() {
	while read -r pkg; do
		provider=$(pacsift --local --provides "$pkg" <&-|cut -d/ -f2)
		if [[ -n "$provider" ]]; then
			printf 'provided %s\n' "$pkg"
			printf 'provider %s\n' $provider # unquoted
		else
			printf 'missing %s\n' "$pkg"
		fi
	done
}
comm -23 depends.txt installed.txt | pseudo > missing-or-provided.txt
sed -n 's/^provided //p' <missing-or-provided.txt |sort -u>provided.txt
sed -n 's/^provider //p' <missing-or-provided.txt |sort -u>provider.txt
sed -n 's/^missing //p'  <missing-or-provided.txt |sort -u>missing.txt
cat installed.txt <(comm -12 depends.txt provider.txt)|sort -u>listed.txt

pacman -Qi|sed -n 's/^Depends On\s*://p'|xargs printf '%s\n'|sort -u>all-depends.txt

# output
echo ' => In packages.txt, but not installed'
< "$tmpdir/missing.txt" \
sed 's|^|  -> |' 

echo ' => Installed explicitly and not depended on, but not in packages.txt'
comm -23 \
     <(pacman -Qetq|sort -u) \
     "$tmpdir/listed.txt" |
sed 's|^|  -> |'

echo ' => Installed explicitly and only optionally depended on, but not in packages.txt'
comm -23 \
    <(comm -23 \
           <(pacman -Qettq|sort -u) \
	   <(pacman -Qetq |sort -u)) \
    "$tmpdir/listed.txt" |
sed 's|^|  -> |'

comm -13 depends.txt provider.txt

echo ' => Installed as dependencies, but only optionally depended on'
comm -23 \
     <(pacman -Qdttq|sort -u) \
     <(pacman -Qdtq |sort -u) |
sed 's|^|  -> |'

echo ' => Installed as dependencies, but not depended on'
pacman -Qdtq|sort -u|sed 's|^|  -> |'