1
0
mirror of https://gitlab.com/fdroid/fdroidserver.git synced 2024-11-04 14:30:11 +01:00

Speed up metadata reading

Total time for `fdroid readmeta` went down from ~1.6s to ~1.4s on my
machine.
This commit is contained in:
Daniel Martí 2015-12-02 22:38:40 +01:00
parent 528e45d22b
commit b9ac6fb69a

View File

@ -298,7 +298,7 @@ class Build():
f = 'vercode' f = 'vercode'
if f not in build_flags: if f not in build_flags:
raise MetaDataException('Unrecognised build flag: ' + f) raise MetaDataException('Unrecognised build flag: ' + f)
setattr(self, f, v) self.__dict__[f] = v
def append_flag(self, f, v): def append_flag(self, f, v):
if f not in build_flags: if f not in build_flags:
@ -329,16 +329,20 @@ class Build():
for f, v in d.iteritems(): for f, v in d.iteritems():
self.set_flag(f, v) self.set_flag(f, v)
list_flags = set(['extlibs', 'srclibs', 'patch', 'rm', 'buildjni', 'preassemble',
'update', 'scanignore', 'scandelete', 'gradle', 'antcommands',
'gradleprops'])
script_flags = set(['init', 'prebuild', 'build'])
bool_flags = set(['submodules', 'oldsdkloc', 'forceversion', 'forcevercode',
'novcheck'])
def flagtype(name): def flagtype(name):
if name in ['extlibs', 'srclibs', 'patch', 'rm', 'buildjni', 'preassemble', if name in list_flags:
'update', 'scanignore', 'scandelete', 'gradle', 'antcommands',
'gradleprops']:
return 'list' return 'list'
if name in ['init', 'prebuild', 'build']: if name in script_flags:
return 'script' return 'script'
if name in ['submodules', 'oldsdkloc', 'forceversion', 'forcevercode', if name in bool_flags:
'novcheck']:
return 'bool' return 'bool'
return 'string' return 'string'
@ -786,32 +790,31 @@ def sorted_builds(builds):
esc_newlines = re.compile('\\\\( |\\n)') esc_newlines = re.compile('\\\\( |\\n)')
# This function uses __dict__ to be faster
def post_metadata_parse(app): def post_metadata_parse(app):
for f in app_fields: for k, v in app.__dict__.iteritems():
v = app.get_field(f)
if type(v) in (float, int): if type(v) in (float, int):
app.set_field(f, str(v)) app.__dict__[f] = str(v)
for build in app.builds: for build in app.builds:
for k in build_flags: for k, v in app.__dict__.iteritems():
v = build.get_flag(k)
if type(v) in (float, int): if type(v) in (float, int):
build.set_flag(k, str(v)) build.__dict__[k] = str(v)
continue continue
ftype = flagtype(k) ftype = flagtype(k)
if ftype == 'script': if ftype == 'script':
build.set_flag(k, re.sub(esc_newlines, '', v).lstrip().rstrip()) build.__dict__[k] = re.sub(esc_newlines, '', v).lstrip().rstrip()
elif ftype == 'bool': elif ftype == 'bool':
# TODO handle this using <xsd:element type="xsd:boolean> in a schema # TODO handle this using <xsd:element type="xsd:boolean> in a schema
if isinstance(v, basestring) and v == 'true': if isinstance(v, basestring) and v == 'true':
build.set_flag(k, True) build.__dict__[k] = True
elif ftype == 'string': elif ftype == 'string':
if isinstance(v, bool) and v: if isinstance(v, bool) and v:
build.set_flag(k, 'yes') build.__dict__[k] = 'yes'
# convert to the odd internal format # convert to the odd internal format
for f in ('Description', 'Maintainer Notes'): for f in ('Description', 'Maintainer Notes'):