From 191363ad55ca41a630500f0700c1b2a0f5ed8997 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 11 Jul 2019 01:40:42 +0200 Subject: [PATCH 1/4] exclude Provides metadata from yml --- fdroidserver/metadata.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 17a3e739..b228c924 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -52,7 +52,7 @@ def warn_or_exception(value): app_fields = set([ 'Disabled', 'AntiFeatures', - 'Provides', + 'Provides', # deprecated, txt only 'Categories', 'License', 'Author Name', @@ -96,7 +96,6 @@ app_fields = set([ yaml_app_field_order = [ 'Disabled', 'AntiFeatures', - 'Provides', 'Categories', 'License', 'AuthorName', From 723bd110a68c024933255c99bda39eab8dbaef53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 11 Jul 2019 01:46:18 +0200 Subject: [PATCH 2/4] test that yaml parsing does not accept provides --- tests/metadata.TestCase | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index d7b72f71..d669c567 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -367,6 +367,24 @@ class MetadataTest(unittest.TestCase): 'prebuild': "a && b && " "sed -i 's,a,b,'"}]}) + def test_parse_yaml_provides_should_raise_exception(self): + mf = io.StringIO(textwrap.dedent("""\ + Provides: this.is.deprecated + AutoName: F-Droid + RepoType: git + Builds: + - versionCode: 1 + versionName: v0.1.0 + prebuild: |- + a && b && sed -i 's,a,b,' + """)) + mf.name = 'mock_filename.yaml' + mf.seek(0) + result = {} + with mock.patch('fdroidserver.metadata.warnings_action', 'error'): + with self.assertRaises(fdroidserver.metadata.MetaDataException): + fdroidserver.metadata.parse_yaml_metadata(mf, result) + def test_write_yaml_1_line_scripts_as_string(self): mf = io.StringIO() app = fdroidserver.metadata.App() From 6e48663230ed9449f828b438f370a82072f5fcf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 11 Jul 2019 03:18:30 +0200 Subject: [PATCH 3/4] test that write yaml does not write provides --- tests/metadata.TestCase | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index d669c567..68e402ab 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -539,6 +539,34 @@ class MetadataTest(unittest.TestCase): UpdateCheckMode: None """)) + def test_write_yaml_make_sure_provides_does_not_get_written(self): + mf = io.StringIO() + app = fdroidserver.metadata.App() + app.Categories = ['None'] + app.Provides = 'this.is.deprecated' + app.builds = [] + build = fdroidserver.metadata.Build() + build.versionCode = 102030 + build.versionName = 'v1.2.3' + build.gradle = ['yes'] + app.builds.append(build) + fdroidserver.metadata.write_yaml(mf, app) + mf.seek(0) + self.assertEqual(mf.read(), textwrap.dedent("""\ + Categories: + - None + License: Unknown + + Builds: + - versionName: v1.2.3 + versionCode: 102030 + gradle: + - yes + + AutoUpdateMode: None + UpdateCheckMode: None + """)) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From dcf3837bcbebd0f1d0e77f942c0d867162e3dc71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Mon, 15 Jul 2019 15:45:02 +0200 Subject: [PATCH 4/4] parse yaml: ignore (and warn) deprecated field: Provides --- fdroidserver/metadata.py | 19 ++++++++++++++++--- tests/metadata.TestCase | 7 ++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index b228c924..d08f4102 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -1071,12 +1071,25 @@ def parse_json_metadata(mf, app): def parse_yaml_metadata(mf, app): yamldata = yaml.safe_load(mf) + deprecated_in_yaml = ['Provides'] + if yamldata: for field in yamldata: if field not in yaml_app_fields: - warn_or_exception(_("Unrecognised app field '{fieldname}' " - "in '{path}'").format(fieldname=field, - path=mf.name)) + if field not in deprecated_in_yaml: + warn_or_exception(_("Unrecognised app field " + "'{fieldname}' in '{path}'") + .format(fieldname=field, + path=mf.name)) + + for deprecated_field in deprecated_in_yaml: + if deprecated_field in yamldata: + logging.warning(_("Ignoring '{field}' in '{metapath}' " + "metadata because it is deprecated.") + .format(field=deprecated_field, + metapath=mf.name)) + del(yamldata[deprecated_field]) + if yamldata.get('Builds', None): for build in yamldata.get('Builds', []): # put all build flag keywords into a set to avoid diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index 68e402ab..686301db 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -367,7 +367,7 @@ class MetadataTest(unittest.TestCase): 'prebuild': "a && b && " "sed -i 's,a,b,'"}]}) - def test_parse_yaml_provides_should_raise_exception(self): + def test_parse_yaml_provides_should_be_ignored(self): mf = io.StringIO(textwrap.dedent("""\ Provides: this.is.deprecated AutoName: F-Droid @@ -382,8 +382,9 @@ class MetadataTest(unittest.TestCase): mf.seek(0) result = {} with mock.patch('fdroidserver.metadata.warnings_action', 'error'): - with self.assertRaises(fdroidserver.metadata.MetaDataException): - fdroidserver.metadata.parse_yaml_metadata(mf, result) + fdroidserver.metadata.parse_yaml_metadata(mf, result) + self.assertNotIn('Provides', result) + self.assertNotIn('provides', result) def test_write_yaml_1_line_scripts_as_string(self): mf = io.StringIO()