diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 29987475..bf3538dc 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -1302,6 +1302,23 @@ def _app_to_yaml(app): return cm +def remove_blank_flags_from_builds(builds): + """Remove unset entries from Builds so they are not written out.""" + if not builds: + return list() + newbuilds = list() + for build in builds: + new = dict() + for k in build_flags: + v = build.get(k) + # 0 is valid value, it should not be stripped + if v is None or v is False or v == '' or v == dict() or v == list(): + continue + new[k] = v + newbuilds.append(new) + return newbuilds + + def write_yaml(mf, app): """Write metadata in yaml format. @@ -1318,6 +1335,10 @@ def write_yaml(mf, app): app metadata to written to the YAML file """ + builds = remove_blank_flags_from_builds(app.get('Builds')) + if builds: + app['Builds'] = builds + _del_duplicated_NoSourceSince(app) yaml_app = _app_to_yaml(app) yamlmf = ruamel.yaml.YAML(typ='rt') diff --git a/fdroidserver/rewritemeta.py b/fdroidserver/rewritemeta.py index 4bbe810d..a55069be 100644 --- a/fdroidserver/rewritemeta.py +++ b/fdroidserver/rewritemeta.py @@ -23,6 +23,7 @@ import shutil import tempfile from argparse import ArgumentParser from pathlib import Path +import sys from . import _, common, metadata @@ -41,23 +42,6 @@ def proper_format(app): return content == cur_content -def remove_blank_flags_from_builds(builds): - """Remove unset entries from Builds so they are not written out.""" - if not builds: - return list() - newbuilds = list() - for build in builds: - new = dict() - for k in metadata.build_flags: - v = build.get(k) - # 0 is valid value, it should not be stripped - if v is None or v is False or v == '' or v == dict() or v == list(): - continue - new[k] = v - newbuilds.append(new) - return newbuilds - - def main(): global config @@ -70,6 +54,13 @@ def main(): default=False, help=_("List files that would be reformatted (dry run)"), ) + parser.add_argument( + "-s", + "--stdin", + action="store_true", + default=False, + help=_("Format file from stdin and output the result to stdout"), + ) parser.add_argument( "appid", nargs='*', help=_("application ID of file to operate on") ) @@ -79,6 +70,12 @@ def main(): config = common.read_config() + if options.stdin: + app = metadata.parse_yaml_metadata(sys.stdin) + metadata.write_yaml(sys.stdout, app) + logging.debug(_("Finished")) + return + apps = common.read_app_args(options.appid) for appid, app in apps.items(): @@ -94,11 +91,6 @@ def main(): print(path) continue - # TODO these should be moved to metadata.write_yaml() - builds = remove_blank_flags_from_builds(app.get('Builds')) - if builds: - app['Builds'] = builds - # rewrite to temporary file before overwriting existing # file in case there's a bug in write_metadata with tempfile.TemporaryDirectory() as tmpdir: diff --git a/tests/test_metadata.py b/tests/test_metadata.py index 4cbeef35..67306390 100755 --- a/tests/test_metadata.py +++ b/tests/test_metadata.py @@ -2507,3 +2507,140 @@ class PostMetadataParseTest(unittest.TestCase): self.assertEqual(*self._post_metadata_parse_build_list(True, ['true'])) self.assertEqual(*self._post_metadata_parse_build_script(True, ['true'])) self.assertEqual(*self._post_metadata_parse_build_string(True, 'true')) + + def test_remove_blank_flags_from_builds_com_politedroid_3(self): + """Unset fields in Builds: entries should be removed.""" + appid = 'com.politedroid' + app = metadata.read_metadata({appid: -1})[appid] + builds = metadata.remove_blank_flags_from_builds(app.get('Builds')) + self.assertEqual( + builds[0], + { + 'versionName': '1.2', + 'versionCode': 3, + 'commit': '6a548e4b19', + 'target': 'android-10', + 'antifeatures': { + 'KnownVuln': {}, + 'NonFreeAssets': {}, + }, + }, + ) + + def test_remove_blank_flags_from_builds_com_politedroid_4(self): + """Unset fields in Builds: entries should be removed.""" + appid = 'com.politedroid' + app = metadata.read_metadata({appid: -1})[appid] + builds = metadata.remove_blank_flags_from_builds(app.get('Builds')) + self.assertEqual( + builds[1], + { + 'versionName': '1.3', + 'versionCode': 4, + 'commit': 'ad865b57bf3ac59580f38485608a9b1dda4fa7dc', + 'target': 'android-15', + }, + ) + + def test_remove_blank_flags_from_builds_org_adaway_52(self): + """Unset fields in Builds: entries should be removed.""" + appid = 'org.adaway' + app = metadata.read_metadata({appid: -1})[appid] + builds = metadata.remove_blank_flags_from_builds(app.get('Builds')) + self.assertEqual( + builds[-1], + { + 'buildjni': ['yes'], + 'commit': 'v3.0', + 'gradle': ['yes'], + 'preassemble': ['renameExecutables'], + 'subdir': 'AdAway', + 'versionCode': 52, + 'versionName': '3.0', + }, + ) + + def test_remove_blank_flags_from_builds_no_builds(self): + """Unset fields in Builds: entries should be removed.""" + self.assertEqual( + metadata.remove_blank_flags_from_builds(None), + list(), + ) + self.assertEqual( + metadata.remove_blank_flags_from_builds(dict()), + list(), + ) + self.assertEqual( + metadata.remove_blank_flags_from_builds(list()), + list(), + ) + self.assertEqual( + metadata.remove_blank_flags_from_builds(set()), + list(), + ) + self.assertEqual( + metadata.remove_blank_flags_from_builds(tuple()), + list(), + ) + + def test_remove_blank_flags_from_builds_0_is_a_value(self): + self.assertEqual( + metadata.remove_blank_flags_from_builds([{'versionCode': 0}]), + [{'versionCode': 0}], + ) + + def test_remove_blank_flags_from_builds_values_to_purge(self): + self.assertEqual( + metadata.remove_blank_flags_from_builds( + [ + { + 'antifeatures': dict(), + 'forceversion': False, + 'init': None, + 'rm': '', + 'scandelete': list(), + 'versionCode': 0, + }, + {'antifeatures': list(), 'versionCode': 1}, + {'antifeatures': '', 'versionCode': 2}, + ] + ), + [{'versionCode': 0}, {'versionCode': 1}, {'versionCode': 2}], + ) + + def test_remove_blank_flags_from_builds_app_with_special_build_params(self): + appid = 'app.with.special.build.params' + app = metadata.read_metadata({appid: -1})[appid] + builds = metadata.remove_blank_flags_from_builds(app.get('Builds')) + self.assertEqual( + builds[-1], + { + 'versionName': '2.1.2', + 'versionCode': 51, + 'disable': 'Labelled as pre-release, so skipped', + }, + ) + + def test_remove_blank_flags_from_builds_app_with_special_build_params_af(self): + """Unset fields in Builds: entries should be removed.""" + appid = 'app.with.special.build.params' + app = metadata.read_metadata({appid: -1})[appid] + builds = metadata.remove_blank_flags_from_builds(app.get('Builds')) + self.assertEqual( + builds[-2], + { + 'antifeatures': { + 'Ads': {'en-US': 'includes ad lib\n', 'zh-CN': '包括广告图书馆\n'}, + 'Tracking': {'en-US': 'standard suspects\n'}, + }, + 'commit': '2.1.1', + 'maven': '2', + 'patch': [ + 'manifest-ads.patch', + 'mobilecore.patch', + ], + 'srclibs': ['FacebookSDK@sdk-version-3.0.2'], + 'versionCode': 50, + 'versionName': '2.1.1-c', + }, + ) diff --git a/tests/test_rewritemeta.py b/tests/test_rewritemeta.py index 4dcdd03f..67d5e5ac 100755 --- a/tests/test_rewritemeta.py +++ b/tests/test_rewritemeta.py @@ -26,106 +26,6 @@ class RewriteMetaTest(unittest.TestCase): def tearDown(self): self._td.cleanup() - def test_remove_blank_flags_from_builds_com_politedroid_3(self): - """Unset fields in Builds: entries should be removed.""" - appid = 'com.politedroid' - app = metadata.read_metadata({appid: -1})[appid] - builds = rewritemeta.remove_blank_flags_from_builds(app.get('Builds')) - self.assertEqual( - builds[0], - { - 'versionName': '1.2', - 'versionCode': 3, - 'commit': '6a548e4b19', - 'target': 'android-10', - 'antifeatures': { - 'KnownVuln': {}, - 'NonFreeAssets': {}, - }, - }, - ) - - def test_remove_blank_flags_from_builds_com_politedroid_4(self): - """Unset fields in Builds: entries should be removed.""" - appid = 'com.politedroid' - app = metadata.read_metadata({appid: -1})[appid] - builds = rewritemeta.remove_blank_flags_from_builds(app.get('Builds')) - self.assertEqual( - builds[1], - { - 'versionName': '1.3', - 'versionCode': 4, - 'commit': 'ad865b57bf3ac59580f38485608a9b1dda4fa7dc', - 'target': 'android-15', - }, - ) - - def test_remove_blank_flags_from_builds_org_adaway_52(self): - """Unset fields in Builds: entries should be removed.""" - appid = 'org.adaway' - app = metadata.read_metadata({appid: -1})[appid] - builds = rewritemeta.remove_blank_flags_from_builds(app.get('Builds')) - self.assertEqual( - builds[-1], - { - 'buildjni': ['yes'], - 'commit': 'v3.0', - 'gradle': ['yes'], - 'preassemble': ['renameExecutables'], - 'subdir': 'AdAway', - 'versionCode': 52, - 'versionName': '3.0', - }, - ) - - def test_remove_blank_flags_from_builds_no_builds(self): - """Unset fields in Builds: entries should be removed.""" - self.assertEqual( - rewritemeta.remove_blank_flags_from_builds(None), - list(), - ) - self.assertEqual( - rewritemeta.remove_blank_flags_from_builds(dict()), - list(), - ) - self.assertEqual( - rewritemeta.remove_blank_flags_from_builds(list()), - list(), - ) - self.assertEqual( - rewritemeta.remove_blank_flags_from_builds(set()), - list(), - ) - self.assertEqual( - rewritemeta.remove_blank_flags_from_builds(tuple()), - list(), - ) - - def test_remove_blank_flags_from_builds_0_is_a_value(self): - self.assertEqual( - rewritemeta.remove_blank_flags_from_builds([{'versionCode': 0}]), - [{'versionCode': 0}], - ) - - def test_remove_blank_flags_from_builds_values_to_purge(self): - self.assertEqual( - rewritemeta.remove_blank_flags_from_builds( - [ - { - 'antifeatures': dict(), - 'forceversion': False, - 'init': None, - 'rm': '', - 'scandelete': list(), - 'versionCode': 0, - }, - {'antifeatures': list(), 'versionCode': 1}, - {'antifeatures': '', 'versionCode': 2}, - ] - ), - [{'versionCode': 0}, {'versionCode': 1}, {'versionCode': 2}], - ) - @mock.patch('sys.argv', ['fdroid rewritemeta', 'a']) def test_rewrite_no_builds(self): os.chdir(self.testdir) @@ -180,43 +80,6 @@ class RewriteMetaTest(unittest.TestCase): ), ) - def test_remove_blank_flags_from_builds_app_with_special_build_params(self): - appid = 'app.with.special.build.params' - app = metadata.read_metadata({appid: -1})[appid] - builds = rewritemeta.remove_blank_flags_from_builds(app.get('Builds')) - self.assertEqual( - builds[-1], - { - 'versionName': '2.1.2', - 'versionCode': 51, - 'disable': 'Labelled as pre-release, so skipped', - }, - ) - - def test_remove_blank_flags_from_builds_app_with_special_build_params_af(self): - """Unset fields in Builds: entries should be removed.""" - appid = 'app.with.special.build.params' - app = metadata.read_metadata({appid: -1})[appid] - builds = rewritemeta.remove_blank_flags_from_builds(app.get('Builds')) - self.assertEqual( - builds[-2], - { - 'antifeatures': { - 'Ads': {'en-US': 'includes ad lib\n', 'zh-CN': '包括广告图书馆\n'}, - 'Tracking': {'en-US': 'standard suspects\n'}, - }, - 'commit': '2.1.1', - 'maven': '2', - 'patch': [ - 'manifest-ads.patch', - 'mobilecore.patch', - ], - 'srclibs': ['FacebookSDK@sdk-version-3.0.2'], - 'versionCode': 50, - 'versionName': '2.1.1-c', - }, - ) - @mock.patch('sys.argv', ['fdroid rewritemeta', 'a', 'b']) def test_rewrite_scenario_trivial(self): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):