mirror of
https://github.com/f-droid/fdroidserver.git
synced 2025-11-05 15:00:30 +03:00
Handle duplicate apps in a much cleaner way
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.
This commit is contained in:
parent
ce2f4a115c
commit
de12cfdbe1
3 changed files with 19 additions and 22 deletions
|
|
@ -174,7 +174,7 @@ def main():
|
||||||
config = common.read_config(options)
|
config = common.read_config(options)
|
||||||
|
|
||||||
apps = metadata.read_metadata()
|
apps = metadata.read_metadata()
|
||||||
package, app = metadata.get_default_app_info_list(apps)
|
package, app = metadata.get_default_app_info()
|
||||||
app['id'] = None
|
app['id'] = None
|
||||||
app['Update Check Mode'] = "Tags"
|
app['Update Check Mode'] = "Tags"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -519,7 +519,9 @@ def read_metadata(xref=True):
|
||||||
+ glob.glob(os.path.join('metadata', '*.json'))
|
+ glob.glob(os.path.join('metadata', '*.json'))
|
||||||
+ glob.glob(os.path.join('metadata', '*.xml'))
|
+ glob.glob(os.path.join('metadata', '*.xml'))
|
||||||
+ glob.glob(os.path.join('metadata', '*.yaml'))):
|
+ 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)
|
check_metadata(appinfo)
|
||||||
apps[appid] = appinfo
|
apps[appid] = appinfo
|
||||||
|
|
||||||
|
|
@ -595,15 +597,11 @@ def split_list_values(s):
|
||||||
return [v for v in l if v]
|
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:
|
if metadatapath is None:
|
||||||
appid = None
|
appid = None
|
||||||
else:
|
else:
|
||||||
appid, _ = common.get_extension(os.path.basename(metadatapath))
|
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 = {}
|
||||||
thisinfo.update(app_defaults)
|
thisinfo.update(app_defaults)
|
||||||
|
|
@ -750,7 +748,7 @@ def _decode_dict(data):
|
||||||
return rv
|
return rv
|
||||||
|
|
||||||
|
|
||||||
def parse_metadata(apps, metadatapath):
|
def parse_metadata(metadatapath):
|
||||||
_, ext = common.get_extension(metadatapath)
|
_, ext = common.get_extension(metadatapath)
|
||||||
accepted = common.config['accepted_formats']
|
accepted = common.config['accepted_formats']
|
||||||
if ext not in accepted:
|
if ext not in accepted:
|
||||||
|
|
@ -760,21 +758,21 @@ def parse_metadata(apps, metadatapath):
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
if ext == 'txt':
|
if ext == 'txt':
|
||||||
return parse_txt_metadata(apps, metadatapath)
|
return parse_txt_metadata(metadatapath)
|
||||||
if ext == 'json':
|
if ext == 'json':
|
||||||
return parse_json_metadata(apps, metadatapath)
|
return parse_json_metadata(metadatapath)
|
||||||
if ext == 'xml':
|
if ext == 'xml':
|
||||||
return parse_xml_metadata(apps, metadatapath)
|
return parse_xml_metadata(metadatapath)
|
||||||
if ext == 'yaml':
|
if ext == 'yaml':
|
||||||
return parse_yaml_metadata(apps, metadatapath)
|
return parse_yaml_metadata(metadatapath)
|
||||||
|
|
||||||
logging.critical('Unknown metadata format: ' + metadatapath)
|
logging.critical('Unknown metadata format: ' + metadatapath)
|
||||||
sys.exit(1)
|
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
|
# fdroid metadata is only strings and booleans, no floats or ints. And
|
||||||
# json returns unicode, and fdroidserver still uses plain python strings
|
# json returns unicode, and fdroidserver still uses plain python strings
|
||||||
|
|
@ -789,9 +787,9 @@ def parse_json_metadata(apps, metadatapath):
|
||||||
return (appid, thisinfo)
|
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)
|
tree = ElementTree.ElementTree(file=metadatapath)
|
||||||
root = tree.getroot()
|
root = tree.getroot()
|
||||||
|
|
@ -839,9 +837,9 @@ def parse_xml_metadata(apps, metadatapath):
|
||||||
return (appid, thisinfo)
|
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)
|
yamlinfo = yaml.load(open(metadatapath, 'r'), Loader=YamlLoader)
|
||||||
thisinfo.update(yamlinfo)
|
thisinfo.update(yamlinfo)
|
||||||
|
|
@ -850,7 +848,7 @@ def parse_yaml_metadata(apps, metadatapath):
|
||||||
return (appid, thisinfo)
|
return (appid, thisinfo)
|
||||||
|
|
||||||
|
|
||||||
def parse_txt_metadata(apps, metadatapath):
|
def parse_txt_metadata(metadatapath):
|
||||||
|
|
||||||
linedesc = None
|
linedesc = None
|
||||||
|
|
||||||
|
|
@ -923,7 +921,7 @@ def parse_txt_metadata(apps, metadatapath):
|
||||||
thisinfo['comments'][key] = list(curcomments)
|
thisinfo['comments'][key] = list(curcomments)
|
||||||
del curcomments[:]
|
del curcomments[:]
|
||||||
|
|
||||||
appid, thisinfo = get_default_app_info_list(apps, metadatapath)
|
appid, thisinfo = get_default_app_info(metadatapath)
|
||||||
metafile = open(metadatapath, "r")
|
metafile = open(metadatapath, "r")
|
||||||
|
|
||||||
mode = 0
|
mode = 0
|
||||||
|
|
|
||||||
|
|
@ -30,8 +30,7 @@ class ImportTest(unittest.TestCase):
|
||||||
fdroidserver.common.config['sdk_path'] = '/fake/path/to/android-sdk'
|
fdroidserver.common.config['sdk_path'] = '/fake/path/to/android-sdk'
|
||||||
|
|
||||||
url = 'https://gitlab.com/fdroid/fdroidclient'
|
url = 'https://gitlab.com/fdroid/fdroidclient'
|
||||||
apps = dict()
|
appid, app = fdroidserver.metadata.get_default_app_info()
|
||||||
appid, app = fdroidserver.metadata.get_default_app_info_list(apps)
|
|
||||||
app['Update Check Mode'] = "Tags"
|
app['Update Check Mode'] = "Tags"
|
||||||
root_dir, src_dir = import_proxy.get_metadata_from_url(app, url)
|
root_dir, src_dir = import_proxy.get_metadata_from_url(app, url)
|
||||||
self.assertEquals(app['Repo Type'], 'git')
|
self.assertEquals(app['Repo Type'], 'git')
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue