856062b0a61d0c8546d609402b6352e6cdf55f8a
[shellsnippets/shellsnippets.git] / mksh / sysadmin / showlcl.sh
1 #!/bin/mksh
2 # -*- mode: sh -*-
3 #-
4 # Copyright © 2019
5 #       mirabilos <t.glaser@tarent.de>
6 #
7 # Provided that these terms and disclaimer and all copyright notices
8 # are retained or reproduced in an accompanying document, permission
9 # is granted to deal in this work without restriction, including un‐
10 # limited rights to use, publicly perform, distribute, sell, modify,
11 # merge, give away, or sublicence.
12 #
13 # This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
14 # the utmost extent permitted by applicable law, neither express nor
15 # implied; without malicious intent or gross negligence. In no event
16 # may a licensor, author or contributor be held liable for indirect,
17 # direct, other damage, loss, or other issues arising in any way out
18 # of dealing in the work, even if advised of the possibility of such
19 # damage or existence of a defect, except proven that it results out
20 # of said person’s immediate fault when using the work as intended.
21 #-
22 # Shows all packages whose installed version is not available from a
23 # repository any more.
24
25 unset LANGUAGE
26 export LC_ALL=C
27
28 . "$(dirname "$0")"/../progress-bar
29
30 if ! T=$(mktemp /tmp/showlcl.XXXXXXXXXX); then
31         print -ru2 "E: cannot create temporary file"
32         exit 1
33 fi
34
35 set -o noglob
36
37 dpkg-query -Wf '${binary:Package}\n' | \
38     xargs apt-cache showpkg >"$T"
39 init_progress_bar $(grep -c '^Package: ' <"$T")
40 exec <"$T"
41 rm "$T"
42 s=0
43 while IFS= read -r line; do
44         case $s:$line {
45         (0:Package:+(\ )*)
46                 draw_progress_bar
47                 p=${line##*([!:]):*( )}
48                 s=1
49                 ;;
50         (1:Versions:*(\ ))
51                 s=2
52                 ;;
53         (2:[0-9]*)
54                 set -- $line
55                 if [[ $2 = '(/var/lib/dpkg/status)' && -z $3 ]]; then
56                         print -ru2 -- "D: found $p (= $1)"
57                         print -r -- "$p (= $1)"
58                 fi
59                 ;;
60         (2:[!\ 0-9]*)
61                 s=0
62                 ;;
63         }
64         #print -ru2 -- "D: s=$s l=${line@Q}"
65 done | {
66         res=$(sort -u)
67         print -ru2 -- "I: outputting result set to stdout"
68         done_progress_bar 0
69         print -r -- "$res"
70 }