master hovercats/oakiss / scripts / outdated.py
 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)