mirror of
https://github.com/f-droid/fdroidserver.git
synced 2025-11-12 10:10:30 +03: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:
commit
ff3baefbed
2 changed files with 39 additions and 71 deletions
|
|
@ -239,8 +239,9 @@ build_flags_order = [
|
||||||
'novcheck',
|
'novcheck',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# old .txt format has version name/code inline in the 'Build:' line
|
||||||
build_flags = set(build_flags_order + ['versionName', 'versionCode'])
|
# but YAML and JSON have a explicit key for them
|
||||||
|
build_flags = ['versionName', 'versionCode'] + build_flags_order
|
||||||
|
|
||||||
|
|
||||||
class Build(dict):
|
class Build(dict):
|
||||||
|
|
@ -959,6 +960,25 @@ def parse_yaml_metadata(mf, app):
|
||||||
return 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_line_sep = re.compile(r'(?<!\\),')
|
||||||
build_cont = re.compile(r'^[ \t]')
|
build_cont = re.compile(r'^[ \t]')
|
||||||
|
|
||||||
|
|
@ -1295,7 +1315,7 @@ def write_txt(mf, app):
|
||||||
first = False
|
first = False
|
||||||
else:
|
else:
|
||||||
mf.write(' && \\\n ')
|
mf.write(' && \\\n ')
|
||||||
mf.write(s)
|
mf.write(s.strip())
|
||||||
elif t == TYPE_LIST:
|
elif t == TYPE_LIST:
|
||||||
mf.write(','.join(v))
|
mf.write(','.join(v))
|
||||||
|
|
||||||
|
|
@ -1304,70 +1324,6 @@ def write_txt(mf, app):
|
||||||
write_plaintext_metadata(mf, app, w_comment, w_field, w_build)
|
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):
|
def write_metadata(metadatapath, app):
|
||||||
_, ext = fdroidserver.common.get_extension(metadatapath)
|
_, ext = fdroidserver.common.get_extension(metadatapath)
|
||||||
accepted = fdroidserver.common.config['accepted_formats']
|
accepted = fdroidserver.common.config['accepted_formats']
|
||||||
|
|
|
||||||
|
|
@ -72,9 +72,10 @@ def main():
|
||||||
parser.error("Unsupported metadata format, use: --to [" + ' '.join(supported) + "]")
|
parser.error("Unsupported metadata format, use: --to [" + ' '.join(supported) + "]")
|
||||||
|
|
||||||
for appid, app in apps.items():
|
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:
|
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
|
continue
|
||||||
|
|
||||||
to_ext = ext
|
to_ext = ext
|
||||||
|
|
@ -83,13 +84,24 @@ def main():
|
||||||
|
|
||||||
if options.list:
|
if options.list:
|
||||||
if not proper_format(app):
|
if not proper_format(app):
|
||||||
print(app.metadatapath)
|
print(path)
|
||||||
continue
|
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)
|
metadata.write_metadata(base + '.' + to_ext, app)
|
||||||
|
|
||||||
if ext != to_ext:
|
if ext != to_ext:
|
||||||
os.remove(app.metadatapath)
|
os.remove(path)
|
||||||
|
|
||||||
logging.debug("Finished.")
|
logging.debug("Finished.")
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue