commit:     e5ba8d096e56495a9b516cea818d48e104d62bca
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Sun Nov 15 21:03:42 2015 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Sun Nov 15 21:18:48 2015 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=e5ba8d09

EAPI 6: Enforce posixish LC_CTYPE

 pym/portage/package/ebuild/config.py | 13 ++++++++++++-
 pym/portage/util/locale.py           | 23 ++++++++++++++++++++---
 2 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/pym/portage/package/ebuild/config.py 
b/pym/portage/package/ebuild/config.py
index 095de37..1827043 100644
--- a/pym/portage/package/ebuild/config.py
+++ b/pym/portage/package/ebuild/config.py
@@ -24,7 +24,7 @@ portage.proxy.lazyimport.lazyimport(globals(),
        'portage.dep.soname.SonameAtom:SonameAtom',
        'portage.dbapi.vartree:vartree',
        'portage.package.ebuild.doebuild:_phase_func_map',
-       'portage.util.locale:split_LC_ALL',
+       'portage.util.locale:check_locale,split_LC_ALL',
 )
 from portage import bsd_chflags, \
        load_mod, os, selinux, _unicode_decode
@@ -2773,6 +2773,17 @@ class config(object):
                if eapi_attrs.posixish_locale:
                        split_LC_ALL(mydict)
                        mydict["LC_COLLATE"] = "C"
+                       if not check_locale(silent=True, env=mydict):
+                               # try another locale
+                               for l in ("C.UTF-8", "en_US.UTF-8", 
"en_GB.UTF-8", "C"):
+                                       mydict["LC_CTYPE"] = l
+                                       if check_locale(silent=True, 
env=mydict):
+                                               # TODO: output the following 
only once
+#                                              writemsg(_("!!! LC_CTYPE 
unsupported, using %s instead\n")
+#                                                              % 
mydict["LC_CTYPE"])
+                                               break
+                               else:
+                                       raise AssertionError("C locale did not 
pass the test!")
 
                return mydict
 

diff --git a/pym/portage/util/locale.py b/pym/portage/util/locale.py
index d902db8..27a2806 100644
--- a/pym/portage/util/locale.py
+++ b/pym/portage/util/locale.py
@@ -8,6 +8,7 @@ locale.
 """
 from __future__ import unicode_literals
 
+import locale
 import logging
 import os
 import textwrap
@@ -26,7 +27,7 @@ locale_categories = (
 )
 
 
-def _check_locale():
+def _check_locale(silent):
        """
        The inner locale check function.
        """
@@ -44,6 +45,9 @@ def _check_locale():
        ruc = [libc.toupper(c) for c in lc]
 
        if lc != rlc or uc != ruc:
+               if silent:
+                       return False
+
                msg = ("WARNING: The LC_CTYPE variable is set to a locale " +
                        "that specifies transformation between lowercase " +
                        "and uppercase ASCII characters that is different than 
" +
@@ -71,7 +75,7 @@ def _check_locale():
        return True
 
 
-def check_locale():
+def check_locale(silent=False, env=None):
        """
        Check whether the locale is sane. Returns True if it is, prints
        warning and returns False if it is not. Returns None if the check
@@ -81,7 +85,20 @@ def check_locale():
        pid = os.fork()
        if pid == 0:
                try:
-                       ret = _check_locale()
+                       if env is not None:
+                               for v in ("LC_ALL", "LC_CTYPE", "LANG"):
+                                       if v in env:
+                                               mylocale = env[v]
+                                               break
+                               else:
+                                       mylocale = "C"
+
+                               try:
+                                       locale.setlocale(locale.LC_CTYPE, 
mylocale)
+                               except locale.Error:
+                                       os._exit(2)
+
+                       ret = _check_locale(silent)
                        if ret is None:
                                os._exit(2)
                        else:

Reply via email to