1
0
mirror of https://gitlab.com/fdroid/fdroidserver.git synced 2024-11-13 18:40:12 +01:00

Merge branch 'yaml' into 'master'

basic support for YAMLin `fdroid rewritemeta`

Closes #285 and #169

See merge request !260
This commit is contained in:
Michael Pöhn 2017-05-05 08:35:44 +00:00
commit ff3baefbed
2 changed files with 39 additions and 71 deletions

View File

@ -239,8 +239,9 @@ build_flags_order = [
'novcheck',
]
build_flags = set(build_flags_order + ['versionName', 'versionCode'])
# old .txt format has version name/code inline in the 'Build:' line
# but YAML and JSON have a explicit key for them
build_flags = ['versionName', 'versionCode'] + build_flags_order
class Build(dict):
@ -959,6 +960,25 @@ def parse_yaml_metadata(mf, app):
return app
def write_yaml(mf, app):
def _class_as_dict_representer(dumper, data):
'''Creates a YAML representation of a App/Build instance'''
return dumper.represent_dict(data)
empty_keys = [k for k, v in app.items() if not v]
for k in empty_keys:
del app[k]
for k in ['added', 'lastUpdated', 'id', 'metadatapath']:
if k in app:
del app[k]
yaml.add_representer(fdroidserver.metadata.App, _class_as_dict_representer)
yaml.add_representer(fdroidserver.metadata.Build, _class_as_dict_representer)
yaml.dump(app, mf, default_flow_style=False)
build_line_sep = re.compile(r'(?<!\\),')
build_cont = re.compile(r'^[ \t]')
@ -1295,7 +1315,7 @@ def write_txt(mf, app):
first = False
else:
mf.write(' && \\\n ')
mf.write(s)
mf.write(s.strip())
elif t == TYPE_LIST:
mf.write(','.join(v))
@ -1304,70 +1324,6 @@ def write_txt(mf, app):
write_plaintext_metadata(mf, app, w_comment, w_field, w_build)
def write_yaml(mf, app):
def w_comment(line):
mf.write("# %s\n" % line)
def escape(v):
if not v:
return ''
if any(c in v for c in [': ', '%', '@', '*']):
return "'" + v.replace("'", "''") + "'"
return v
def w_field(f, v, prefix='', t=None):
if t is None:
t = fieldtype(f)
v = ''
if t == TYPE_LIST:
v = '\n'
for e in v:
v += prefix + ' - ' + escape(e) + '\n'
elif t == TYPE_MULTILINE:
v = ' |\n'
for l in v.splitlines():
if l:
v += prefix + ' ' + l + '\n'
else:
v += '\n'
elif t == TYPE_BOOL:
v = ' yes\n'
elif t == TYPE_SCRIPT:
cmds = [s + '&& \\' for s in v.split('&& ')]
if len(cmds) > 0:
cmds[-1] = cmds[-1][:-len('&& \\')]
w_field(f, cmds, prefix, 'multiline')
return
else:
v = ' ' + escape(v) + '\n'
mf.write(prefix)
mf.write(f)
mf.write(":")
mf.write(v)
global first_build
first_build = True
def w_build(build):
global first_build
if first_build:
mf.write("builds:\n")
first_build = False
w_field('versionName', build.versionName, ' - ', TYPE_STRING)
w_field('versionCode', build.versionCode, ' ', TYPE_STRING)
for f in build_flags_order:
v = build.get(f)
if not v:
continue
w_field(f, v, ' ', flagtype(f))
write_plaintext_metadata(mf, app, w_comment, w_field, w_build)
def write_metadata(metadatapath, app):
_, ext = fdroidserver.common.get_extension(metadatapath)
accepted = fdroidserver.common.config['accepted_formats']

View File

@ -72,9 +72,10 @@ def main():
parser.error("Unsupported metadata format, use: --to [" + ' '.join(supported) + "]")
for appid, app in apps.items():
base, ext = common.get_extension(app.metadatapath)
path = app.metadatapath
base, ext = common.get_extension(path)
if not options.to and ext not in supported:
logging.info("Ignoring %s file at '%s'" % (ext, app.metadatapath))
logging.info("Ignoring %s file at '%s'" % (ext, path))
continue
to_ext = ext
@ -83,13 +84,24 @@ def main():
if options.list:
if not proper_format(app):
print(app.metadatapath)
print(path)
continue
newbuilds = []
for build in app.builds:
new = metadata.Build()
for k in metadata.build_flags:
v = build[k]
if v is None or v is False or v == [] or v == '':
continue
new[k] = v
newbuilds.append(new)
app.builds = newbuilds
metadata.write_metadata(base + '.' + to_ext, app)
if ext != to_ext:
os.remove(app.metadatapath)
os.remove(path)
logging.debug("Finished.")