commit:     4496ee37d6fa327ada635c67500e82f830141a9e
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Wed Dec 17 17:33:50 2014 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Wed Dec 17 22:12:37 2014 +0000
URL:        
http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=4496ee37

bintree.py: fix str() calls for Python 2 (532784)

Avoid a UnicodeDecodeError raised when str(e) converts an exception
to bytes with Python 2. Since this file has unicode_literals enabled,
use literal unicode format strings to format messages for unicode
exceptions. However, with Python 2, an EnvironmentError exception
may contain either bytes or unicode, so use _unicode(errors="replace")
to ensure safety for EnvironmentError with all locales.

Also, convert remaining str() calls to use _unicode() for uniform
behavior regardless of python version.

X-Gentoo-Bug: 532784
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=532784
Acked-by: Brian Dolbec <dolsen <AT> gentoo.org>

---
 pym/portage/dbapi/bintree.py | 21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/pym/portage/dbapi/bintree.py b/pym/portage/dbapi/bintree.py
index d7c7f95..1156b66 100644
--- a/pym/portage/dbapi/bintree.py
+++ b/pym/portage/dbapi/bintree.py
@@ -391,7 +391,7 @@ class binarytree(object):
                # sanity check
                for atom in (origcp, newcp):
                        if not isjustname(atom):
-                               raise InvalidPackageName(str(atom))
+                               raise InvalidPackageName(_unicode(atom))
                mynewcat = catsplit(newcp)[0]
                origmatches=self.dbapi.cp_list(origcp)
                moves = 0
@@ -803,8 +803,8 @@ class binarytree(object):
 
                                        d["CPV"] = mycpv
                                        d["SLOT"] = slot
-                                       d["MTIME"] = str(s[stat.ST_MTIME])
-                                       d["SIZE"] = str(s.st_size)
+                                       d["MTIME"] = _unicode(s[stat.ST_MTIME])
+                                       d["SIZE"] = _unicode(s.st_size)
 
                                        d.update(zip(self._pkgindex_aux_keys,
                                                self.dbapi.aux_get(mycpv, 
self._pkgindex_aux_keys)))
@@ -1024,7 +1024,11 @@ class binarytree(object):
                        except EnvironmentError as e:
                                writemsg(_("\n\n!!! Error fetching binhost 
package" \
                                        " info from '%s'\n") % 
_hide_url_passwd(base_url))
-                               writemsg("!!! %s\n\n" % str(e))
+                               # With Python 2, the EnvironmentError message 
may
+                               # contain bytes or unicode, so use _unicode to 
ensure
+                               # safety with all locales (bug #532784).
+                               writemsg("!!! %s\n\n" % _unicode(e,
+                                       _encodings["stdio"], errors="replace"))
                                del e
                                pkgindex = None
                        if proc is not None:
@@ -1242,8 +1246,8 @@ class binarytree(object):
 
                d["CPV"] = cpv
                st = os.stat(pkg_path)
-               d["MTIME"] = str(st[stat.ST_MTIME])
-               d["SIZE"] = str(st.st_size)
+               d["MTIME"] = _unicode(st[stat.ST_MTIME])
+               d["SIZE"] = _unicode(st.st_size)
 
                rel_path = self._pkg_paths[cpv]
                # record location if it's non-default
@@ -1270,7 +1274,7 @@ class binarytree(object):
                        if profile_path.startswith(profiles_base):
                                profile_path = profile_path[len(profiles_base):]
                        header["PROFILE"] = profile_path
-               header["VERSION"] = str(self._pkgindex_version)
+               header["VERSION"] = _unicode(self._pkgindex_version)
                base_uri = self.settings.get("PORTAGE_BINHOST_HEADER_URI")
                if base_uri:
                        header["URI"] = base_uri
@@ -1316,8 +1320,7 @@ class binarytree(object):
                                deps = use_reduce(deps, uselist=use, 
token_class=token_class)
                                deps = paren_enclose(deps)
                        except portage.exception.InvalidDependString as e:
-                               writemsg("%s: %s\n" % (k, str(e)),
-                                       noiselevel=-1)
+                               writemsg("%s: %s\n" % (k, e), noiselevel=-1)
                                raise
                        metadata[k] = deps
 

Reply via email to