|
|
|
#!/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)
|