move folders around
[web/firmware-selector-openwrt-org.git] / misc / collect.py
1 #!/usr/bin/env python3
2
3 from pathlib import Path
4 import json
5 import sys
6 import os
7
8
9 SUPPORTED_METADATA_VERSION = 1
10
11 paths = []
12 output = {}
13
14 if len(sys.argv) != 2:
15 sys.stderr.write("Merge json files generated by OpenWrt.\n\nUsage: {} <openwrt-bin-dir>\n\nThe result will be printed to stdout.\n".format(sys.argv[0]))
16 exit(1)
17
18 for path in Path(sys.argv[1]).rglob('*.json'):
19 paths.append(path)
20
21 def collect_names(prefix, images):
22 names = []
23 for image in images:
24 name = image['name']
25 if not name.startswith(prefix):
26 sys.stderr.write("Does not start with prefix {}: {} => skip\n".format(prefix, name))
27 else:
28 names.append(name[len(prefix):])
29 return names
30
31 for path in paths:
32 with open(path, "r") as file:
33 try:
34 obj = json.load(file)
35
36 if obj['metadata_version'] != SUPPORTED_METADATA_VERSION:
37 sys.stderr.write('{} has unsupported metadata version: {} => skip\n'.format(path, obj['metadata_version']))
38 continue
39
40 version = obj['version_number']
41 commit = obj['version_commit']
42
43 if not version in output:
44 output[version] = {'link': '', 'commit': commit, 'models' : []}
45
46 # only support a version_number with images of one version_commit
47 if output[version]['commit'] != commit:
48 sys.stderr.write('mixed revisions for a release ({} and {}) => abort\n'.format(output[version]['commit'], commit))
49 exit(1)
50
51 for title in obj['titles']:
52 prefix = obj['image_prefix']
53 target = obj['target'].strip('/') # fix 'omap/' target
54 names = collect_names(prefix, obj['images'])
55 # sometime no 'model'/'vendor' is set, only 'title' instead
56 if 'title' in title:
57 output[version]['models'].append(['', title['title'], '', target, prefix, names])
58 else:
59 output[version]['models'].append([title.get('vendor', ''), title['model'], title.get('variant', ''), target, prefix, names])
60
61 except json.decoder.JSONDecodeError as e:
62 sys.stderr.write("Skip {}\n {}\n".format(path, e))
63 continue
64 except KeyError as e:
65 sys.stderr.write("Abort on {}\n Missing key {}\n".format(path, e))
66 exit(1)
67
68 json.dump(output, sys.stdout, sort_keys=True)
69 #json.dump(output, sys.stdout, sort_keys=True, indent=" ")