From b9ac6fb69a973a0f041793c82475724f63242765 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Mart=C3=AD?= Date: Wed, 2 Dec 2015 22:38:40 +0100 Subject: [PATCH] Speed up metadata reading Total time for `fdroid readmeta` went down from ~1.6s to ~1.4s on my machine. --- fdroidserver/metadata.py | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 71115e20..0f833c57 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -298,7 +298,7 @@ class Build(): f = 'vercode' if f not in build_flags: raise MetaDataException('Unrecognised build flag: ' + f) - setattr(self, f, v) + self.__dict__[f] = v def append_flag(self, f, v): if f not in build_flags: @@ -329,16 +329,20 @@ class Build(): for f, v in d.iteritems(): 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): - if name in ['extlibs', 'srclibs', 'patch', 'rm', 'buildjni', 'preassemble', - 'update', 'scanignore', 'scandelete', 'gradle', 'antcommands', - 'gradleprops']: + if name in list_flags: return 'list' - if name in ['init', 'prebuild', 'build']: + if name in script_flags: return 'script' - if name in ['submodules', 'oldsdkloc', 'forceversion', 'forcevercode', - 'novcheck']: + if name in bool_flags: return 'bool' return 'string' @@ -786,32 +790,31 @@ def sorted_builds(builds): esc_newlines = re.compile('\\\\( |\\n)') +# This function uses __dict__ to be faster def post_metadata_parse(app): - for f in app_fields: - v = app.get_field(f) + for k, v in app.__dict__.iteritems(): if type(v) in (float, int): - app.set_field(f, str(v)) + app.__dict__[f] = str(v) for build in app.builds: - for k in build_flags: - v = build.get_flag(k) + for k, v in app.__dict__.iteritems(): if type(v) in (float, int): - build.set_flag(k, str(v)) + build.__dict__[k] = str(v) continue ftype = flagtype(k) 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': # TODO handle this using