Do manual unicode handling (instead of using the wrapped os module) in
authorZac Medico <zmedico@gentoo.org>
Tue, 22 Sep 2009 19:48:26 +0000 (19:48 -0000)
committerZac Medico <zmedico@gentoo.org>
Tue, 22 Sep 2009 19:48:26 +0000 (19:48 -0000)
portdbapi.findname2(), since it's a hotspot. Thanks to Marat Radchenko
<marat@slonopotamus.org> for the initial patch.

svn path=/main/trunk/; revision=14378

pym/portage/dbapi/porttree.py

index 90092eaa32726e55d9ccffac51f4f6f464f6ae44..7f20e66fd5d1eeaa4d4b0c49f5fe6ec523519936 100644 (file)
@@ -30,8 +30,10 @@ from portage import eclass_cache, auxdbkeys, doebuild, flatten, \
        _eapi_is_deprecated
 from portage import os
 from portage import _encodings
+from portage import _unicode_decode
 from portage import _unicode_encode
 
+import os as _os
 import codecs
 import logging
 import stat
@@ -448,42 +450,54 @@ class portdbapi(dbapi):
                the file we wanted.
                """
                if not mycpv:
-                       return "",0
+                       return ("", 0)
                mysplit = mycpv.split("/")
                psplit = pkgsplit(mysplit[1])
                if psplit is None or len(mysplit) != 2:
                        raise InvalidPackageName(mycpv)
 
+               # For optimal performace in this hot spot, we do manual unicode
+               # handling here instead of using the wrapped os module.
+               encoding = _encodings['fs']
+               errors = 'strict'
+
                if mytree:
                        mytrees = [mytree]
                else:
                        mytrees = self.porttrees[:]
                        mytrees.reverse()
 
-               relative_path = os.path.join(mysplit[0], psplit[0],
-                       mysplit[1] + ".ebuild")
+               relative_path = mysplit[0] + _os.sep + psplit[0] + _os.sep + \
+                       mysplit[1] + ".ebuild"
 
                if 'parse-eapi-glep-55' in self.doebuild_settings.features:
                        glep55_startswith = '%s.ebuild-' % mysplit[1]
                        for x in mytrees:
-                               filename = x + os.sep + relative_path
-                               if os.access(filename, os.R_OK):
+                               filename = x + _os.sep + relative_path
+                               if _os.access(_unicode_encode(filename,
+                                       encoding=encoding, errors=errors), _os.R_OK):
                                        return (filename, x)
 
-                               pkgdir = os.path.join(x, mysplit[0], psplit[0])
+                               pkgdir = _os.path.join(x, mysplit[0], psplit[0])
                                try:
-                                       files = os.listdir(pkgdir)
+                                       files = _os.listdir(_unicode_encode(pkgdir,
+                                               encoding=encoding, errors=errors))
                                except OSError:
                                        continue
                                for y in files:
+                                       try:
+                                               y = _unicode_decode(y, encoding=encoding, errors=errors)
+                                       except UnicodeDecodeError:
+                                               continue
                                        if y.startswith(glep55_startswith):
-                                               return (os.path.join(pkgdir, y), x)
+                                               return (_os.path.join(pkgdir, y), x)
                else:
                        for x in mytrees:
-                               file = x + os.sep + relative_path
-                               if os.access(file, os.R_OK):
-                                       return[file, x]
-               return None, 0
+                               filename = x + _os.sep + relative_path
+                               if _os.access(_unicode_encode(filename,
+                                       encoding=encoding, errors=errors), _os.R_OK):
+                                       return (filename, x)
+               return (None, 0)
 
        def _metadata_process(self, cpv, ebuild_path, repo_path):
                """