-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathupdate-source-catalog
executable file
·119 lines (91 loc) · 3.67 KB
/
update-source-catalog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/usr/bin/python3
import argparse
import gettext
import glob
import os
import sys
import yaml
def get_opts():
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest="subcommand")
parser_source = subparsers.add_parser('source')
parser_source.add_argument('--output', required=True)
parser_source.add_argument('--template', required=True)
parser_source.add_argument('--size', required=True)
parser_source.add_argument('--squashfs', default='')
parser_source.add_argument('--translations')
parser_source.add_argument('--langs')
parser_source.set_defaults(func=on_source)
parser_merge = subparsers.add_parser('merge')
parser_merge.add_argument('--output', required=True)
parser_merge.add_argument('--template', required=True)
parser_merge.set_defaults(func=on_merge)
return parser.parse_args()
def yaml_load(filename):
with open(filename) as fp:
return yaml.safe_load(fp)
def yaml_dump(filename, content):
with open(filename, 'w') as fp:
yaml.dump(content, fp)
def on_source(opts, output):
template = yaml_load(opts.template)
id = template['id']
for entry in output["sources"]:
# First, look if this source catalogue template id is already present.
# If so, use the template to extend the existing entry with additional
# variations.
if entry['id'] == id:
if 'variations' not in template:
print("Non unique id in source catalog but no variations!")
sys.exit(1)
for variation in template['variations'].values():
variation['size'] = int(opts.size)
entry.setdefault('variations', {}).update(template['variations'])
break
else:
# No entry with this id found, so add a new one.
if 'variations' in template:
for variation in template['variations'].values():
if variation['path'] == opts.squashfs:
variation['size'] = int(opts.size)
template['size'] = int(opts.size)
template['path'] = opts.squashfs
en_name = template['name']
en_description = template['description']
template['name'] = {'en': en_name}
template['description'] = {'en': en_description}
if opts.translations:
for mo in glob.glob(os.path.join(opts.translations, '*.mo')):
with open(mo, 'rb') as fp:
t = gettext.GNUTranslations(fp=fp)
t_name = t.gettext(en_name)
if t_name != en_name:
lang = os.path.splitext(os.path.basename(mo))[0]
template['name'][lang] = t_name
t_description = t.gettext(en_description)
if t_description != en_description:
lang = os.path.splitext(os.path.basedescription(mo))[0]
template['description'][lang] = t_description
if opts.langs is not None:
template['preinstalled_langs'] = opts.langs.split(',')
output["sources"].append(template)
default_count = 0
for entry in output["sources"]:
if entry.get('default', False):
default_count += 1
if default_count > 1:
print("Too many defaults in source catalog!")
sys.exit(1)
def on_merge(opts, output):
output.update(yaml_load(opts.template))
if __name__ == "__main__":
opts = get_opts()
if os.path.exists(opts.output):
output = yaml_load(opts.output)
else:
output = {
"version": 2,
"sources": [],
}
opts.func(opts, output)
yaml_dump(opts.output, output)