1#!/bin/sh
2# Check repository for outdated packages
3
4die() {
5 printf '%s\n' "$*" >&2
6 exit 1
7}
8
9mkcd() {
10 mkdir -p "$1" && cd "$1"
11}
12
13repology_name() {
14 # Fix any known naming inconsistences between packages and Repology.
15 remote=$(
16 # Strip unrelated suffixes.
17 remote=${1%%-bin}
18 remote=${remote%%-git}
19
20 # Remote names are all lowercase.
21 tr '[:upper:]' '[:lower:]' <<EOF |
22$remote
23EOF
24 # Remote always uses -.
25 tr _ -
26 )
27
28 case $remote in
29 cairo)
30 remote=cairo-graphics-library
31 ;;
32
33 liberation-fonts)
34 remote=fonts:liberation
35 ;;
36
37 libjpeg)
38 remote=ijg-libjpeg
39 ;;
40
41 libmupdf | libxaw3d)
42 # TODO [community]: Rename packages?
43 remote=${remote##lib}
44 ;;
45
46 linux-headers)
47 remote=linux
48 ;;
49
50 lpeg)
51 remote=lua:lpeg
52 ;;
53
54 samurai)
55 remote=samurai-build-tool
56 ;;
57
58 sshfs)
59 remote=fusefs:sshfs
60 ;;
61
62 surf)
63 remote=surf-browser
64 ;;
65
66 st)
67 remote=st-term
68 ;;
69
70 terminus-font)
71 remote=fonts:terminus
72 ;;
73
74 vis)
75 remote=vis-editor
76 ;;
77
78 webkit2gtk)
79 # TODO [community]: Rename package?
80 remote=webkitgtk
81 ;;
82
83 tz)
84 remote=tzdata
85 ;;
86
87 libpkgconf)
88 remote=pkgconf
89 ;;
90
91 esac
92}
93
94repology_version() {
95 [ -f "$1.svg" ] || return 1
96 read -r remote_ver < "$1.svg" || :
97 remote_ver=${remote_ver%</text>*}
98 remote_ver=${remote_ver##*>}
99}
100
101repo_version() {
102 read -r ver _ 2>/dev/null < "$2/ver" || {
103 printf '%-30s local version not found\n' "$1" >&2
104 return 1
105 }
106
107 [ "$ver" != git ]
108}
109
110get_outdated() {
111 repo=${PWD%%/}
112 printf '\n[Checking Repology for outdated packages in %s]\n\n' "$repo" >&2
113
114 for pkg in */; do
115 pkg=${pkg%%/}
116 repology_name "${pkg##*/}"
117
118 [ "$remote" = - ] ||
119 set -- "$@" -z "$remote.svg" \
120 "https://repology.org/badge/latest-versions/$remote.svg"
121 done
122
123 mkcd "$tmp/${repo##*/}"
124
125 curl -SsZA 'kiss-outdated' --parallel-max 16 --remote-name-all "$@" ||
126 die 'fatal: network error'
127
128 for _pkg in "$OLDPWD"/*/; do
129 pkg=${_pkg%%/}
130 pkg=${pkg##*/}
131
132 repo_version "$pkg" "$_pkg" || continue
133 repology_name "$pkg"
134 repology_version "$remote" || continue
135
136 case $remote_ver in
137 *", $ver"* | *"$ver,"* | "$ver" | '') continue ;;
138 -) printf '%-30s no remote version found\n' "$pkg" >&2; continue ;;
139 esac
140
141 printf '%-30s %s -> %s\n' "$pkg" "$ver" "$remote_ver"
142 done
143}
144
145main() {
146 set -e
147
148 [ "$1" ] || set -- "$PWD"
149
150 mkdir -p "${tmp:=${XDG_CACHE_HOME:-"$HOME/.cache"}/kiss/repology}"
151
152 for repo do
153 old_pwd=$PWD
154 cd "$repo"
155 get_outdated
156 cd "$old_pwd"
157 done
158}
159
160main "$@"