Hello community,

here is the log from the commit of package python-eventlet for openSUSE:Factory 
checked in at 2020-12-12 20:29:53
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-eventlet (Old)
 and      /work/SRC/openSUSE:Factory/.python-eventlet.new.2328 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-eventlet"

Sat Dec 12 20:29:53 2020 rev:36 rq:854888 version:0.29.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-eventlet/python-eventlet.changes  
2020-08-25 12:38:29.925411431 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-eventlet.new.2328/python-eventlet.changes    
    2020-12-12 20:32:16.005845931 +0100
@@ -1,0 +2,32 @@
+Thu Dec 10 22:43:44 UTC 2020 - Benjamin Greiner <c...@bnavigator.de>
+
+- Add pr_672-remove-OpenSSL-tsafe.patch to support pyopenssl 20
+- skip some tests which are flaky inside OBS environment
+- fix python2 build requirement for Leap
+
+-------------------------------------------------------------------
+Mon Dec  7 00:14:23 UTC 2020 - Benjamin Greiner <c...@bnavigator.de>
+
+- Update to 0.29.1
+  * patcher: [py27] recursion error in pytest/python2.7 installing 
+    register_at_fork
+  * patcher: monkey_patch(builtins=True) failed on py3 because 
+    `file` class is gone
+  * don't crash on PyPy 7.0.0   
+  * Only install monotonic on python2 
+- Changes for 0.29.0
+  * ssl: context wrapped listener fails accept()
+- Changes for 0.28.1
+  * Clean up TypeError in __del__
+- Changes for 0.28.0
+  * Always remove the right listener from the hub 
+    gh#enventlet/eventlet#645
+- Changes for 0.27.0
+  * patcher: Clean up threading book-keeping at fork when
+    monkey-patched
+  * backdoor: handle disconnects better
+- Fix test skips for non-default python 3.6 flavor
+  gh#openSUSE/python-rpm-macros#66
+- refresh newdnspython.patch
+
+-------------------------------------------------------------------

Old:
----
  eventlet-0.26.1.tar.gz

New:
----
  eventlet-0.29.1.tar.gz
  pr_672-remove-OpenSSL-tsafe.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-eventlet.spec ++++++
--- /var/tmp/diff_new_pack.Vh9rHN/_old  2020-12-12 20:32:16.781846741 +0100
+++ /var/tmp/diff_new_pack.Vh9rHN/_new  2020-12-12 20:32:16.785846745 +0100
@@ -18,7 +18,7 @@
 
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-eventlet
-Version:        0.26.1
+Version:        0.29.1
 Release:        0
 Summary:        Concurrent networking library for Python
 License:        MIT
@@ -35,15 +35,19 @@
 Patch2:         pr_639.patch
 # Really remove the dependency on nose
 Patch3:         remove_nose_part_2.patch
+# PATCH-FIX-UPSTREAM -- gh#eventlet/eventlet#672 remove OpenSSL.tsafe
+Patch4:         pr_672-remove-OpenSSL-tsafe.patch
 BuildRequires:  %{python_module dnspython >= 1.15.0}
 BuildRequires:  %{python_module greenlet >= 0.3}
-BuildRequires:  %{python_module monotonic >= 1.4}
 BuildRequires:  %{python_module pyOpenSSL}
 BuildRequires:  %{python_module pytest}
 BuildRequires:  %{python_module pyzmq}
 BuildRequires:  %{python_module setuptools}
 BuildRequires:  %{python_module six >= 1.10.0}
 BuildRequires:  %{python_module testsuite}
+%if 0%{?suse_version} < 1550
+BuildRequires:  python2-monotonic >= 1.4
+%endif
 BuildRequires:  fdupes
 BuildRequires:  netcfg
 BuildRequires:  python-rpm-macros
@@ -53,7 +57,9 @@
 Requires:       netcfg
 Requires:       python-dnspython >= 1.15.0
 Requires:       python-greenlet >= 0.3
+%ifpython2
 Requires:       python-monotonic >= 1.4
+%endif
 Requires:       python-six >= 1.10.0
 BuildArch:      noarch
 %python_subpackages
@@ -85,25 +91,29 @@
 
 %check
 # python2 is required to build for Leap, but tests fail (even upstream)
-python2_skipall='--collect-only'
+python2_pytest_param='--collect-only'
 # dnspython 1 and 2: backdoor tests fail with "take too long"
 skiptests="(BackdoorTest and test_server)"
 # fail only with dnspython 2:
 skiptests+=" or test_dns_methods_are_green or test_noraise_dns_tcp"
+# These are flaky inside the OBS environment
+skiptests+=" or test_fork_after_monkey_patch or test_send_1k_req_rep or 
test_cpu_usage_after_bind"
 
-# Unknown openSUSE 15.x specific errors
+# Unknown Python 3.6 specific errors
 # TypeError: _wrap_socket() argument 1 must be _socket.socket, not SSLSocket
 # https://github.com/rthalley/dnspython/issues/559#issuecomment-675274960
+python36_skiptests+=" or test_connect_ssl or test_ssl_sending_messages or 
test_wrap_ssl"
+python36_skiptests+=" or ssl_test or wsgi_test"
 %if %python3_version_nodots == 36
-  skiptests+=" or test_connect_ssl or test_ssl_sending_messages or 
test_wrap_ssl"
-  skiptests+=" or ssl_test or wsgi_test"
+python3_skiptests+="$python36_skiptests"
 %endif
 # no subdir recursion 
https://github.com/eventlet/eventlet/issues/638#issuecomment-676085599
-%pytest -o norecursedirs="tests/*" -k "not ($skiptests)" ${$python_skipall}
+%pytest -o norecursedirs="tests/*" -k "not ($skiptests ${$python_skiptests})" 
${$python_pytest_param}
 
 %files %{python_files}
 %license LICENSE
 %doc AUTHORS NEWS README.rst
-%{python_sitelib}/*
+%{python_sitelib}/eventlet
+%{python_sitelib}/eventlet-%{version}*-info
 
 %changelog

++++++ eventlet-0.26.1.tar.gz -> eventlet-0.29.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eventlet-0.26.1/NEWS new/eventlet-0.29.1/NEWS
--- old/eventlet-0.26.1/NEWS    2020-07-30 23:48:00.000000000 +0200
+++ new/eventlet-0.29.1/NEWS    2020-10-22 09:16:46.000000000 +0200
@@ -1,3 +1,29 @@
+0.29.1
+======
+patcher: [py27] recursion error in pytest/python2.7 installing 
register_at_fork https://github.com/eventlet/eventlet/issues/660
+patcher: monkey_patch(builtins=True) failed on py3 because `file` class is 
gone https://github.com/eventlet/eventlet/issues/541
+don't crash on PyPy 7.0.0 https://github.com/eventlet/eventlet/pull/547
+Only install monotonic on python2 https://github.com/eventlet/eventlet/pull/583
+
+0.29.0
+======
+* ssl: context wrapped listener fails accept() 
https://github.com/eventlet/eventlet/issues/651
+
+0.28.1
+======
+* Sorry, Eventlet was broken on Windows for versions 0.27-0.28
+  patcher: no os.register_at_fork on Windows (#654)
+* Clean up TypeError in __del__
+
+0.28.0
+======
+* Always remove the right listener from the hub 
https://github.com/eventlet/eventlet/pull/645
+
+0.27.0
+======
+* patcher: Clean up threading book-keeping at fork when monkey-patched
+* backdoor: handle disconnects better
+
 0.26.1
 ======
 * pin dnspython <2.0.0 https://github.com/eventlet/eventlet/issues/619
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eventlet-0.26.1/PKG-INFO new/eventlet-0.29.1/PKG-INFO
--- old/eventlet-0.26.1/PKG-INFO        2020-07-30 23:48:27.000000000 +0200
+++ new/eventlet-0.29.1/PKG-INFO        2020-10-22 09:17:28.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: eventlet
-Version: 0.26.1
+Version: 0.29.1
 Summary: Highly concurrent networking library
 Home-page: http://eventlet.net
 Author: Linden Lab
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eventlet-0.26.1/eventlet/__init__.py 
new/eventlet-0.29.1/eventlet/__init__.py
--- old/eventlet-0.26.1/eventlet/__init__.py    2020-07-30 23:46:33.000000000 
+0200
+++ new/eventlet-0.29.1/eventlet/__init__.py    2020-10-22 09:14:16.000000000 
+0200
@@ -1,7 +1,7 @@
 import os
 
 
-version_info = (0, 26, 1)
+version_info = (0, 29, 1)
 __version__ = '.'.join(map(str, version_info))
 # This is to make Debian packaging easier, it ignores import
 # errors of greenlet so that the packager can still at least
@@ -21,8 +21,11 @@
     # Helpful when CPython < 3.5 on Linux blocked in `os.waitpid(-1)` before 
first use of hub.
     # Example: gunicorn
     # https://github.com/eventlet/eventlet/issues/401#issuecomment-327500352
-    import monotonic
-    del monotonic
+    try:
+        import monotonic
+        del monotonic
+    except ImportError:
+        pass
 
     connect = convenience.connect
     listen = convenience.listen
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eventlet-0.26.1/eventlet/backdoor.py 
new/eventlet-0.29.1/eventlet/backdoor.py
--- old/eventlet-0.26.1/eventlet/backdoor.py    2020-07-30 18:25:18.000000000 
+0200
+++ new/eventlet-0.29.1/eventlet/backdoor.py    2020-10-22 04:46:21.000000000 
+0200
@@ -32,8 +32,12 @@
         pass
 
     def write(self, data, *a, **kw):
-        self.f.write(data, *a, **kw)
-        self.f.flush()
+        try:
+            self.f.write(data, *a, **kw)
+            self.f.flush()
+        except socket.error as e:
+            if get_errno(e) != errno.EPIPE:
+                raise
 
     def readline(self, *a):
         return self.f.readline(*a).replace('\r\n', '\n')
@@ -99,14 +103,18 @@
 
     print("backdoor server listening on %s" % (listening_on,))
     try:
-        try:
-            while True:
+        while True:
+            socketpair = None
+            try:
                 socketpair = sock.accept()
                 backdoor(socketpair, locals)
-        except socket.error as e:
-            # Broken pipe means it was shutdown
-            if get_errno(e) != errno.EPIPE:
-                raise
+            except socket.error as e:
+                # Broken pipe means it was shutdown
+                if get_errno(e) != errno.EPIPE:
+                    raise
+            finally:
+                if socketpair:
+                    socketpair[0].close()
     finally:
         sock.close()
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eventlet-0.26.1/eventlet/green/builtin.py 
new/eventlet-0.29.1/eventlet/green/builtin.py
--- old/eventlet-0.26.1/eventlet/green/builtin.py       2020-07-30 
18:25:18.000000000 +0200
+++ new/eventlet-0.29.1/eventlet/green/builtin.py       2020-10-22 
08:30:23.000000000 +0200
@@ -13,22 +13,26 @@
 from eventlet.hubs import hub
 from eventlet.patcher import slurp_properties
 import sys
+import six
 
 __all__ = dir(builtins_orig)
-__patched__ = ['file', 'open']
+__patched__ = ['open']
+if six.PY2:
+    __patched__ += ['file']
 
 slurp_properties(builtins_orig, globals(),
                  ignore=__patched__, srckeys=dir(builtins_orig))
 
 hubs.get_hub()
 
-__original_file = file
+if six.PY2:
+    __original_file = file
 
+    class file(__original_file):
+        def __init__(self, *args, **kwargs):
+            super(file, self).__init__(*args, **kwargs)
+            hubs.notify_opened(self.fileno())
 
-class file(__original_file):
-    def __init__(self, *args, **kwargs):
-        super(file, self).__init__(*args, **kwargs)
-        hubs.notify_opened(self.fileno())
 
 __original_open = open
 __opening = False
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eventlet-0.26.1/eventlet/green/ssl.py 
new/eventlet-0.29.1/eventlet/green/ssl.py
--- old/eventlet-0.26.1/eventlet/green/ssl.py   2020-07-30 18:25:18.000000000 
+0200
+++ new/eventlet-0.29.1/eventlet/green/ssl.py   2020-10-22 04:46:21.000000000 
+0200
@@ -404,14 +404,11 @@
 
         new_ssl = type(self)(
             newsock,
-            keyfile=self.keyfile,
-            certfile=self.certfile,
             server_side=True,
-            cert_reqs=self.cert_reqs,
-            ssl_version=self.ssl_version,
-            ca_certs=self.ca_certs,
             do_handshake_on_connect=False,
-            suppress_ragged_eofs=self.suppress_ragged_eofs)
+            suppress_ragged_eofs=self.suppress_ragged_eofs,
+            _context=self._context,
+        )
         return (new_ssl, addr)
 
     def dup(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eventlet-0.26.1/eventlet/greenio/py2.py 
new/eventlet-0.29.1/eventlet/greenio/py2.py
--- old/eventlet-0.26.1/eventlet/greenio/py2.py 2020-07-30 18:25:18.000000000 
+0200
+++ new/eventlet-0.29.1/eventlet/greenio/py2.py 2020-10-22 04:46:21.000000000 
+0200
@@ -207,7 +207,10 @@
         was_closed = self._mark_as_closed()
         if was_closed:
             return
-        notify_close(self._fileno)
+        if notify_close:
+            # If closing from __del__, notify_close may have
+            # already been cleaned up and set to None
+            notify_close(self._fileno)
         try:
             os.close(self._fileno)
         except:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eventlet-0.26.1/eventlet/hubs/hub.py 
new/eventlet-0.29.1/eventlet/hubs/hub.py
--- old/eventlet-0.26.1/eventlet/hubs/hub.py    2020-07-30 18:25:18.000000000 
+0200
+++ new/eventlet-0.29.1/eventlet/hubs/hub.py    2020-10-22 08:30:23.000000000 
+0200
@@ -22,7 +22,11 @@
 import eventlet.hubs
 from eventlet.hubs import timer
 from eventlet.support import greenlets as greenlet, clear_sys_exc_info
-import monotonic
+try:
+    from monotonic import monotonic
+except ImportError:
+    from time import monotonic
+
 import six
 
 g_prevent_multiple_readers = True
@@ -120,7 +124,7 @@
         self.closed = []
 
         if clock is None:
-            clock = monotonic.monotonic
+            clock = monotonic
         self.clock = clock
 
         self.greenlet = greenlet.greenlet(self.run)
@@ -225,14 +229,18 @@
 
         fileno = listener.fileno
         evtype = listener.evtype
-        self.listeners[evtype].pop(fileno, None)
-        # migrate a secondary listener to be the primary listener
-        if fileno in self.secondaries[evtype]:
-            sec = self.secondaries[evtype].get(fileno, None)
-            if not sec:
-                return
-            self.listeners[evtype][fileno] = sec.pop(0)
-            if not sec:
+        if listener is self.listeners[evtype][fileno]:
+            del self.listeners[evtype][fileno]
+            # migrate a secondary listener to be the primary listener
+            if fileno in self.secondaries[evtype]:
+                sec = self.secondaries[evtype][fileno]
+                if sec:
+                    self.listeners[evtype][fileno] = sec.pop(0)
+                if not sec:
+                    del self.secondaries[evtype][fileno]
+        else:
+            self.secondaries[evtype][fileno].remove(listener)
+            if not self.secondaries[evtype][fileno]:
                 del self.secondaries[evtype][fileno]
 
     def mark_as_reopened(self, fileno):
@@ -247,16 +255,23 @@
     def remove_descriptor(self, fileno):
         """ Completely remove all listeners for this fileno.  For internal use
         only."""
+        # gather any listeners we have
         listeners = []
-        listeners.append(self.listeners[READ].pop(fileno, noop))
-        listeners.append(self.listeners[WRITE].pop(fileno, noop))
-        listeners.extend(self.secondaries[READ].pop(fileno, ()))
-        listeners.extend(self.secondaries[WRITE].pop(fileno, ()))
+        listeners.append(self.listeners[READ].get(fileno, noop))
+        listeners.append(self.listeners[WRITE].get(fileno, noop))
+        listeners.extend(self.secondaries[READ].get(fileno, ()))
+        listeners.extend(self.secondaries[WRITE].get(fileno, ()))
         for listener in listeners:
             try:
+                # listener.cb may want to remove(listener)
                 listener.cb(fileno)
             except Exception:
                 self.squelch_generic_exception(sys.exc_info())
+        # NOW this fileno is now dead to all
+        self.listeners[READ].pop(fileno, None)
+        self.listeners[WRITE].pop(fileno, None)
+        self.secondaries[READ].pop(fileno, None)
+        self.secondaries[WRITE].pop(fileno, None)
 
     def close_one(self):
         """ Triggered from the main run loop. If a listener's underlying FD was
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eventlet-0.26.1/eventlet/patcher.py 
new/eventlet-0.29.1/eventlet/patcher.py
--- old/eventlet-0.26.1/eventlet/patcher.py     2020-07-30 18:25:18.000000000 
+0200
+++ new/eventlet-0.29.1/eventlet/patcher.py     2020-10-22 08:31:17.000000000 
+0200
@@ -1,5 +1,11 @@
 import imp
 import sys
+try:
+    # Only for this purpose, it's irrelevant if `os` was already patched.
+    # https://github.com/eventlet/eventlet/pull/661
+    from os import register_at_fork
+except ImportError:
+    register_at_fork = None
 
 import eventlet
 import six
@@ -298,6 +304,7 @@
             # tell us whether or not we succeeded
             pass
 
+    _threading = original('threading')
     imp.acquire_lock()
     try:
         for name, mod in modules_to_patch:
@@ -312,6 +319,28 @@
             for attr_name in deleted:
                 if hasattr(orig_mod, attr_name):
                     delattr(orig_mod, attr_name)
+
+            # https://github.com/eventlet/eventlet/issues/592
+            if name == 'threading' and register_at_fork:
+                def fix_threading_active(
+                    _global_dict=_threading.current_thread.__globals__,
+                    # alias orig_mod as patched to reflect its new state
+                    # 
https://github.com/eventlet/eventlet/pull/661#discussion_r509877481
+                    _patched=orig_mod,
+                ):
+                    _prefork_active = [None]
+
+                    def before_fork():
+                        _prefork_active[0] = _global_dict['_active']
+                        _global_dict['_active'] = _patched._active
+
+                    def after_fork():
+                        _global_dict['_active'] = _prefork_active[0]
+
+                    register_at_fork(
+                        before=before_fork,
+                        after_in_parent=after_fork)
+                fix_threading_active()
     finally:
         imp.release_lock()
 
@@ -359,18 +388,25 @@
     import eventlet.green.thread
     lock_type = type(threading.Lock())
     rlock_type = type(threading.RLock())
-    if sys.version_info[0] >= 3:
+    if hasattr(threading, '_PyRLock'):
+        # this happens on CPython3 and PyPy >= 7.0.0: "py3-style" rlocks, they
+        # are implemented natively in C and RPython respectively
+        py3_style = True
         pyrlock_type = type(threading._PyRLock())
+    else:
+        # this happens on CPython2.7 and PyPy < 7.0.0: "py2-style" rlocks,
+        # they are implemented in pure-python
+        py3_style = False
+        pyrlock_type = None
+
     # We're monkey-patching so there can't be any greenlets yet, ergo our 
thread
     # ID is the only valid owner possible.
     tid = eventlet.green.thread.get_ident()
     for obj in gc.get_objects():
         if isinstance(obj, rlock_type):
-            if (sys.version_info[0] == 2 and
-                    isinstance(obj._RLock__block, lock_type)):
+            if not py3_style and isinstance(obj._RLock__block, lock_type):
                 _fix_py2_rlock(obj, tid)
-            elif (sys.version_info[0] >= 3 and
-                    not isinstance(obj, pyrlock_type)):
+            elif py3_style and not isinstance(obj, pyrlock_type):
                 _fix_py3_rlock(obj)
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eventlet-0.26.1/eventlet.egg-info/PKG-INFO 
new/eventlet-0.29.1/eventlet.egg-info/PKG-INFO
--- old/eventlet-0.26.1/eventlet.egg-info/PKG-INFO      2020-07-30 
23:48:26.000000000 +0200
+++ new/eventlet-0.29.1/eventlet.egg-info/PKG-INFO      2020-10-22 
09:17:28.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: eventlet
-Version: 0.26.1
+Version: 0.29.1
 Summary: Highly concurrent networking library
 Home-page: http://eventlet.net
 Author: Linden Lab
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eventlet-0.26.1/eventlet.egg-info/SOURCES.txt 
new/eventlet-0.29.1/eventlet.egg-info/SOURCES.txt
--- old/eventlet-0.26.1/eventlet.egg-info/SOURCES.txt   2020-07-30 
23:48:26.000000000 +0200
+++ new/eventlet-0.29.1/eventlet.egg-info/SOURCES.txt   2020-10-22 
09:17:28.000000000 +0200
@@ -217,10 +217,12 @@
 tests/isolated/hub_use_hub_class.py
 tests/isolated/mysqldb_monkey_patch.py
 tests/isolated/patcher_blocking_select_methods_are_deleted.py
+tests/isolated/patcher_builtin.py
 tests/isolated/patcher_existing_locks_early.py
 tests/isolated/patcher_existing_locks_late.py
 tests/isolated/patcher_existing_locks_locked.py
 tests/isolated/patcher_existing_locks_unlocked.py
+tests/isolated/patcher_fork_after_monkey_patch.py
 tests/isolated/patcher_import_patched_defaults.py
 tests/isolated/patcher_importlib_lock.py
 tests/isolated/patcher_socketserver_selectors.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eventlet-0.26.1/eventlet.egg-info/requires.txt 
new/eventlet-0.29.1/eventlet.egg-info/requires.txt
--- old/eventlet-0.26.1/eventlet.egg-info/requires.txt  2020-07-30 
23:48:26.000000000 +0200
+++ new/eventlet-0.29.1/eventlet.egg-info/requires.txt  2020-10-22 
09:17:28.000000000 +0200
@@ -1,4 +1,6 @@
 dnspython<2.0.0,>=1.15.0
 greenlet>=0.3
-monotonic>=1.4
 six>=1.10.0
+
+[:python_version < "3.5"]
+monotonic>=1.4
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eventlet-0.26.1/setup.py new/eventlet-0.29.1/setup.py
--- old/eventlet-0.26.1/setup.py        2020-07-30 23:42:21.000000000 +0200
+++ new/eventlet-0.29.1/setup.py        2020-10-22 08:30:23.000000000 +0200
@@ -17,7 +17,7 @@
     install_requires=(
         'dnspython >= 1.15.0, < 2.0.0',
         'greenlet >= 0.3',
-        'monotonic >= 1.4',
+        'monotonic >= 1.4;python_version<"3.5"',
         'six >= 1.10.0',
     ),
     zip_safe=False,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eventlet-0.26.1/tests/__init__.py 
new/eventlet-0.29.1/tests/__init__.py
--- old/eventlet-0.26.1/tests/__init__.py       2020-07-30 18:25:18.000000000 
+0200
+++ new/eventlet-0.29.1/tests/__init__.py       2020-10-22 04:46:21.000000000 
+0200
@@ -323,8 +323,8 @@
 
 def run_python(path, env=None, args=None, timeout=None, 
pythonpath_extend=None, expect_pass=False):
     new_argv = [sys.executable]
-    if sys.version_info[:2] <= (2, 6):
-        new_argv += ['-W', 'ignore::DeprecationWarning']
+    if sys.version_info[:2] <= (2, 7):
+        new_argv += ['-W', 'ignore:Python 2 is no longer supported']
     new_env = os.environ.copy()
     new_env.setdefault('eventlet_test_in_progress', 'yes')
     src_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eventlet-0.26.1/tests/backdoor_test.py 
new/eventlet-0.29.1/tests/backdoor_test.py
--- old/eventlet-0.26.1/tests/backdoor_test.py  2020-07-30 18:25:18.000000000 
+0200
+++ new/eventlet-0.29.1/tests/backdoor_test.py  2020-10-22 04:46:21.000000000 
+0200
@@ -57,3 +57,19 @@
         client = socket.socket(socket.AF_UNIX)
         client.connect(SOCKET_PATH)
         self._run_test_on_client_and_server(client, serv)
+
+    def test_quick_client_disconnect(self):
+        listener = socket.socket()
+        listener.bind(('localhost', 0))
+        listener.listen(50)
+        serv = eventlet.spawn(backdoor.backdoor_server, listener)
+        client = socket.socket()
+        client.connect(('localhost', listener.getsockname()[1]))
+        client.close()
+        # can still reconnect; server is running
+        client = socket.socket()
+        client.connect(('localhost', listener.getsockname()[1]))
+        client.close()
+        serv.kill()
+        # wait for the console to discover that it's dead
+        eventlet.sleep(0.1)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eventlet-0.26.1/tests/hub_test.py 
new/eventlet-0.29.1/tests/hub_test.py
--- old/eventlet-0.26.1/tests/hub_test.py       2020-07-30 18:25:18.000000000 
+0200
+++ new/eventlet-0.29.1/tests/hub_test.py       2020-10-22 04:46:21.000000000 
+0200
@@ -1,11 +1,14 @@
 from __future__ import with_statement
+import errno
+import fcntl
+import os
 import sys
 import time
 
 import tests
 from tests import skip_with_pyevent, skip_if_no_itimer, skip_unless
 import eventlet
-from eventlet import hubs
+from eventlet import debug, hubs
 from eventlet.support import greenlets
 import six
 
@@ -83,6 +86,48 @@
         eventlet.sleep()
 
 
+class TestMultipleListenersCleanup(tests.LimitedTestCase):
+    def setUp(self):
+        super(TestMultipleListenersCleanup, self).setUp()
+        debug.hub_prevent_multiple_readers(False)
+        debug.hub_exceptions(False)
+
+    def tearDown(self):
+        super(TestMultipleListenersCleanup, self).tearDown()
+        debug.hub_prevent_multiple_readers(True)
+        debug.hub_exceptions(True)
+
+    def test_cleanup(self):
+        r, w = os.pipe()
+        self.addCleanup(os.close, r)
+        self.addCleanup(os.close, w)
+
+        fcntl.fcntl(r, fcntl.F_SETFL,
+                    fcntl.fcntl(r, fcntl.F_GETFL) | os.O_NONBLOCK)
+
+        def readfd(fd):
+            while True:
+                try:
+                    return os.read(fd, 1)
+                except OSError as e:
+                    if e.errno != errno.EAGAIN:
+                        raise
+                    hubs.trampoline(fd, read=True)
+
+        first_listener = eventlet.spawn(readfd, r)
+        eventlet.sleep()
+
+        second_listener = eventlet.spawn(readfd, r)
+        eventlet.sleep()
+
+        hubs.get_hub().schedule_call_global(0, second_listener.throw,
+                                            eventlet.Timeout(None))
+        eventlet.sleep()
+
+        os.write(w, b'.')
+        self.assertEqual(first_listener.wait(), b'.')
+
+
 class TestScheduleCall(tests.LimitedTestCase):
 
     def test_local(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eventlet-0.26.1/tests/isolated/patcher_builtin.py 
new/eventlet-0.29.1/tests/isolated/patcher_builtin.py
--- old/eventlet-0.26.1/tests/isolated/patcher_builtin.py       1970-01-01 
01:00:00.000000000 +0100
+++ new/eventlet-0.29.1/tests/isolated/patcher_builtin.py       2020-10-22 
08:30:23.000000000 +0200
@@ -0,0 +1,14 @@
+if __name__ == '__main__':
+    from tests.mock import patch
+
+    import sys
+    import eventlet
+    from eventlet import hubs
+    with patch.object(hubs, 'notify_opened') as mock_func:
+        eventlet.monkey_patch(builtins=True)
+        with open(__file__, 'r') as f:
+            mock_func.assert_called_with(f.fileno())
+        if sys.version_info.major == 2:
+            with file(__file__, 'r') as f:
+                mock_func.assert_called_with(f.fileno())
+    print('pass')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/eventlet-0.26.1/tests/isolated/patcher_fork_after_monkey_patch.py 
new/eventlet-0.29.1/tests/isolated/patcher_fork_after_monkey_patch.py
--- old/eventlet-0.26.1/tests/isolated/patcher_fork_after_monkey_patch.py       
1970-01-01 01:00:00.000000000 +0100
+++ new/eventlet-0.29.1/tests/isolated/patcher_fork_after_monkey_patch.py       
2020-10-22 04:46:21.000000000 +0200
@@ -0,0 +1,59 @@
+# Monkey patching interferes with threading in Python 3.7
+# https://github.com/eventlet/eventlet/issues/592
+__test__ = False
+
+
+def check(n, mod, tag):
+    assert len(mod._active) == n, 'Expected {} {} threads, got {}'.format(n, 
tag, mod._active)
+
+
+if __name__ == '__main__':
+    import eventlet
+    import eventlet.patcher
+    eventlet.monkey_patch()
+    import os
+    import sys
+    import threading
+    _threading = eventlet.patcher.original('threading')
+    import eventlet.green.threading
+
+    def target():
+        eventlet.sleep(0.1)
+
+    threads = [
+        threading.Thread(target=target, name='patched'),
+        _threading.Thread(target=target, name='original-1'),
+        _threading.Thread(target=target, name='original-2'),
+        eventlet.green.threading.Thread(target=target, name='green-1'),
+        eventlet.green.threading.Thread(target=target, name='green-2'),
+        eventlet.green.threading.Thread(target=target, name='green-3'),
+    ]
+    for t in threads:
+        t.start()
+
+    check(2, threading, 'pre-fork patched')
+    check(3, _threading, 'pre-fork original')
+    check(4, eventlet.green.threading, 'pre-fork green')
+
+    if os.fork() == 0:
+        # Inside the child, we should only have a main thread,
+        # but old pythons make it difficult to ensure
+        if sys.version_info >= (3, 7):
+            check(1, threading, 'child post-fork patched')
+            check(1, _threading, 'child post-fork original')
+        check(1, eventlet.green.threading, 'child post-fork green')
+        sys.exit()
+    else:
+        os.wait()
+
+    check(2, threading, 'post-fork patched')
+    check(3, _threading, 'post-fork original')
+    check(4, eventlet.green.threading, 'post-fork green')
+
+    for t in threads:
+        t.join()
+
+    check(1, threading, 'post-join patched')
+    check(1, _threading, 'post-join original')
+    check(1, eventlet.green.threading, 'post-join green')
+    print('pass')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eventlet-0.26.1/tests/patcher_test.py 
new/eventlet-0.29.1/tests/patcher_test.py
--- old/eventlet-0.26.1/tests/patcher_test.py   2020-07-30 18:25:18.000000000 
+0200
+++ new/eventlet-0.29.1/tests/patcher_test.py   2020-10-22 08:30:23.000000000 
+0200
@@ -515,3 +515,11 @@
 
 def test_threadpoolexecutor():
     tests.run_isolated('patcher_threadpoolexecutor.py')
+
+
+def test_fork_after_monkey_patch():
+    tests.run_isolated('patcher_fork_after_monkey_patch.py')
+
+
+def test_builtin():
+    tests.run_isolated('patcher_builtin.py')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eventlet-0.26.1/tests/ssl_test.py 
new/eventlet-0.29.1/tests/ssl_test.py
--- old/eventlet-0.26.1/tests/ssl_test.py       2020-07-30 18:25:18.000000000 
+0200
+++ new/eventlet-0.29.1/tests/ssl_test.py       2020-10-22 04:46:21.000000000 
+0200
@@ -1,4 +1,5 @@
 import contextlib
+import random
 import socket
 import warnings
 
@@ -325,3 +326,48 @@
                 server_to_client.close()
 
                 listener.close()
+
+    def test_context_wrapped_accept(self):
+        context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
+        context.load_cert_chain(tests.certificate_file, tests.private_key_file)
+        expected = "success:{}".format(random.random()).encode()
+
+        def client(addr):
+            client_tls = ssl.wrap_socket(
+                eventlet.connect(addr),
+                cert_reqs=ssl.CERT_REQUIRED,
+                ca_certs=tests.certificate_file,
+            )
+            client_tls.send(expected)
+
+        server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        server_sock.bind(('localhost', 0))
+        server_sock.listen(1)
+        eventlet.spawn(client, server_sock.getsockname())
+        server_tls = context.wrap_socket(server_sock, server_side=True)
+        peer, _ = server_tls.accept()
+        assert peer.recv(64) == expected
+        peer.close()
+
+    def test_explicit_keys_accept(self):
+        expected = "success:{}".format(random.random()).encode()
+
+        def client(addr):
+            client_tls = ssl.wrap_socket(
+                eventlet.connect(addr),
+                cert_reqs=ssl.CERT_REQUIRED,
+                ca_certs=tests.certificate_file,
+            )
+            client_tls.send(expected)
+
+        server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        server_sock.bind(('localhost', 0))
+        server_sock.listen(1)
+        eventlet.spawn(client, server_sock.getsockname())
+        server_tls = ssl.wrap_socket(
+            server_sock, server_side=True,
+            keyfile=tests.private_key_file, certfile=tests.certificate_file,
+        )
+        peer, _ = server_tls.accept()
+        assert peer.recv(64) == expected
+        peer.close()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eventlet-0.26.1/tests/test__socket_errors.py 
new/eventlet-0.29.1/tests/test__socket_errors.py
--- old/eventlet-0.26.1/tests/test__socket_errors.py    2020-07-30 
18:25:18.000000000 +0200
+++ new/eventlet-0.29.1/tests/test__socket_errors.py    2020-10-22 
08:30:23.000000000 +0200
@@ -1,3 +1,4 @@
+import errno
 import unittest
 import socket as _original_sock
 from eventlet.green import socket
@@ -18,7 +19,7 @@
             self.fail("Shouldn't have connected")
         except socket.error as ex:
             code, text = ex.args
-            assert code in [111, 61, 10061], (code, text)
+            assert code == errno.ECONNREFUSED, 'Expected ECONNREFUSED, got {0} 
({1})'.format(code, text)
             assert 'refused' in text.lower(), (code, text)
 
     def test_timeout_real_socket(self):
@@ -54,9 +55,9 @@
 
 
 def test_create_connection_refused():
-    errno = None
     try:
         socket.create_connection(('127.0.0.1', 1))
+        assert False, "Shouldn't have connected"
     except socket.error as ex:
-        errno = ex.errno
-    assert errno in [111, 61, 10061], 'Expected socket.error ECONNREFUSED, got 
{0}'.format(errno)
+        code, text = ex.args
+        assert code == errno.ECONNREFUSED, 'Expected ECONNREFUSED, got {0} 
({1})'.format(code, text)

++++++ newdnspython.patch ++++++
--- /var/tmp/diff_new_pack.Vh9rHN/_old  2020-12-12 20:32:16.949846916 +0100
+++ /var/tmp/diff_new_pack.Vh9rHN/_new  2020-12-12 20:32:16.953846920 +0100
@@ -1,5 +1,7 @@
---- a/eventlet/support/greendns.py
-+++ b/eventlet/support/greendns.py
+Index: eventlet-0.29.1/eventlet/support/greendns.py
+===================================================================
+--- eventlet-0.29.1.orig/eventlet/support/greendns.py
++++ eventlet-0.29.1/eventlet/support/greendns.py
 @@ -313,7 +313,7 @@ class ResolverProxy(object):
          self.clear()
  
@@ -9,8 +11,10 @@
          self._resolver.cache = dns.resolver.LRUCache()
  
      def query(self, qname, rdtype=dns.rdatatype.A, rdclass=dns.rdataclass.IN,
---- a/tests/greendns_test.py
-+++ b/tests/greendns_test.py
+Index: eventlet-0.29.1/tests/greendns_test.py
+===================================================================
+--- eventlet-0.29.1.orig/tests/greendns_test.py
++++ eventlet-0.29.1/tests/greendns_test.py
 @@ -885,7 +885,7 @@ class TinyDNSTests(tests.LimitedTestCase
          # https://github.com/eventlet/eventlet/issues/499
          # None means we don't want the server to find the IP
@@ -29,8 +33,10 @@
              resolver.nameservers = [dnsaddr[0]]
              resolver.nameserver_ports[dnsaddr[0]] = dnsaddr[1]
              response = resolver.query('host.example.com', 'a', tcp=True)
---- a/setup.py
-+++ b/setup.py
+Index: eventlet-0.29.1/setup.py
+===================================================================
+--- eventlet-0.29.1.orig/setup.py
++++ eventlet-0.29.1/setup.py
 @@ -15,7 +15,7 @@ setuptools.setup(
      url='http://eventlet.net',
      packages=setuptools.find_packages(exclude=['benchmarks', 'tests', 
'tests.*']),
@@ -38,5 +44,5 @@
 -        'dnspython >= 1.15.0, < 2.0.0',
 +        'dnspython >= 1.15.0',
          'greenlet >= 0.3',
-         'monotonic >= 1.4',
+         'monotonic >= 1.4;python_version<"3.5"',
          'six >= 1.10.0',

++++++ pr_672-remove-OpenSSL-tsafe.patch ++++++
From be0d520c9bc9e3b3959f84d80c65e418e6081887 Mon Sep 17 00:00:00 2001
From: Sergey Shepelev <temo...@gmail.com>
Date: Wed, 2 Dec 2020 01:10:02 +0300
Subject: [PATCH] pyopenssl tsafe module was deprecated and removed in v20.0.0

https://github.com/eventlet/eventlet/issues/671
https://github.com/pyca/pyopenssl/pull/913
---
 eventlet/green/OpenSSL/__init__.py | 7 ++++++-
 tests/openssl_test.py              | 1 -
 4 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/eventlet/green/OpenSSL/__init__.py 
b/eventlet/green/OpenSSL/__init__.py
index d86147645..1b2500971 100644
--- a/eventlet/green/OpenSSL/__init__.py
+++ b/eventlet/green/OpenSSL/__init__.py
@@ -1,4 +1,9 @@
 from . import crypto
 from . import SSL
-from . import tsafe
+try:
+    # pyopenssl tsafe module was deprecated and removed in v20.0.0
+    # https://github.com/pyca/pyopenssl/pull/913
+    from . import tsafe
+except ImportError:
+    pass
 from .version import __version__
diff --git a/tests/openssl_test.py b/tests/openssl_test.py
index a127408b8..1108adaf6 100644
--- a/tests/openssl_test.py
+++ b/tests/openssl_test.py
@@ -12,5 +12,4 @@ def test_import():
 
     import eventlet.green.OpenSSL.SSL
     import eventlet.green.OpenSSL.crypto
-    import eventlet.green.OpenSSL.tsafe
     import eventlet.green.OpenSSL.version
_______________________________________________
openSUSE Commits mailing list -- commit@lists.opensuse.org
To unsubscribe, email commit-le...@lists.opensuse.org
List Netiquette: https://en.opensuse.org/openSUSE:Mailing_list_netiquette
List Archives: 
https://lists.opensuse.org/archives/list/commit@lists.opensuse.org

Reply via email to