Update imports to import portage.os (with unicode wrappers), and use
authorZac Medico <zmedico@gentoo.org>
Fri, 14 Aug 2009 22:57:44 +0000 (22:57 -0000)
committerZac Medico <zmedico@gentoo.org>
Fri, 14 Aug 2009 22:57:44 +0000 (22:57 -0000)
_unicode_encode() and _unicode_decode() where appropriate.

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

pym/portage/__init__.py
pym/portage/sets/__init__.py
pym/portage/sets/dbapi.py
pym/portage/sets/files.py
pym/portage/sets/profiles.py
pym/portage/sets/security.py
pym/portage/sets/shell.py

index 87863abdbcc69af9a96e82f4921495b71d4b4421..9d2c033174750bd04251d1092e8469399157c313 100644 (file)
@@ -197,6 +197,9 @@ class _unicode_module_wrapper(object):
                        result = _unicode_func_wrapper(result, encoding=encoding)
                return result
 
+# Assume utf_8 fs encoding everywhere except in merge code.
+_fs_encoding = 'utf_8'
+
 _merge_encoding = sys.getfilesystemencoding()
 
 import os as _os
index 2d85007ec03a8c084b9813daa766fcf99f073429..f52c7fa1abb9ba71bf08d82ffad1b8e113e8cebb 100644 (file)
@@ -5,7 +5,7 @@
 __all__ = ["SETPREFIX", "get_boolean", "SetConfigError",
        "SetConfig", "load_default_config"]
 
-import os
+from portage import os
 from ConfigParser import SafeConfigParser, NoOptionError
 from portage import load_mod
 from portage.const import USER_CONFIG_PATH, GLOBAL_CONFIG_PATH
index 0f82bd1c9b547501cc533ca7a3854e936f28f817..5cd6c6ba1adbea6ff2c536f1cdc0956a69657b68 100644 (file)
@@ -2,6 +2,9 @@
 # Distributed under the terms of the GNU General Public License v2
 # $Id$
 
+import time
+
+from portage import os
 from portage.versions import catpkgsplit, catsplit, pkgcmp, best
 from portage.dep import Atom
 from portage.localization import _
@@ -280,7 +283,6 @@ class AgeSet(EverythingSet):
                self._age = age
 
        def _filter(self, atom):
-               import time, os
        
                cpv = self._db.match(atom)[0]
                path = self._db.getpath(cpv, filename="COUNTER")
index b5ad9a05dad9f5fb53dc76533c4d44653fd7d658..acf556b7f649e99cfdfce6f13e131a953456fa07 100644 (file)
@@ -3,10 +3,13 @@
 # $Id$
 
 import errno
-import os
 import re
 from itertools import chain
 
+from portage import os
+from portage import _fs_encoding
+from portage import _unicode_decode
+from portage import _unicode_encode
 from portage.util import grabfile, write_atomic, ensure_dirs, normalize_path
 from portage.const import PRIVATE_PATH, USER_CONFIG_PATH
 from portage.localization import _
@@ -126,35 +129,43 @@ class StaticFileSet(EditablePackageSet):
                        except KeyError:
                                raise SetConfigError(_("Could not find repository '%s'") % match.groupdict()["reponame"])
 
+               try:
+                       directory = _unicode_decode(directory,
+                               encoding=_fs_encoding, errors='strict')
+                       # Now verify that we can also encode it.
+                       _unicode_encode(directory,
+                               encoding=_fs_encoding, errors='strict')
+               except UnicodeError:
+                       directory = _unicode_decode(directory,
+                               encoding=_fs_encoding, errors='replace')
+                       raise SetConfigError(
+                               _("Directory path contains invalid character(s) for encoding '%s': '%s'") \
+                               % (_fs_encoding, directory))
+
                if os.path.isdir(directory):
                        directory = normalize_path(directory)
 
-                       if isinstance(directory, unicode):
-                               # Avoid UnicodeDecodeError raised from
-                               # os.path.join when called by os.walk.
-                               directory_unicode = directory
-                               directory = directory.encode('utf_8', 'replace')
-                       else:
-                               directory_unicode = unicode(directory,
-                                       encoding='utf_8', errors='replace')
-
                        for parent, dirs, files in os.walk(directory):
-                               if not isinstance(parent, unicode):
-                                       parent = unicode(parent,
-                                               encoding='utf_8', errors='replace')
+                               try:
+                                       parent = _unicode_decode(parent,
+                                               encoding=_fs_encoding, errors='strict')
+                               except UnicodeDecodeError:
+                                       continue
                                for d in dirs[:]:
                                        if d[:1] == '.':
                                                dirs.remove(d)
                                for filename in files:
-                                       if not isinstance(filename, unicode):
-                                               filename = unicode(filename,
-                                                       encoding='utf_8', errors='replace')
+                                       try:
+                                               filename = _unicode_decode(filename,
+                                                       encoding=_fs_encoding, errors='strict')
+                                       except UnicodeDecodeError:
+                                               continue
                                        if filename[:1] == '.':
                                                continue
                                        if filename.endswith(".metadata"):
                                                continue
                                        filename = os.path.join(parent,
-                                               filename)[1 + len(directory_unicode):]
+                                               filename)[1 + len(directory):]
                                        myname = name_pattern.replace("$name", filename)
                                        myname = myname.replace("${name}", filename)
                                        rValue[myname] = StaticFileSet(
index 9c1dcbe866e087975d2385b4b6190d5c1e5ce07d..da3a25e866b0fd243d82eddb702bfac9b96b0c2f 100644 (file)
@@ -3,7 +3,8 @@
 # $Id$
 
 import logging
-import os
+
+from portage import os
 from portage.util import grabfile_package, stack_lists
 from portage.sets.base import PackageSet
 from portage.sets import get_boolean
index 12503d9a5ce5ee5d6741e752a555995b7c980c9a..115c0f3bd61bc0002d2dc583db4ff32e08a5e0af 100644 (file)
@@ -2,9 +2,7 @@
 # Distributed under the terms of the GNU General Public License v2
 # $Id$
 
-import os
 import portage.glsa as glsa
-from portage.util import grabfile, write_atomic
 from portage.sets.base import PackageSet
 from portage.versions import catpkgsplit, pkgcmp
 from portage.sets import get_boolean
index 25ccb03c75688fff2d4bb4cb6eae8d14583760b7..658353ef209f8d9426b0091bfa7a31d4721515dc 100644 (file)
@@ -3,8 +3,9 @@
 # $Id$
 
 import subprocess
-import os
 
+from portage import os
+from portage import _unicode_decode
 from portage.sets.base import PackageSet
 from portage.sets import SetConfigError
 
@@ -35,8 +36,7 @@ class CommandOutputSet(PackageSet):
                pipe = subprocess.Popen(self._command, stdout=subprocess.PIPE, shell=True)
                stdout, stderr = pipe.communicate()
                if pipe.wait() == os.EX_OK:
-                       self._setAtoms(unicode(stdout,
-                               encoding='utf_8', errors='replace').splitlines())
+                       self._setAtoms(_unicode_decode(stdout).splitlines())
 
        def singleBuilder(self, options, settings, trees):
                if not "command" in options: