commit:     a6c2cd5a01ebe894f0a6722909612cf971b99bc0
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Tue Jul 24 09:29:22 2018 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Tue Jul 24 12:45:27 2018 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=a6c2cd5a

dev-python/pygobject: Backport patches for py3.7 support

Closes: https://github.com/gentoo/gentoo/pull/9331

 .../pygobject/files/pygobject-3.24.1-py37.patch    | 255 +++++++++++++++++++++
 dev-python/pygobject/pygobject-3.24.1-r1.ebuild    | 112 +++++++++
 2 files changed, 367 insertions(+)

diff --git a/dev-python/pygobject/files/pygobject-3.24.1-py37.patch 
b/dev-python/pygobject/files/pygobject-3.24.1-py37.patch
new file mode 100644
index 00000000000..31250e3561c
--- /dev/null
+++ b/dev-python/pygobject/files/pygobject-3.24.1-py37.patch
@@ -0,0 +1,255 @@
+From c60ef6a2bcc05010a89328d5fc2704d1aa505e2a Mon Sep 17 00:00:00 2001
+From: Christoph Reiter <reiter.christ...@gmail.com>
+Date: Sat, 10 Mar 2018 18:04:14 +0100
+Subject: [PATCH 1/4] tests_gi: Use capture_output() context manager instead of
+ manually mocking stdout
+
+---
+ tests/helper.py  |  2 +-
+ tests/test_gi.py | 14 +++-----------
+ 2 files changed, 4 insertions(+), 12 deletions(-)
+
+diff --git a/tests/helper.py b/tests/helper.py
+index c4308fee..892cb740 100644
+--- a/tests/helper.py
++++ b/tests/helper.py
+@@ -113,7 +113,7 @@ def capture_glib_deprecation_warnings():
+ @contextlib.contextmanager
+ def capture_output():
+     """
+-    with capture_output as (stdout, stderr):
++    with capture_output() as (stdout, stderr):
+         some_action()
+     print(stdout.getvalue(), stderr.getvalue())
+     """
+diff --git a/tests/test_gi.py b/tests/test_gi.py
+index d0c72b64..3b77ff2d 100644
+--- a/tests/test_gi.py
++++ b/tests/test_gi.py
+@@ -13,7 +13,6 @@ import subprocess
+ import gc
+ import weakref
+ import warnings
+-from io import StringIO, BytesIO
+ 
+ import gi
+ import gi.overrides
+@@ -24,7 +23,7 @@ from gi.repository import GObject, GLib, Gio
+ from gi.repository import GIMarshallingTests
+ 
+ from compathelper import _bytes, _unicode
+-from helper import capture_exceptions
++from helper import capture_exceptions, capture_output
+ 
+ if sys.version_info < (3, 0):
+     CONSTANT_UTF8 = "const \xe2\x99\xa5 utf8"
+@@ -2836,16 +2835,9 @@ class TestModule(unittest.TestCase):
+             self.assertTrue(hasattr(item, '__class__'))
+ 
+     def test_help(self):
+-        orig_stdout = sys.stdout
+-        try:
+-            if sys.version_info < (3, 0):
+-                sys.stdout = BytesIO()
+-            else:
+-                sys.stdout = StringIO()
++        with capture_output() as (stdout, stderr):
+             help(GIMarshallingTests)
+-            output = sys.stdout.getvalue()
+-        finally:
+-            sys.stdout = orig_stdout
++        output = stdout.getvalue()
+ 
+         self.assertTrue('SimpleStruct' in output, output)
+         self.assertTrue('Interface2' in output, output)
+-- 
+2.18.0
+
+From 1826e41cd317ba3c19cf8767b1ef8752f1865aac Mon Sep 17 00:00:00 2001
+From: Christoph Reiter <reiter.christ...@gmail.com>
+Date: Sat, 10 Mar 2018 18:54:28 +0100
+Subject: [PATCH 2/4] IntrospectionModule: __path__ should be List[str] and not
+ str
+
+This fixes a crash when calling help() on the module which got stricter with
+Python 3.7.
+
+It's a bit questionable why the type has __path__ in the first place as
+that's only meant for packages. But let's leave that for now.
+---
+ gi/module.py     | 5 +++--
+ tests/test_gi.py | 6 ++++--
+ 2 files changed, 7 insertions(+), 4 deletions(-)
+
+diff --git a/gi/module.py b/gi/module.py
+index fd8f5080..9e8b5256 100644
+--- a/gi/module.py
++++ b/gi/module.py
+@@ -124,10 +124,11 @@ class IntrospectionModule(object):
+         self._version = version
+         self.__name__ = 'gi.repository.' + namespace
+ 
+-        self.__path__ = repository.get_typelib_path(self._namespace)
++        path = repository.get_typelib_path(self._namespace)
++        self.__path__ = [path]
+         if _have_py3:
+             # get_typelib_path() delivers bytes, not a string
+-            self.__path__ = self.__path__.decode('UTF-8')
++            self.__path__ = [path.decode('UTF-8')]
+ 
+         if self._version is None:
+             self._version = repository.get_version(self._namespace)
+diff --git a/tests/test_gi.py b/tests/test_gi.py
+index 3b77ff2d..2fa0423d 100644
+--- a/tests/test_gi.py
++++ b/tests/test_gi.py
+@@ -2813,8 +2813,10 @@ class TestKeywords(unittest.TestCase):
+ 
+ class TestModule(unittest.TestCase):
+     def test_path(self):
+-        
self.assertTrue(GIMarshallingTests.__path__.endswith('GIMarshallingTests-1.0.typelib'),
+-                        GIMarshallingTests.__path__)
++        path = GIMarshallingTests.__path__
++        assert isinstance(path, list)
++        assert len(path) == 1
++        assert path[0].endswith('GIMarshallingTests-1.0.typelib')
+ 
+     def test_str(self):
+         self.assertTrue("'GIMarshallingTests' from '" in 
str(GIMarshallingTests),
+-- 
+2.18.0
+
+From 8adc8be0a2ab17e5215a4bc6f63a9ee391237596 Mon Sep 17 00:00:00 2001
+From: Christoph Reiter <reiter.christ...@gmail.com>
+Date: Sun, 11 Mar 2018 13:13:30 +0100
+Subject: [PATCH 3/4] _struct_dealloc: handle being called with an error set
+
+With Python 3.7 it gets called with an error set and tp_dealloc
+implementations need to handle that.
+Fix by saving and restoring the error.
+---
+ gi/pygi-struct.c | 12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+diff --git a/gi/pygi-struct.c b/gi/pygi-struct.c
+index 4d5b5411..e2906e0a 100644
+--- a/gi/pygi-struct.c
++++ b/gi/pygi-struct.c
+@@ -61,7 +61,14 @@ out:
+ static void
+ _struct_dealloc (PyGIStruct *self)
+ {
+-    GIBaseInfo *info = _struct_get_info ( (PyObject *) self );
++    GIBaseInfo *info;
++    PyObject *error_type, *error_value, *error_traceback;
++    gboolean have_error = !!PyErr_Occurred ();
++
++    if (have_error)
++        PyErr_Fetch (&error_type, &error_value, &error_traceback);
++
++    info = _struct_get_info ( (PyObject *) self );
+ 
+     if (info != NULL && g_struct_info_is_foreign ( (GIStructInfo *) info)) {
+         pygi_struct_foreign_release (info, pyg_pointer_get_ptr (self));
+@@ -73,6 +80,9 @@ _struct_dealloc (PyGIStruct *self)
+         g_base_info_unref (info);
+     }
+ 
++    if (have_error)
++        PyErr_Restore (error_type, error_value, error_traceback);
++
+     Py_TYPE (self)->tp_free ((PyObject *)self);
+ }
+ 
+-- 
+2.18.0
+
+From 2299d46e7a57a74f734844ae28bfd536e89e5254 Mon Sep 17 00:00:00 2001
+From: Christoph Reiter <reiter.christ...@gmail.com>
+Date: Sat, 10 Mar 2018 20:03:33 +0100
+Subject: [PATCH 4/4] marshal-cleanup: save and restore exception around
+ cleanup
+
+With Python 3.7 some Python API in the cleanup path clears exceptions
+which makes us return NULL in the end without an error set.
+
+Make if safe to call the cleanup functions with an error set by
+saving and restoring exceptions.
+---
+ gi/pygi-marshal-cleanup.c | 25 +++++++++++++++++++++++++
+ 1 file changed, 25 insertions(+)
+
+diff --git a/gi/pygi-marshal-cleanup.c b/gi/pygi-marshal-cleanup.c
+index b4d04bc5..0e4eda3f 100644
+--- a/gi/pygi-marshal-cleanup.c
++++ b/gi/pygi-marshal-cleanup.c
+@@ -93,6 +93,11 @@ pygi_marshal_cleanup_args_from_py_marshal_success 
(PyGIInvokeState   *state,
+                                                    PyGICallableCache *cache)
+ {
+     gssize i;
++    PyObject *error_type, *error_value, *error_traceback;
++    gboolean have_error = !!PyErr_Occurred ();
++
++    if (have_error)
++        PyErr_Fetch (&error_type, &error_value, &error_traceback);
+ 
+     for (i = 0; i < _pygi_callable_cache_args_len (cache); i++) {
+         PyGIArgCache *arg_cache = _pygi_callable_cache_get_arg (cache, i);
+@@ -112,6 +117,9 @@ pygi_marshal_cleanup_args_from_py_marshal_success 
(PyGIInvokeState   *state,
+             state->args[i].arg_cleanup_data = NULL;
+         }
+     }
++
++    if (have_error)
++        PyErr_Restore (error_type, error_value, error_traceback);
+ }
+ 
+ void
+@@ -119,6 +127,12 @@ pygi_marshal_cleanup_args_to_py_marshal_success 
(PyGIInvokeState   *state,
+                                                  PyGICallableCache *cache)
+ {
+     GSList *cache_item;
++    PyObject *error_type, *error_value, *error_traceback;
++    gboolean have_error = !!PyErr_Occurred ();
++
++    if (have_error)
++        PyErr_Fetch (&error_type, &error_value, &error_traceback);
++
+     /* clean up the return if available */
+     if (cache->return_cache != NULL) {
+         PyGIMarshalCleanupFunc cleanup_func = 
cache->return_cache->to_py_cleanup;
+@@ -153,6 +167,9 @@ pygi_marshal_cleanup_args_to_py_marshal_success 
(PyGIInvokeState   *state,
+ 
+         cache_item = cache_item->next;
+     }
++
++    if (have_error)
++        PyErr_Restore (error_type, error_value, error_traceback);
+ }
+ 
+ void
+@@ -161,6 +178,11 @@ pygi_marshal_cleanup_args_from_py_parameter_fail 
(PyGIInvokeState   *state,
+                                                   gssize failed_arg_index)
+ {
+     gssize i;
++    PyObject *error_type, *error_value, *error_traceback;
++    gboolean have_error = !!PyErr_Occurred ();
++
++    if (have_error)
++        PyErr_Fetch (&error_type, &error_value, &error_traceback);
+ 
+     state->failed = TRUE;
+ 
+@@ -192,6 +214,9 @@ pygi_marshal_cleanup_args_from_py_parameter_fail 
(PyGIInvokeState   *state,
+         }
+         state->args[i].arg_cleanup_data = NULL;
+     }
++
++    if (have_error)
++        PyErr_Restore (error_type, error_value, error_traceback);
+ }
+ 
+ void
+-- 
+2.18.0
+

diff --git a/dev-python/pygobject/pygobject-3.24.1-r1.ebuild 
b/dev-python/pygobject/pygobject-3.24.1-r1.ebuild
new file mode 100644
index 00000000000..71ec333741c
--- /dev/null
+++ b/dev-python/pygobject/pygobject-3.24.1-r1.ebuild
@@ -0,0 +1,112 @@
+# Copyright 1999-2018 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+GNOME2_LA_PUNT="yes"
+PYTHON_COMPAT=( python2_7 python3_{4,5,6,7} )
+
+inherit eutils gnome2 python-r1 virtualx
+
+DESCRIPTION="GLib's GObject library bindings for Python"
+HOMEPAGE="https://wiki.gnome.org/Projects/PyGObject";
+
+LICENSE="LGPL-2.1+"
+SLOT="3"
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sh 
~sparc ~x86 ~amd64-fbsd ~x86-fbsd ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos 
~x86-macos ~sparc-solaris ~x64-solaris ~x86-solaris"
+IUSE="+cairo examples test +threads"
+
+REQUIRED_USE="
+       ${PYTHON_REQUIRED_USE}
+       test? ( cairo )
+"
+
+COMMON_DEPEND="${PYTHON_DEPS}
+       >=dev-libs/glib-2.38:2
+       >=dev-libs/gobject-introspection-1.46.0:=
+       virtual/libffi:=
+       cairo? (
+               >=dev-python/pycairo-1.10.0[${PYTHON_USEDEP}]
+               x11-libs/cairo )
+"
+DEPEND="${COMMON_DEPEND}
+       virtual/pkgconfig
+       cairo? ( x11-libs/cairo[glib] )
+       test? (
+               dev-libs/atk[introspection]
+               media-fonts/font-cursor-misc
+               media-fonts/font-misc-misc
+               x11-libs/cairo[glib]
+               x11-libs/gdk-pixbuf:2[introspection,jpeg]
+               x11-libs/gtk+:3[introspection]
+               x11-libs/pango[introspection]
+               python_targets_python2_7? ( 
dev-python/pyflakes[$(python_gen_usedep python2_7)] ) )
+"
+# gnome-base/gnome-common required by eautoreconf
+
+# We now disable introspection support in slot 2 per upstream recommendation
+# (see https://bugzilla.gnome.org/show_bug.cgi?id=642048#c9); however,
+# older versions of slot 2 installed their own site-packages/gi, and
+# slot 3 will collide with them.
+RDEPEND="${COMMON_DEPEND}
+       !<dev-python/pygtk-2.13
+       !<dev-python/pygobject-2.28.6-r50:2[introspection]
+"
+
+PATCHES=(
+       "${FILESDIR}"/pygobject-3.24.1-py37.patch
+)
+
+src_prepare() {
+       # Test fail with xvfb but not X
+       sed -e 's/^.*TEST_NAMES=compat_test_pygtk .*;/echo "Test disabled";/' \
+               -i tests/Makefile.{am,in} || die
+
+       # FAIL: test_cairo_font_options (test_cairo.TestPango)
+       # AssertionError: <type 'cairo.SubpixelOrder'> != <type 'int'>
+       sed -e 's/^.*type(font_opts.get_subpixel_order()), int.*/#/' \
+               -i tests/test_cairo.py || die
+
+       gnome2_src_prepare
+       python_copy_sources
+}
+
+src_configure() {
+       # Hard-enable libffi support since both gobject-introspection and
+       # glib-2.29.x rdepend on it anyway
+       # docs disabled by upstream default since they are very out of date
+       configuring() {
+               gnome2_src_configure \
+                       $(use_enable cairo) \
+                       $(use_enable threads thread)
+
+               # Pyflakes tests work only in python2, bug #516744
+               if use test && [[ ${EPYTHON} != python2.7 ]]; then
+                       sed -e 's/if type pyflakes/if false/' \
+                               -i Makefile || die "sed failed"
+               fi
+       }
+
+       python_foreach_impl run_in_build_dir configuring
+}
+
+src_compile() {
+       python_foreach_impl run_in_build_dir gnome2_src_compile
+}
+
+src_test() {
+       local -x GIO_USE_VFS="local" # prevents odd issues with deleting 
${T}/.gvfs
+       local -x GIO_USE_VOLUME_MONITOR="unix" # prevent udisks-related 
failures in chroots, bug #449484
+       local -x SKIP_PEP8="yes"
+
+       testing() {
+               local -x XDG_CACHE_HOME="${T}/${EPYTHON}"
+               emake -C "${BUILD_DIR}" check
+       }
+       virtx python_foreach_impl testing
+}
+
+src_install() {
+       python_foreach_impl run_in_build_dir gnome2_src_install
+
+       dodoc -r examples
+}

Reply via email to