if _encodings['merge'] is None:
_encodings['merge'] = 'ascii'
-def _unicode_encode(s, encoding=_encodings['content'],
- errors='backslashreplace'):
- if sys.hexversion >= 0x3000000:
+if sys.hexversion >= 0x3000000:
+ def _unicode_encode(s, encoding=_encodings['content'], errors='backslashreplace'):
if isinstance(s, str):
s = s.encode(encoding, errors)
- elif isinstance(s, unicode):
- s = s.encode(encoding, errors)
- return s
+ return s
-def _unicode_decode(s, encoding=_encodings['content'], errors='replace'):
- if isinstance(s, bytes):
- if sys.hexversion >= 0x3000000:
+ def _unicode_decode(s, encoding=_encodings['content'], errors='replace'):
+ if isinstance(s, bytes):
s = str(s, encoding=encoding, errors=errors)
- else:
+ return s
+else:
+ def _unicode_encode(s, encoding=_encodings['content'], errors='backslashreplace'):
+ if isinstance(s, unicode):
+ s = s.encode(encoding, errors)
+ return s
+
+ def _unicode_decode(s, encoding=_encodings['content'], errors='replace'):
+ if isinstance(s, bytes):
s = unicode(s, encoding=encoding, errors=errors)
- return s
+ return s
class _unicode_func_wrapper(object):
"""
rval = self._func(*wrapped_args, **wrapped_kwargs)
- if isinstance(rval, (bytes, basestring, list, tuple)):
- if isinstance(rval, (bytes, basestring)):
- rval = _unicode_decode(rval,
- encoding=encoding, errors='replace')
- else:
- decoded_rval = []
- for x in rval:
- try:
- x = _unicode_decode(x, encoding=encoding, errors='strict')
- except UnicodeDecodeError:
- pass
- else:
- decoded_rval.append(x)
-
- if isinstance(rval, tuple):
- rval = tuple(decoded_rval)
+ if isinstance(rval, (list, tuple)):
+ decoded_rval = []
+ for x in rval:
+ try:
+ x = _unicode_decode(x, encoding=encoding, errors='strict')
+ except UnicodeDecodeError:
+ pass
else:
- rval = decoded_rval
+ decoded_rval.append(x)
+
+ if isinstance(rval, tuple):
+ rval = tuple(decoded_rval)
+ else:
+ rval = decoded_rval
+ else:
+ rval = _unicode_decode(rval, encoding=encoding, errors='replace')
return rval
id(_os.fdopen) : _os.fdopen,
id(_os.popen) : _os.popen,
id(_os.read) : _os.read,
+ id(_os.statvfs) : _os.statvfs,
id(_os.system) : _os.system,
}
yield (x, self[x])
def items(self):
- return list(self.items())
+ return list(self.iteritems())
def sync(self, rate=0):
self.sync_rate = rate
encoding=_encodings['repo.content'], errors='backslashreplace')
mydata[k] = v
- for k, v in mydata.items():
+ for k, v in list(mydata.items()):
if not v:
del mydata[k]
mytbz2.recompose_mem(portage.xpak.xpak_mem(mydata))
_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
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):
"""
def _metadata_callback(self, cpv, ebuild_path, repo_path, metadata, mtime):
i = metadata
- if hasattr(metadata, "iteritems"):
+ if hasattr(metadata, "items"):
i = iter(metadata.items())
metadata = dict(i)
base_names = self._vardb._aux_cache["owners"]["base_names"]
# Take inventory of all cached package hashes.
- for name, hash_values in base_names.items():
+ for name, hash_values in list(base_names.items()):
if not isinstance(hash_values, dict):
del base_names[name]
continue
# Delete any stale cache.
stale_hashes = cached_hashes.difference(valid_pkg_hashes)
if stale_hashes:
- for base_name_hash, bucket in base_names.items():
+ for base_name_hash, bucket in list(base_names.items()):
for hash_value in stale_hashes.intersection(bucket):
del bucket[hash_value]
if not bucket:
self.required = frozenset(chain(
enabled_flags,
disabled_flags,
- *list(conditional.values())
+ *conditional.values()
))
self.enabled = frozenset(enabled_flags)
return iter(object.__getattribute__(self, '_get_target')())
def __len__(self):
- return len(object.__getattribute__(self, '_get_target')())
+ try:
+ return len(object.__getattribute__(self, '_get_target')())
+ except TypeError:
+ # For python 3.x with boolean target, len() results in
+ # TypeError, so return 0 or 1.
+ if bool(object.__getattribute__(self, '_get_target')()):
+ return 1
+ else:
+ return 0
def __repr__(self):
return repr(object.__getattribute__(self, '_get_target')())