chiark / gitweb /
Only do the magic import/except dance once
authorDaniel Martí <mvdan@mvdan.cc>
Wed, 19 Aug 2015 06:46:35 +0000 (23:46 -0700)
committerDaniel Martí <mvdan@mvdan.cc>
Wed, 19 Aug 2015 06:46:35 +0000 (23:46 -0700)
No need to do it for every file, once per app is enough

fdroidserver/common.py

index ec82561342f3c6f4e772733141eed60ec65aa4d3..b5f92d7ae06f28bf2be05132a276fb0ebdbbb70e 100644 (file)
@@ -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):