diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index d34b824e..2924dde8 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -53,7 +53,7 @@ def warn_or_exception(value): app_fields = set([ 'Disabled', 'AntiFeatures', - 'Provides', + 'Provides', # deprecated, txt only 'Categories', 'License', 'Author Name', @@ -97,7 +97,6 @@ app_fields = set([ yaml_app_field_order = [ 'Disabled', 'AntiFeatures', - 'Provides', 'Categories', 'License', 'AuthorName', @@ -1073,12 +1072,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 d7b72f71..686301db 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -367,6 +367,25 @@ class MetadataTest(unittest.TestCase): 'prebuild': "a && b && " "sed -i 's,a,b,'"}]}) + def test_parse_yaml_provides_should_be_ignored(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'): + 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() app = fdroidserver.metadata.App() @@ -521,6 +540,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__))