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__))