b6b1dde1ce2aaeb55580e1d4ca17e99a43008ef1
[shellsnippets/shellsnippets.git] / mksh / debian-dev / quinn-ls.sh
1 #!/bin/mksh
2 rcsid='$MirOS: contrib/hosted/tg/deb/quinn-ls.sh,v 1.1 2011/02/18 18:52:01 tg Exp $'
3 #-
4 # Copyright (c) 2011
5 #       Thorsten Glaser <tg@debian.org>
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 find . -name \*.changes -o -name \*.dsc |&
23 set -A pkgs
24 set -A lver
25 set -A uver
26 i=0
27 while IFS= read -pr name; do
28         Source=
29         Version=
30         eval $(sed -n \
31             -e '/^\(Source\): \([^ ]*\)\( .*\)*$/s//\1='\''\2'\''/p' \
32             -e '/^\(Version\): \([^ ]*\)$/s//\1='\''\2'\''/p' \
33             "$name")
34         if [[ -z $Source || -z $Version ]]; then
35                 print -ru2 "skipping invalid file $name"
36                 continue
37         fi
38         j=-1
39         while (( ++j < i )); do
40                 [[ ${pkgs[j]} = "$Source" ]] && break
41         done
42         if (( j == i )); then
43                 print -u2 "local $Source $Version"
44                 pkgs[i]=$Source
45                 lver[i++]=$Version
46                 continue
47         fi
48         for x in ${lver[j]}; do
49                 # skip dups (from .changes = .dsc probably) silently
50                 [[ $x = "$Version" ]] && continue 2
51         done
52         # put the newest local version leftmost
53         set -A xa -- ${lver[j]}
54         if dpkg --compare-versions "$Version" gt "${xa[0]}"; then
55                 print -u2 "newer $Source $Version"
56                 lver[j]="$Version ${lver[j]}"
57         else
58                 print -u2 "older $Source $Version"
59                 lver[j]="${lver[j]} $Version"
60         fi
61 done
62
63 print -u2 '\nrunning rmadison...'
64 rmadison -s sid "${pkgs[@]}" |&
65 while read -pr pkg pipe vsn pipe sid pipe arches; do
66         #print -u2 "D: pkg<$pkg> vsn<$vsn> sid<$sid> arches<$arches>"
67         arches=${arches//,/ }
68         [[ " $arches " = *' source '* ]] || continue
69         j=-1
70         while (( ++j < i )); do
71                 [[ ${pkgs[j]} = "$pkg" ]] && break
72         done
73         if (( j == i )); then
74                 print -u2 "bogus $pkg $vsn ignored"
75                 continue
76         fi
77         x=${uver[j]}
78         if [[ -z $x ]]; then
79                 print -u2 "found $pkg $vsn"
80                 uver[j]=$vsn
81         elif [[ $x = "$vsn" ]]; then
82                 print -u2 "equal $pkg $vsn ignored"
83         elif dpkg --compare-versions "$x" lt "$vsn"; then
84                 print -u2 "newer $pkg $vsn (dropping $x)"
85                 uver[j]=$vsn
86         else
87                 print -u2 "older $pkg $vsn ignored"
88         fi
89 done
90
91 c0=$'\033[0m'
92 c1=$'\033[1;31m'
93 c2=$'\033[1;32m'
94 c3=$'\033[1;33m'
95 c4=$'\033[1;34m'
96 print -ru2 "$c0"
97 print -u2
98
99 j=-1
100 while (( ++j < i )); do
101         pkg=${pkgs[j]}
102         lvs=${lver[j]}
103         lv=${lvs%% *}
104         uv=${uver[j]}
105
106         if [[ -z $uv ]]; then
107                 uv=0~RM
108                 lc=$c1
109                 uc=$c1
110         elif [[ $lv = "$uv"?('+b'+([0-9])) ]]; then
111                 lc=$c2
112                 uc=$c2
113         elif dpkg --compare-versions "$lv" lt "$uv"; then
114                 lc=$c1
115                 uc=$c3
116         else
117                 lc=$c3
118                 uc=$c4
119         fi
120         print -r -- "$c0$pkg $lc$lv$c0 $uc$uv$c0"
121         [[ $lvs = $lv ]] && continue
122         for lv in ${lvs#* }; do
123                 [[ $lv = "$uv"?('+b'+([0-9])) ]] && continue
124                 print -r -- "$c0$pkg $c4$lv$c0 -"
125         done
126 done | sort | column -t