chiark / gitweb /
Handle duplicate apps in a much cleaner way
authorDaniel Martí <mvdan@mvdan.cc>
Sat, 28 Nov 2015 11:16:23 +0000 (12:16 +0100)
committerDaniel Martí <mvdan@mvdan.cc>
Sat, 28 Nov 2015 13:04:21 +0000 (14:04 +0100)
Don't log and exit in an inner metadata function. Handle it at a higher
level and do a proper exception. This also avoids unnecessary passing of
apps all around.

fdroidserver/import.py
fdroidserver/metadata.py
tests/import.TestCase

index 3256aaef2f83119dd2dbc75ecc6d9aa5cb7c709a..4b419f5a55d0ded654f6581ca99fe9fe06104762 100644 (file)
@@ -174,7 +174,7 @@ def main():
     config = common.read_config(options)
 
     apps = metadata.read_metadata()
-    package, app = metadata.get_default_app_info_list(apps)
+    package, app = metadata.get_default_app_info()
     app['id'] = None
     app['Update Check Mode'] = "Tags"
 
index 16daac152977a2695effdfa3539a1eeba0136ede..fa7b56edceaaea258fa7c605ef65c7f335d446c7 100644 (file)
@@ -519,7 +519,9 @@ def read_metadata(xref=True):
                                + glob.glob(os.path.join('metadata', '*.json'))
                                + glob.glob(os.path.join('metadata', '*.xml'))
                                + glob.glob(os.path.join('metadata', '*.yaml'))):
-        appid, appinfo = parse_metadata(apps, metadatapath)
+        appid, appinfo = parse_metadata(metadatapath)
+        if appid in apps:
+            raise MetaDataException("Found multiple metadata files for " + appid)
         check_metadata(appinfo)
         apps[appid] = appinfo
 
@@ -595,15 +597,11 @@ def split_list_values(s):
     return [v for v in l if v]
 
 
-def get_default_app_info_list(apps, metadatapath=None):
+def get_default_app_info(metadatapath=None):
     if metadatapath is None:
         appid = None
     else:
         appid, _ = common.get_extension(os.path.basename(metadatapath))
-    if appid in apps:
-        logging.critical("'%s' is a duplicate! '%s' is already provided by '%s'"
-                         % (metadatapath, appid, apps[appid]['metadatapath']))
-        sys.exit(1)
 
     thisinfo = {}
     thisinfo.update(app_defaults)
@@ -750,7 +748,7 @@ def _decode_dict(data):
     return rv
 
 
-def parse_metadata(apps, metadatapath):
+def parse_metadata(metadatapath):
     _, ext = common.get_extension(metadatapath)
     accepted = common.config['accepted_formats']
     if ext not in accepted:
@@ -760,21 +758,21 @@ def parse_metadata(apps, metadatapath):
         sys.exit(1)
 
     if ext == 'txt':
-        return parse_txt_metadata(apps, metadatapath)
+        return parse_txt_metadata(metadatapath)
     if ext == 'json':
-        return parse_json_metadata(apps, metadatapath)
+        return parse_json_metadata(metadatapath)
     if ext == 'xml':
-        return parse_xml_metadata(apps, metadatapath)
+        return parse_xml_metadata(metadatapath)
     if ext == 'yaml':
-        return parse_yaml_metadata(apps, metadatapath)
+        return parse_yaml_metadata(metadatapath)
 
     logging.critical('Unknown metadata format: ' + metadatapath)
     sys.exit(1)
 
 
-def parse_json_metadata(apps, metadatapath):
+def parse_json_metadata(metadatapath):
 
-    appid, thisinfo = get_default_app_info_list(apps, metadatapath)
+    appid, thisinfo = get_default_app_info(metadatapath)
 
     # fdroid metadata is only strings and booleans, no floats or ints. And
     # json returns unicode, and fdroidserver still uses plain python strings
@@ -789,9 +787,9 @@ def parse_json_metadata(apps, metadatapath):
     return (appid, thisinfo)
 
 
-def parse_xml_metadata(apps, metadatapath):
+def parse_xml_metadata(metadatapath):
 
-    appid, thisinfo = get_default_app_info_list(apps, metadatapath)
+    appid, thisinfo = get_default_app_info(metadatapath)
 
     tree = ElementTree.ElementTree(file=metadatapath)
     root = tree.getroot()
@@ -839,9 +837,9 @@ def parse_xml_metadata(apps, metadatapath):
     return (appid, thisinfo)
 
 
-def parse_yaml_metadata(apps, metadatapath):
+def parse_yaml_metadata(metadatapath):
 
-    appid, thisinfo = get_default_app_info_list(apps, metadatapath)
+    appid, thisinfo = get_default_app_info(metadatapath)
 
     yamlinfo = yaml.load(open(metadatapath, 'r'), Loader=YamlLoader)
     thisinfo.update(yamlinfo)
@@ -850,7 +848,7 @@ def parse_yaml_metadata(apps, metadatapath):
     return (appid, thisinfo)
 
 
-def parse_txt_metadata(apps, metadatapath):
+def parse_txt_metadata(metadatapath):
 
     linedesc = None
 
@@ -923,7 +921,7 @@ def parse_txt_metadata(apps, metadatapath):
         thisinfo['comments'][key] = list(curcomments)
         del curcomments[:]
 
-    appid, thisinfo = get_default_app_info_list(apps, metadatapath)
+    appid, thisinfo = get_default_app_info(metadatapath)
     metafile = open(metadatapath, "r")
 
     mode = 0
index adcbe1a25af3843fc7049aca0b3c2145942383f2..97d9225d1e739d9f22df263c71799e8ba2edb15f 100755 (executable)
@@ -30,8 +30,7 @@ class ImportTest(unittest.TestCase):
         fdroidserver.common.config['sdk_path'] = '/fake/path/to/android-sdk'
 
         url = 'https://gitlab.com/fdroid/fdroidclient'
-        apps = dict()
-        appid, app = fdroidserver.metadata.get_default_app_info_list(apps)
+        appid, app = fdroidserver.metadata.get_default_app_info()
         app['Update Check Mode'] = "Tags"
         root_dir, src_dir = import_proxy.get_metadata_from_url(app, url)
         self.assertEquals(app['Repo Type'], 'git')