1import collections
2import json
3import os
4import subprocess
5import sys
6import urllib.request
7
8names = {
9 'awk': 'nawk',
10 'lpeg': 'lua:lpeg',
11 'sshfs': 'fusefs:sshfs',
12 'st': 'st-term',
13 'terminus-font': 'fonts:terminus',
14 'the_silver_searcher': 'the-silver-searcher',
15 'tz': 'tzdata',
16 'wpa_supplicant': 'wpa-supplicant',
17}
18skip = set([
19 'adobe-source-fonts',
20 'cproc',
21 'libutp',
22 'mc',
23 'openbsd',
24 'qbe',
25 'sbase',
26 'sdhcp',
27 'skeleton',
28 'st',
29 'swc',
30 'ubase',
31 'velox',
32 'wld',
33])
34
35p = subprocess.Popen(['git', '-C', 'pkg', 'ls-tree', 'HEAD'], stdout=subprocess.PIPE)
36for line in p.stdout:
37 fields = line.decode().split()
38 if fields[1] != 'tree' or fields[3] in skip:
39 continue
40 name = fields[3]
41 try:
42 with open('pkg/{}/ver'.format(name), 'r') as f:
43 oldver = f.read().rsplit(maxsplit=1)[0]
44 except FileNotFoundError:
45 continue
46 proj = names.get(name, name)
47 with urllib.request.urlopen('https://repology.org/api/v1/project/{}'.format(proj)) as response:
48 pkgs = json.loads(response.read())
49 newest = collections.Counter()
50 for pkg in pkgs:
51 if pkg['status'] in ('newest', 'unique'):
52 newest[pkg['version']] += 1
53 if not newest:
54 print('could not find newest version of {}'.format(proj), file=sys.stderr)
55 continue
56 newver = newest.most_common(1)[0][0]
57 if oldver != newver:
58 print('{:20} {:16} => {:16}'.format(name, oldver, newver))
59if p.wait():
60 raise CalledProcessError(p.retcode, p.args)