# $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 _
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(
# $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
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: