From 4686c06f628b5d7ebc742a187c503e99f11f5977 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 26 May 2021 10:58:46 +0200 Subject: [PATCH] metadata: allow `ndk:` to be str or list of release or revision There are two version numbers used for NDKs: the "release" and the "revision". The "release" is used in the download URL and zipball and the "revision" is used in the source.properties and the gradle ndkVersion field. Also, there are some builds which need multiple NDKs installed, so this makes it possible to have a list of release/revision entries in build.ndk. This does not yet add full support since _fdroidserver/build.py_ will also need changes. --- fdroidserver/common.py | 26 ++++++++++++++++++++++++++ fdroidserver/metadata.py | 6 +++++- tests/common.TestCase | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 01244f03..60b21f1b 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4021,6 +4021,32 @@ def auto_install_ndk(build): ndk = build.get('ndk') if not ndk: return + if isinstance(ndk, str): + _install_ndk(ndk) + elif isinstance(ndk, list): + for n in ndk: + _install_ndk(n) + else: + BuildException(_('Invalid ndk: entry in build: "{ndk}"') + .format(ndk=str(ndk))) + + +def _install_ndk(ndk): + """Install specified NDK if it is not already installed + + Parameters + ---------- + + ndk + The NDK version to install, either in "release" form (r21e) or + "revision" form (21.4.7075529). + """ + if re.match(r'[1-9][0-9.]+[0-9]', ndk): + for ndkdict in NDKS: + if ndk == ndkdict['revision']: + ndk = ndkdict['release'] + break + ndk_path = config.get(ndk) if ndk_path and os.path.isdir(ndk_path): return diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index b72d6c9d..21147e30 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -326,7 +326,11 @@ class Build(dict): return 'ant' def ndk_path(self): - return fdroidserver.common.config['ndk_paths'].get(self.ndk, '') + """Returns the path to the first configured NDK or an empty string""" + ndk = self.ndk + if isinstance(ndk, list): + ndk = self.ndk[0] + return fdroidserver.common.config['ndk_paths'].get(ndk, '') flagtypes = { diff --git a/tests/common.TestCase b/tests/common.TestCase index a58ca0a3..9e12ff9a 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1796,6 +1796,42 @@ class CommonTest(unittest.TestCase): fdroidserver.common.metadata_find_developer_signing_files(appid, vc) ) + def test_auto_install_ndk(self): + """Test all possible field data types for build.ndk""" + build = fdroidserver.metadata.Build() + + none_entry = mock.Mock() + with mock.patch('fdroidserver.common._install_ndk', none_entry): + fdroidserver.common.auto_install_ndk(build) + none_entry.assert_not_called() + + empty_list = mock.Mock() + build.ndk = [] + with mock.patch('fdroidserver.common._install_ndk', empty_list): + fdroidserver.common.auto_install_ndk(build) + empty_list.assert_not_called() + + release_entry = mock.Mock() + build.ndk = 'r21e' + with mock.patch('fdroidserver.common._install_ndk', release_entry): + fdroidserver.common.auto_install_ndk(build) + release_entry.assert_called_once_with('r21e') + + revision_entry = mock.Mock() + build.ndk = '21.4.7075529' + with mock.patch('fdroidserver.common._install_ndk', revision_entry): + fdroidserver.common.auto_install_ndk(build) + revision_entry.assert_called_once_with('21.4.7075529') + + list_entry = mock.Mock() + calls = [] + build.ndk = ['11.0.2655954', 'r12b', 'r21e'] + for n in build.ndk: + calls.append(mock.call(n)) + with mock.patch('fdroidserver.common._install_ndk', list_entry): + fdroidserver.common.auto_install_ndk(build) + list_entry.assert_has_calls(calls) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__))