From 19d422da861e911b0730e1acaee7ef5426b1e21a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Michael=20P=C3=B6hn?= Date: Fri, 19 May 2017 13:47:05 +0200 Subject: [PATCH] rewritemeta yaml: fixed boolen mapping for build flags --- fdroidserver/metadata.py | 74 +++++++++++++++---- fdroidserver/rewritemeta.py | 2 + .../convert_metadata_to_yaml_then_txt.sh | 14 ++++ .../app.with.special.build.params.txt | 20 +++-- .../app.with.special.build.params.yml | 32 ++++++-- 5 files changed, 115 insertions(+), 27 deletions(-) create mode 100755 tests/extra/convert_metadata_to_yaml_then_txt.sh diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 3e0dfcee..74454d55 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -816,7 +816,7 @@ def post_metadata_parse(app): app['builds'] = app.pop('Builds') if 'flavours' in app and app['flavours'] == [True]: - app['flavours'] = ['yes'] + app['flavours'] = 'yes' if isinstance(app.Categories, str): app.Categories = [app.Categories] @@ -825,23 +825,49 @@ def post_metadata_parse(app): else: app.Categories = [str(i) for i in app.Categories] + def _yaml_bool_unmapable(v): + return v in (True, False, [True], [False]) + + def _yaml_bool_unmap(v): + if v is True: + return 'yes' + elif v is False: + return 'no' + elif v == [True]: + return ['yes'] + elif v == [False]: + return ['no'] + + _bool_allowed = ('disable', 'kivy', 'maven') + builds = [] if 'builds' in app: for build in app['builds']: if not isinstance(build, Build): build = Build(build) for k, v in build.items(): - if flagtype(k) == TYPE_LIST: - if isinstance(v, str): - build[k] = [v] - elif isinstance(v, bool): - if v: - build[k] = ['yes'] + if not (v is None): + if flagtype(k) == TYPE_LIST: + if _yaml_bool_unmapable(v): + build[k] = _yaml_bool_unmap(v) + + if isinstance(v, str): + build[k] = [v] + elif isinstance(v, bool): + if v: + build[k] = ['yes'] + else: + build[k] = [] + elif flagtype(k) is TYPE_INT: + build[k] = str(v) + elif flagtype(k) is TYPE_STRING: + if isinstance(v, bool) and k in _bool_allowed: + build[k] = v else: - build[k] = [] - elif (flagtype(k) == TYPE_STRING or flagtype(k) == TYPE_INT) \ - and type(v) in (float, int): - build[k] = str(v) + if _yaml_bool_unmapable(v): + build[k] = _yaml_bool_unmap(v) + else: + build[k] = str(v) builds.append(build) app.builds = sorted_builds(builds) @@ -964,12 +990,26 @@ def parse_yaml_metadata(mf, app): def write_yaml(mf, app): + _yaml_bools_true = ('y', 'Y', 'yes', 'Yes', 'YES', + 'true', 'True', 'TRUE', + 'on', 'On', 'ON') + _yaml_bools_false = ('n', 'N', 'no', 'No', 'NO', + 'false', 'False', 'FALSE', + 'off', 'Off', 'OFF') + _yaml_bools_plus_lists = [] + _yaml_bools_plus_lists.extend(_yaml_bools_true) + _yaml_bools_plus_lists.extend([[x] for x in _yaml_bools_true]) + _yaml_bools_plus_lists.extend(_yaml_bools_false) + _yaml_bools_plus_lists.extend([[x] for x in _yaml_bools_false]) + def _class_as_dict_representer(dumper, data): '''Creates a YAML representation of a App/Build instance''' return dumper.represent_dict(data) def _field_to_yaml(typ, value): if typ is TYPE_STRING: + if value in _yaml_bools_plus_lists: + return ruamel.yaml.scalarstring.SingleQuotedScalarString(str(value)) return str(value) elif typ is TYPE_INT: return int(value) @@ -1019,7 +1059,15 @@ def write_yaml(mf, app): b = ruamel.yaml.comments.CommentedMap() for field in fields: if hasattr(build, field) and getattr(build, field): - b.update({field: _field_to_yaml(flagtype(field), getattr(build, field))}) + value = getattr(build, field) + if field == 'gradle' and value == ['off']: + value = [ruamel.yaml.scalarstring.SingleQuotedScalarString('off')] + if field in ('disable', 'kivy', 'maven'): + if value == 'no': + continue + elif value == 'yes': + value = 'yes' + b.update({field: _field_to_yaml(flagtype(field), value)}) builds.append(b) # insert extra empty lines between build entries @@ -1031,7 +1079,7 @@ def write_yaml(mf, app): yaml_app_field_order = [ 'Disabled', - 'AnitFeatures', + 'AntiFeatures', 'Provides', 'Categories', 'License', diff --git a/fdroidserver/rewritemeta.py b/fdroidserver/rewritemeta.py index 2d2d1803..58fd7994 100644 --- a/fdroidserver/rewritemeta.py +++ b/fdroidserver/rewritemeta.py @@ -77,6 +77,8 @@ def main(): if not options.to and ext not in supported: logging.info("Ignoring %s file at '%s'" % (ext, path)) continue + else: + logging.info("rewriting '%s' to %s" % (appid, options.to)) to_ext = ext if options.to is not None: diff --git a/tests/extra/convert_metadata_to_yaml_then_txt.sh b/tests/extra/convert_metadata_to_yaml_then_txt.sh new file mode 100755 index 00000000..efc03350 --- /dev/null +++ b/tests/extra/convert_metadata_to_yaml_then_txt.sh @@ -0,0 +1,14 @@ +#! /bin/bash + +if [ ! -d metadata ]; then + echo 'no metadata directory present' + exit 1 +fi + +fdroid rewritemeta --to yml +fdroid rewritemeta --to txt + +echo '## stripping maven, kivy, disable buildflags if they are set to "no"' +sed -i '/^ maven=no$/d' metadata/*.txt +sed -i '/^ kivy=no$/d' metadata/*.txt +sed -i '/^ disable=no$/d' metadata/*.txt diff --git a/tests/metadata/app.with.special.build.params.txt b/tests/metadata/app.with.special.build.params.txt index 63d25e45..db4970eb 100644 --- a/tests/metadata/app.with.special.build.params.txt +++ b/tests/metadata/app.with.special.build.params.txt @@ -47,14 +47,22 @@ Build:1.2.2,42 Build:2.1.1,48 commit=2.1.1 patch=manifest-ads.patch,mobilecore.patch + maven=yes + srclibs=FacebookSDK@sdk-version-3.0.2 + +Build:2.1.1-b,49 + commit=2.1.1 + patch=manifest-ads.patch,mobilecore.patch + maven=yes@.. + srclibs=FacebookSDK@sdk-version-3.0.2 + +Build:2.1.1-c,50 + commit=2.1.1 + patch=manifest-ads.patch,mobilecore.patch + maven=2 srclibs=FacebookSDK@sdk-version-3.0.2 - rm=libs/applovin*,libs/mobileCore* - extlibs=android/android-support-v4.jar - prebuild=cp libs/android-support-v4.jar $$FacebookSDK$$/libs/ && \ - sed -i 's@\(reference.1=\).*@\1$$FacebookSDK$$@' project.properties && \ - sed -i 's/Class\[\]/Class\\[\]/g' $$FacebookSDK$$/src/com/facebook/model/GraphObject.java -Build:2.1.2,49 +Build:2.1.2,51 disable=Labelled as pre-release, so skipped Archive Policy:0 versions diff --git a/tests/metadata/rewrite-yml/app.with.special.build.params.yml b/tests/metadata/rewrite-yml/app.with.special.build.params.yml index 6f579797..2b55701f 100644 --- a/tests/metadata/rewrite-yml/app.with.special.build.params.yml +++ b/tests/metadata/rewrite-yml/app.with.special.build.params.yml @@ -1,3 +1,5 @@ +AntiFeatures: + - UpstreamNonFree Categories: - System License: GPL-3.0 @@ -59,18 +61,32 @@ Builds: patch: - manifest-ads.patch - mobilecore.patch + maven: 'yes' srclibs: - FacebookSDK@sdk-version-3.0.2 - rm: - - libs/applovin* - - libs/mobileCore* - extlibs: - - android/android-support-v4.jar - prebuild: |- - cp libs/android-support-v4.jar $$FacebookSDK$$/libs/ && sed -i 's@\(reference.1=\).*@\1$$FacebookSDK$$@' project.properties && sed -i 's/Class\[\]/Class\\[\]/g' $$FacebookSDK$$/src/com/facebook/model/GraphObject.java - - versionName: 2.1.2 + - versionName: 2.1.1-b versionCode: 49 + commit: 2.1.1 + patch: + - manifest-ads.patch + - mobilecore.patch + maven: yes@.. + srclibs: + - FacebookSDK@sdk-version-3.0.2 + + - versionName: 2.1.1-c + versionCode: 50 + commit: 2.1.1 + patch: + - manifest-ads.patch + - mobilecore.patch + maven: '2' + srclibs: + - FacebookSDK@sdk-version-3.0.2 + + - versionName: 2.1.2 + versionCode: 51 disable: Labelled as pre-release, so skipped ArchivePolicy: 0 versions -- 2.30.2