chiark / gitweb /
rewritemeta yaml: fixed boolen mapping for build flags
authorMichael Pöhn <michael.poehn@fsfe.org>
Fri, 19 May 2017 11:47:05 +0000 (13:47 +0200)
committerMichael Pöhn <michael.poehn@fsfe.org>
Tue, 4 Jul 2017 09:51:08 +0000 (11:51 +0200)
fdroidserver/metadata.py
fdroidserver/rewritemeta.py
tests/extra/convert_metadata_to_yaml_then_txt.sh [new file with mode: 0755]
tests/metadata/app.with.special.build.params.txt
tests/metadata/rewrite-yml/app.with.special.build.params.yml

index 3e0dfcee7caf0c19dc8bd4d71732aaa78f1dc336..74454d55ec0c304b13e65d2ae91015ddcb33a525 100644 (file)
@@ -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',
index 2d2d18037fc9ebc83335d6dc35f14ba8d8112d96..58fd79941fb0983728f6d0552465bf1033d24af7 100644 (file)
@@ -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 (executable)
index 0000000..efc0335
--- /dev/null
@@ -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
index 63d25e45a98f0e9aad0469e8296e938646da91ee..db4970eb263a1b6a38f60fe75812a1437ea95e82 100644 (file)
@@ -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
index 6f57979717440e4c92992d8151c64c779af1d58b..2b55701f7853d1936ca44cdc48abb9cc7d4ecbd6 100644 (file)
@@ -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