diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 3a1ed4d7..f85ede04 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -1150,10 +1150,17 @@ def write_yaml(mf, app): else: return str(value) elif typ is TYPE_SCRIPT: - if len(value) > 50: - return ruamel.yaml.scalarstring.preserve_literal(value) + if type(value) == list: + if len(value) == 1: + return value[0] + else: + return value else: - return value + script_lines = value.split(' && ') + if len(script_lines) > 1: + return script_lines + else: + return value else: return value @@ -1189,8 +1196,8 @@ def write_yaml(mf, app): for build in app.builds: b = ruamel.yaml.comments.CommentedMap() for field in build_flags: - if hasattr(build, field) and getattr(build, field): - value = getattr(build, field) + value = getattr(build, field) + if hasattr(build, field) and value: if field == 'gradle' and value == ['off']: value = [ruamel.yaml.scalarstring.SingleQuotedScalarString('off')] if field in ('maven', 'buildozer'): @@ -1198,11 +1205,6 @@ def write_yaml(mf, app): continue elif value == 'yes': value = 'yes' - if field == 'prebuild': - prebuild_tokens = value.split(' && ') - # when theres just 1 entry keep string rather than a list - if len(prebuild_tokens) > 1: - value = prebuild_tokens b.update({field: _field_to_yaml(flagtype(field), value)}) builds.append(b) diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index 441fc94e..bedceb24 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -254,7 +254,7 @@ class MetadataTest(unittest.TestCase): 'prebuild': "a && b && " "sed -i 's,a,b,'"}]}) - def test_write_yaml_prebuild(self): + def test_write_yaml_1_line_scripts_as_string(self): mf = io.StringIO() app = fdroidserver.metadata.App() app.Categories = ['None'] @@ -262,7 +262,10 @@ class MetadataTest(unittest.TestCase): build = fdroidserver.metadata.Build() build.versionCode = 102030 build.versionName = 'v1.2.3' - build.prebuild = 'a && b % c && d `echo \'$e\'` && f' + build.sudo = "chmod +rwx /opt" + build.init = "sed -i -e 'g/what/ever/' /some/file" + build.prebuild = "sed -i 'd/that wrong config/' gradle.properties" + build.build = "./gradlew compile" app.builds.append(build) fdroidserver.metadata.write_yaml(mf, app) mf.seek(0) @@ -274,11 +277,132 @@ class MetadataTest(unittest.TestCase): Builds: - versionName: v1.2.3 versionCode: 102030 + sudo: chmod +rwx /opt + init: sed -i -e 'g/what/ever/' /some/file + prebuild: sed -i 'd/that wrong config/' gradle.properties + build: ./gradlew compile + + AutoUpdateMode: None + UpdateCheckMode: None + """)) + + def test_write_yaml_1_line_scripts_as_list(self): + mf = io.StringIO() + app = fdroidserver.metadata.App() + app.Categories = ['None'] + app.builds = [] + build = fdroidserver.metadata.Build() + build.versionCode = 102030 + build.versionName = 'v1.2.3' + build.sudo = ["chmod +rwx /opt"] + build.init = ["sed -i -e 'g/what/ever/' /some/file"] + build.prebuild = ["sed -i 'd/that wrong config/' gradle.properties"] + build.build = ["./gradlew compile"] + 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 + sudo: chmod +rwx /opt + init: sed -i -e 'g/what/ever/' /some/file + prebuild: sed -i 'd/that wrong config/' gradle.properties + build: ./gradlew compile + + AutoUpdateMode: None + UpdateCheckMode: None + """)) + + def test_write_yaml_multiline_scripts_from_list(self): + mf = io.StringIO() + app = fdroidserver.metadata.App() + app.Categories = ['None'] + app.builds = [] + build = fdroidserver.metadata.Build() + build.versionCode = 102030 + build.versionName = 'v1.2.3' + build.sudo = ["apt-get update", + "apt-get install -y whatever", + "sed -i -e 's/> /a/file"] + build.build = ["./gradlew someSpecialTask", + "sed -i 'd/that wrong config/' gradle.properties", + "./gradlew compile"] + 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 + sudo: + - apt-get update + - apt-get install -y whatever + - sed -i -e 's/> /a/file + build: + - ./gradlew someSpecialTask + - sed -i 'd/that wrong config/' gradle.properties + - ./gradlew compile + + AutoUpdateMode: None + UpdateCheckMode: None + """)) + + def test_write_yaml_multiline_scripts_from_string(self): + mf = io.StringIO() + app = fdroidserver.metadata.App() + app.Categories = ['None'] + app.builds = [] + build = fdroidserver.metadata.Build() + build.versionCode = 102030 + build.versionName = 'v1.2.3' + build.sudo = "apt-get update && apt-get install -y whatever && sed -i -e 's/> /a/file + build: + - ./gradlew someSpecialTask + - sed -i 'd/that wrong config/' gradle.properties + - ./gradlew compile AutoUpdateMode: None UpdateCheckMode: None