diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 38922cde..da5e72b0 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -486,14 +486,7 @@ def read_config(opts=None): fill_config_defaults(config) if 'serverwebroot' in config: - if isinstance(config['serverwebroot'], str): - roots = [{'url': config['serverwebroot']}] - elif all(isinstance(item, str) for item in config['serverwebroot']): - roots = [{'url': i} for i in config['serverwebroot']] - elif all(isinstance(item, dict) for item in config['serverwebroot']): - roots = config['serverwebroot'] - else: - raise TypeError(_('only accepts strings, lists, and tuples')) + roots = parse_mirrors_config(config['serverwebroot']) rootlist = [] for d in roots: # since this is used with rsync, where trailing slashes have @@ -506,15 +499,7 @@ def read_config(opts=None): config['serverwebroot'] = rootlist if 'servergitmirrors' in config: - if isinstance(config['servergitmirrors'], str): - roots = [{"url": config['servergitmirrors']}] - elif all(isinstance(item, str) for item in config['servergitmirrors']): - roots = [{'url': i} for i in config['servergitmirrors']] - elif all(isinstance(item, dict) for item in config['servergitmirrors']): - roots = config['servergitmirrors'] - else: - raise TypeError(_('only accepts strings, lists, and tuples')) - config['servergitmirrors'] = roots + config['servergitmirrors'] = parse_mirrors_config(config['servergitmirrors']) limit = config['git_mirror_size_limit'] config['git_mirror_size_limit'] = parse_human_readable_size(limit) @@ -557,6 +542,18 @@ def read_config(opts=None): return config +def parse_mirrors_config(mirrors): + """Mirrors can be specified as a string, list of strings, or dictionary map.""" + if isinstance(mirrors, str): + return [{"url": mirrors}] + elif all(isinstance(item, str) for item in mirrors): + return [{'url': i} for i in mirrors] + elif all(isinstance(item, dict) for item in mirrors): + return mirrors + else: + raise TypeError(_('only accepts strings, lists, and tuples')) + + def file_entry(filename, hash_value=None): meta = {} meta["name"] = "/" + filename.split("/", 1)[1] diff --git a/tests/common.TestCase b/tests/common.TestCase index 55202dcc..a92dc92a 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -12,6 +12,7 @@ import logging import optparse import os import re +import ruamel.yaml import shutil import subprocess import sys @@ -2892,6 +2893,27 @@ class CommonTest(unittest.TestCase): fdroidserver.common.read_config()['serverwebroot'], ) + def test_parse_mirrors_config_str(self): + s = 'foo@example.com:/var/www' + mirrors = ruamel.yaml.YAML(typ='safe').load("""'%s'""" % s) + self.assertEqual( + [{'url': s}], fdroidserver.common.parse_mirrors_config(mirrors) + ) + + def test_parse_mirrors_config_list(self): + s = 'foo@example.com:/var/www' + mirrors = ruamel.yaml.YAML(typ='safe').load("""- '%s'""" % s) + self.assertEqual( + [{'url': s}], fdroidserver.common.parse_mirrors_config(mirrors) + ) + + def test_parse_mirrors_config_dict(self): + s = 'foo@example.com:/var/www' + mirrors = ruamel.yaml.YAML(typ='safe').load("""- url: '%s'""" % s) + self.assertEqual( + [{'url': s}], fdroidserver.common.parse_mirrors_config(mirrors) + ) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__))