From 46b1f09de39a1bff9b674430a1fd37fee33f8343 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Tue, 18 Aug 2015 23:46:35 -0700 Subject: [PATCH] Only do the magic import/except dance once No need to do it for every file, once per app is enough --- fdroidserver/common.py | 46 +++++++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index ec825613..b5f92d7a 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1440,7 +1440,7 @@ def getpaths(build_dir, build, field): return paths -def get_mime_type(path): +def init_mime_type(): ''' There are two incompatible versions of the 'magic' module, one that comes as part of libmagic, which is what Debian includes as @@ -1452,25 +1452,49 @@ def get_mime_type(path): libmagic. Hence this function with the following hacks: ''' + init_path = '' + method = '' ms = None + + def mime_from_file(path): + try: + return magic.from_file(path, mime=True) + except UnicodeError: + return None + + def mime_file(path): + try: + return ms.file(path) + except UnicodeError: + return None + + def mime_guess_type(path): + return mimetypes.guess_type(path, strict=False) + try: import magic try: ms = magic.open(magic.MIME_TYPE) ms.load() - result = magic.from_file(path, mime=True) + magic.from_file(init_path, mime=True) + method = 'from_file' except AttributeError: - result = ms.file(path) - except UnicodeError: - logging.warn('Found malformed magic number at %s' % path) - result = None + ms.file(init_path) + method = 'file' except ImportError: import mimetypes mimetypes.init() - result = mimetypes.guess_type(path, strict=False) - if ms is not None: - ms.close() - return result + method = 'guess_type' + + logging.info("Using magic method " + method) + if method == 'from_file': + return mime_from_file + if method == 'file': + return mime_file + if method == 'guess_type': + return mime_guess_type + + logging.critical("unknown magic method!") # Scan the source code in the given directory (and all subdirectories) @@ -1538,6 +1562,8 @@ def scan_source(build_dir, root_dir, thisbuild): logging.error('Found %s at %s' % (what, fd)) return 1 + get_mime_type = init_mime_type() + # Iterate through all files in the source code for r, d, f in os.walk(build_dir, topdown=True):