On 6.1.2016 12:33, Christian Heimes wrote:
On 2016-01-05 11:30, Tomas Babej wrote:



On 01/05/2016 08:54 AM, Jan Cholasta wrote:
Hi,

the attached patch replaces the default_encoding_utf8 binary module with
2 lines of equivalent Python code.

Honza




This looks fine to me, however, I wonder, why this approach was ever
taken? The sys.setdefaultencoding is available in all versions of Python
ever supported by FreeIPA.

Is it possible we're missing something here? Or was this option simply
overlooked?

sys.setdefaultencoding() is not available unless you use a hack and
reload the sys module. The function is hidden for a very good reason. It
can and will break internal assumption as well as libraries in bad, hard
to detect ways. For example it wreaks havoc on hashing for dicts and sets.

The blog posting
https://anonbadger.wordpress.com/2015/06/16/why-sys-setdefaultencoding-will-break-code/
explains the problem in much greater detail.

Tomáši, does this answer your question?

Updated patch attached.

--
Jan Cholasta
From ce4202372b5b6bede727bae10101b306d9d3428b Mon Sep 17 00:00:00 2001
From: Jan Cholasta <jchol...@redhat.com>
Date: Tue, 5 Jan 2016 08:49:04 +0100
Subject: [PATCH] ipapython: remove default_encoding_utf8

Replace the "import default_encoding_utf8" in ipalib/cli.py with equivalent
Python code.

https://fedorahosted.org/freeipa/ticket/5596
---
 .gitignore                                         |  1 -
 freeipa.spec.in                                    |  2 -
 ipalib/cli.py                                      | 13 ++---
 ipapython/Makefile                                 |  2 +-
 ipapython/py_default_encoding/Makefile             | 25 ----------
 .../py_default_encoding/default_encoding_utf8.c    | 57 ----------------------
 ipapython/py_default_encoding/setup.py             | 45 -----------------
 ipatests/pytest.ini                                |  1 -
 8 files changed, 4 insertions(+), 142 deletions(-)
 delete mode 100644 ipapython/py_default_encoding/Makefile
 delete mode 100644 ipapython/py_default_encoding/default_encoding_utf8.c
 delete mode 100644 ipapython/py_default_encoding/setup.py

diff --git a/.gitignore b/.gitignore
index 06b017d..9375590 100644
--- a/.gitignore
+++ b/.gitignore
@@ -73,7 +73,6 @@ freeipa2-dev-doc
 /ipapython/setup.py
 /ipapython/version.py
 !/ipapython/Makefile
-!/ipapython/py_default_encoding/Makefile
 !/ipapython/ipap11helper/Makefile
 
 /ipaplatform/__init__.py
diff --git a/freeipa.spec.in b/freeipa.spec.in
index de3ae2f..a963b0f 100644
--- a/freeipa.spec.in
+++ b/freeipa.spec.in
@@ -1309,13 +1309,11 @@ fi
 %{python_sitelib}/ipalib/*
 %dir %{python_sitelib}/ipaplatform
 %{python_sitelib}/ipaplatform/*
-%attr(0644,root,root) %{python_sitearch}/default_encoding_utf8.so
 %attr(0644,root,root) %{python_sitearch}/_ipap11helper.so
 %{python_sitelib}/ipapython-*.egg-info
 %{python_sitelib}/ipalib-*.egg-info
 %{python_sitelib}/freeipa-*.egg-info
 %{python_sitelib}/ipaplatform-*.egg-info
-%{python_sitearch}/python_default_encoding-*.egg-info
 %{python_sitearch}/_ipap11helper-*.egg-info
 
 
diff --git a/ipalib/cli.py b/ipalib/cli.py
index 3b1b5a3..a956485 100644
--- a/ipalib/cli.py
+++ b/ipalib/cli.py
@@ -39,16 +39,9 @@ from six.moves import input
 if six.PY3:
     unicode = str
 
-try:
-    #pylint: disable=F0401
-    import default_encoding_utf8  # pylint: disable=unused-import
-except ImportError:
-    # This is a chicken-and-egg problem. The api can't be imported unless
-    # this is already installed and since it is installed with IPA therein
-    # lies the problem. Skip it for now so ipalib can be imported in-tree
-    # even in cases that IPA isn't installed on the dev machine.
-    # Also, under Python 3, default_encoding_utf8 is not built at all.
-    pass
+if six.PY2:
+    reload(sys)
+    sys.setdefaultencoding('utf-8')     # pylint: disable=no-member
 
 from ipalib import frontend
 from ipalib import backend
diff --git a/ipapython/Makefile b/ipapython/Makefile
index 833f3cd..201c589 100644
--- a/ipapython/Makefile
+++ b/ipapython/Makefile
@@ -1,7 +1,7 @@
 PYTHON ?= /usr/bin/python2
 PYTHONLIBDIR ?= $(shell $(PYTHON) -c "from distutils.sysconfig import *; print(get_python_lib())")
 
-SUBDIRS = py_default_encoding ipap11helper
+SUBDIRS = ipap11helper
 
 all:
 	@for subdir in $(SUBDIRS); do \
diff --git a/ipapython/py_default_encoding/Makefile b/ipapython/py_default_encoding/Makefile
deleted file mode 100644
index a73f429..0000000
--- a/ipapython/py_default_encoding/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
-PYTHON ?= /usr/bin/python2
-PYTHONLIBDIR ?= $(shell $(PYTHON) -c "from distutils.sysconfig import *; print(get_python_lib())")
-PYTHONVERSION ?= $(shell $(PYTHON) -c "import sys; print(sys.version_info[0])")
-
-all:
-	if [ "$(PYTHONVERSION)" = "2" ]; then \
-		python2 setup.py build; \
-	fi
-
-install:
-	# Skip this module under Python 3
-	if [ "$(PYTHONVERSION)" = "2" ]; then \
-		if [ "$(DESTDIR)" = "" ]; then \
-			python2 setup.py install; \
-		else \
-			python2 setup.py install --root $(DESTDIR); \
-		fi; \
-	fi
-
-clean:
-	rm -rf build
-
-distclean: clean
-
-maintainer-clean: distclean
diff --git a/ipapython/py_default_encoding/default_encoding_utf8.c b/ipapython/py_default_encoding/default_encoding_utf8.c
deleted file mode 100644
index 07adf28..0000000
--- a/ipapython/py_default_encoding/default_encoding_utf8.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Authors:
- *   John Dennis <jden...@redhat.com>
- *
- * Copyright (C) 2009  Red Hat
- * see file 'COPYING' for use and warranty information
- *
- * This program is free software you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <Python.h>
-
-PyDoc_STRVAR(setdefaultencoding_doc,
-"setdefaultencoding(encoding='utf-8')\n\
-\n\
-Set the current default string encoding used by the Unicode implementation.\n\
-Defaults to utf-8."
-);
-
-static PyObject *
-setdefaultencoding(PyObject *self, PyObject *args, PyObject *kwds)
-{
-    static char *kwlist[] = {"utf-8", NULL};
-    char *encoding;
-
-    if (!PyArg_ParseTupleAndKeywords(args, kwds, "s:setdefaultencoding", kwlist, &encoding))
-        return NULL;
-
-    if (PyUnicode_SetDefaultEncoding(encoding))
-        return NULL;
-
-    Py_RETURN_NONE;
-}
-
-static PyMethodDef methods[] = {
-    {"setdefaultencoding", (PyCFunction)setdefaultencoding, METH_VARARGS|METH_KEYWORDS, setdefaultencoding_doc},
-	{NULL,		NULL}		/* sentinel */
-};
-
-
-PyMODINIT_FUNC
-initdefault_encoding_utf8(void) 
-{
-    PyUnicode_SetDefaultEncoding("utf-8");
-    Py_InitModule3("default_encoding_utf8", methods, "Forces the default encoding to utf-8");
-}
diff --git a/ipapython/py_default_encoding/setup.py b/ipapython/py_default_encoding/setup.py
deleted file mode 100644
index 6a1af62..0000000
--- a/ipapython/py_default_encoding/setup.py
+++ /dev/null
@@ -1,45 +0,0 @@
-# Authors:
-#   John Dennis <jden...@redhat.com>
-#
-# Copyright (C) 2009  Red Hat
-# see file 'COPYING' for use and warranty information
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-from distutils.core import setup, Extension
-from distutils.sysconfig import get_python_inc
-import sys
-import os
-
-python_header = os.path.join(get_python_inc(plat_specific=0), 'Python.h')
-if not os.path.exists(python_header):
-    sys.exit("Cannot find Python development packages that provide Python.h")
-
-default_encoding_utf8 = Extension('default_encoding_utf8', ['default_encoding_utf8.c'])
-
-setup(name             = 'python-default-encoding',
-      version          = '0.1',
-      description      = 'Forces the default encoding in Python to be utf-8',
-      long_description = 'Forces the default encoding in Python to be utf-8',
-      author           = 'John Dennis',
-      author_email     = 'jden...@redhat.com',
-      maintainer       = 'John Dennis',
-      maintainer_email = 'jden...@redhat.com',
-      license          = 'GPLv3+',
-      platforms        = 'posix',
-      url              = '',
-      download_url     = '',
-      ext_modules      = [default_encoding_utf8],
-)
-
diff --git a/ipatests/pytest.ini b/ipatests/pytest.ini
index 9593227..e38858b 100644
--- a/ipatests/pytest.ini
+++ b/ipatests/pytest.ini
@@ -21,7 +21,6 @@ addopts = --doctest-modules
           --ignore=doc/examples/python-api.py
           --ignore=install/share/copy-schema-to-ca.py
           --ignore=install/share/wsgi.py
-          --ignore=ipapython/py_default_encoding/setup.py
           --ignore=ipapython/ipap11helper/setup.py
 markers =
     tier0: basic unit tests and critical functionality
-- 
2.4.3

-- 
Manage your subscription for the Freeipa-devel mailing list:
https://www.redhat.com/mailman/listinfo/freeipa-devel
Contribute to FreeIPA: http://www.freeipa.org/page/Contribute/Code

Reply via email to