rewritemeta: support read from stdin

This commit is contained in:
linsui
2025-11-26 18:51:44 +08:00
committed by Hans-Christoph Steiner
parent cbb7698f55
commit 146f2b93fe
4 changed files with 172 additions and 159 deletions

View File

@@ -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')

View File

@@ -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:

View File

@@ -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',
},
)

View File

@@ -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):