Control: tags 1056893 + pending Dear maintainer,
I've prepared an NMU for uvloop (versioned as 0.19.0+ds1-2.1) and uploaded it to DELAYED/2. Please feel free to tell me if I should delay it longer. Cheers -- Sebastian Ramacher
diff -Nru uvloop-0.19.0+ds1/debian/changelog uvloop-0.19.0+ds1/debian/changelog --- uvloop-0.19.0+ds1/debian/changelog 2023-11-16 13:16:10.000000000 +0100 +++ uvloop-0.19.0+ds1/debian/changelog 2024-03-31 23:47:16.000000000 +0200 @@ -1,3 +1,14 @@ +uvloop (0.19.0+ds1-2.1) unstable; urgency=medium + + * Non-maintainer upload + + [ Graham Inggs ] + * Include proposed patch for compatibility with Cython 3 (Closes: #1056893) + (LP: #2051150) + * Skip tests failing with libuv 1.48.0 + + -- Sebastian Ramacher <sramac...@debian.org> Sun, 31 Mar 2024 23:47:16 +0200 + uvloop (0.19.0+ds1-2) unstable; urgency=medium * Add 0003-Fix-unit-tests-on-IPv6-only-hosts patch. Thanks to Dale Richards! diff -Nru uvloop-0.19.0+ds1/debian/patches/cython3.patch uvloop-0.19.0+ds1/debian/patches/cython3.patch --- uvloop-0.19.0+ds1/debian/patches/cython3.patch 1970-01-01 01:00:00.000000000 +0100 +++ uvloop-0.19.0+ds1/debian/patches/cython3.patch 2024-03-26 18:29:47.000000000 +0100 @@ -0,0 +1,556 @@ +Description: Updates for Cython3 + Remove SSL depreciation warnings +Forwarded: https://github.com/MagicStack/uvloop/pull/587 +Author: Alan Brooks <12380017+alan-bro...@users.noreply.github.com> +Last-Update: 2023-12-28 + +--- a/Makefile ++++ b/Makefile +@@ -9,7 +9,7 @@ + + + clean: +- rm -fr dist/ doc/_build/ *.egg-info uvloop/loop.*.pyd ++ rm -fr dist/ doc/_build/ *.egg-info uvloop/loop.*.pyd uvloop/loop_d.*.pyd + rm -fr uvloop/*.c uvloop/*.html uvloop/*.so + rm -fr uvloop/handles/*.html uvloop/includes/*.html + find . -name '__pycache__' | xargs rm -rf +--- a/setup.py ++++ b/setup.py +@@ -144,7 +144,9 @@ + self.distribution.ext_modules[:] = cythonize( + self.distribution.ext_modules, + compiler_directives=directives, +- annotate=self.cython_annotate) ++ annotate=self.cython_annotate, ++ compile_time_env=dict(DEFAULT_FREELIST_SIZE=250, SSL_READ_MAX_SIZE=256 * 1024), ++ emit_linenums=True) + + super().finalize_options() + +--- a/tests/test_process.py ++++ b/tests/test_process.py +@@ -912,7 +912,7 @@ + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, +- __uvloop_sleep_after_fork=True)) ++ uvloop_sleep_after_fork=True)) + self.assertIsNot(transport, None) + self.assertEqual(transport.get_returncode(), 0) + self.assertEqual( +@@ -931,7 +931,7 @@ + stdin=None, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, +- __uvloop_sleep_after_fork=True)) ++ uvloop_sleep_after_fork=True)) + self.assertIsNot(transport, None) + self.assertEqual(transport.get_returncode(), 0) + self.assertEqual( +--- a/tests/test_tcp.py ++++ b/tests/test_tcp.py +@@ -1630,17 +1630,22 @@ + self.fail("unexpected call to connection_made()") + + def test_ssl_connect_accepted_socket(self): +- if hasattr(ssl, 'PROTOCOL_TLS'): +- proto = ssl.PROTOCOL_TLS ++ if hasattr(ssl, 'PROTOCOL_TLS_SERVER'): ++ server_proto = ssl.PROTOCOL_TLS_SERVER ++ client_proto = ssl.PROTOCOL_TLS_CLIENT + else: +- proto = ssl.PROTOCOL_SSLv23 +- server_context = ssl.SSLContext(proto) ++ if hasattr(ssl, 'PROTOCOL_TLS'): ++ client_proto = server_proto = ssl.PROTOCOL_TLS ++ else: ++ client_proto = server_proto = ssl.PROTOCOL_SSLv23 ++ ++ server_context = ssl.SSLContext(server_proto) + server_context.load_cert_chain(self.ONLYCERT, self.ONLYKEY) + if hasattr(server_context, 'check_hostname'): + server_context.check_hostname = False + server_context.verify_mode = ssl.CERT_NONE + +- client_context = ssl.SSLContext(proto) ++ client_context = ssl.SSLContext(client_proto) + if hasattr(server_context, 'check_hostname'): + client_context.check_hostname = False + client_context.verify_mode = ssl.CERT_NONE +@@ -2233,7 +2238,7 @@ + sslctx.use_privatekey_file(self.ONLYKEY) + sslctx.use_certificate_chain_file(self.ONLYCERT) + client_sslctx = self._create_client_ssl_context() +- if hasattr(ssl, 'OP_NO_TLSv1_3'): ++ if sys.version_info < (3, 8) and hasattr(ssl, 'OP_NO_TLSv1_3'): + client_sslctx.options |= ssl.OP_NO_TLSv1_3 + + def server(sock): +@@ -2592,7 +2597,7 @@ + sslctx_openssl.use_privatekey_file(self.ONLYKEY) + sslctx_openssl.use_certificate_chain_file(self.ONLYCERT) + client_sslctx = self._create_client_ssl_context() +- if hasattr(ssl, 'OP_NO_TLSv1_3'): ++ if sys.version_info < (3, 8) and hasattr(ssl, 'OP_NO_TLSv1_3'): + client_sslctx.options |= ssl.OP_NO_TLSv1_3 + + future = None +--- a/uvloop/_testbase.py ++++ b/uvloop/_testbase.py +@@ -269,7 +269,9 @@ + class SSLTestCase: + + def _create_server_ssl_context(self, certfile, keyfile=None): +- if hasattr(ssl, 'PROTOCOL_TLS'): ++ if hasattr(ssl, 'PROTOCOL_TLS_SERVER'): ++ sslcontext = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) ++ elif hasattr(ssl, 'PROTOCOL_TLS'): + sslcontext = ssl.SSLContext(ssl.PROTOCOL_TLS) + else: + sslcontext = ssl.SSLContext(ssl.PROTOCOL_SSLv23) +--- a/uvloop/cbhandles.pyx ++++ b/uvloop/cbhandles.pyx +@@ -76,8 +76,8 @@ + self.arg1, self.arg2, self.arg3, self.arg4) + + else: +- raise RuntimeError('invalid Handle.cb_type: {}'.format( +- cb_type)) ++ raise RuntimeError('invalid Handle.cb_type: {} {!r}/{!r}'.format( ++ cb_type, self.args1, self.args2)) + + except (KeyboardInterrupt, SystemExit): + raise +--- a/uvloop/dns.pyx ++++ b/uvloop/dns.pyx +@@ -298,7 +298,7 @@ + uv.uv_freeaddrinfo(self.data) # returns void + self.data = NULL + +- cdef void set_data(self, system.addrinfo *data): ++ cdef void set_data(self, system.addrinfo *data) noexcept: + self.data = data + + cdef unpack(self): +@@ -326,7 +326,7 @@ + return result + + @staticmethod +- cdef int isinstance(object other): ++ cdef int isinstance(object other) noexcept: + return type(other) is AddrInfo + + +--- a/uvloop/handles/basetransport.pxd ++++ b/uvloop/handles/basetransport.pxd +@@ -47,8 +47,8 @@ + # === overloads === + + cdef _new_socket(self) +- cdef size_t _get_write_buffer_size(self) ++ cdef size_t _get_write_buffer_size(self) noexcept + +- cdef bint _is_reading(self) ++ cdef bint _is_reading(self) noexcept + cdef _start_reading(self) + cdef _stop_reading(self) +--- a/uvloop/handles/basetransport.pyx ++++ b/uvloop/handles/basetransport.pyx +@@ -18,7 +18,7 @@ + + self._closing = 0 + +- cdef size_t _get_write_buffer_size(self): ++ cdef size_t _get_write_buffer_size(self) noexcept: + return 0 + + cdef inline _schedule_call_connection_made(self): +@@ -211,7 +211,7 @@ + self._extra_info = {} + self._extra_info[name] = obj + +- cdef bint _is_reading(self): ++ cdef bint _is_reading(self) noexcept: + raise NotImplementedError + + cdef _start_reading(self): +--- a/uvloop/handles/handle.pyx ++++ b/uvloop/handles/handle.pyx +@@ -363,7 +363,7 @@ + Py_DECREF(h) # Was INCREFed in UVHandle._close + + +-cdef void __close_all_handles(Loop loop): ++cdef void __close_all_handles(Loop loop) noexcept: + uv.uv_walk(loop.uvloop, + __uv_walk_close_all_handles_cb, + <void*>loop) # void +--- a/uvloop/handles/pipe.pyx ++++ b/uvloop/handles/pipe.pyx +@@ -25,7 +25,7 @@ + cdef __pipe_open(UVStream handle, int fd): + cdef int err + err = uv.uv_pipe_open(<uv.uv_pipe_t *>handle._handle, +- <uv.uv_file>fd) ++ <uv.uv_os_fd_t>fd) + if err < 0: + exc = convert_error(err) + raise exc +--- a/uvloop/handles/poll.pxd ++++ b/uvloop/handles/poll.pxd +@@ -10,7 +10,7 @@ + cdef inline _poll_start(self, int flags) + cdef inline _poll_stop(self) + +- cdef int is_active(self) ++ cdef int is_active(self) noexcept + + cdef is_reading(self) + cdef is_writing(self) +--- a/uvloop/handles/poll.pyx ++++ b/uvloop/handles/poll.pyx +@@ -29,7 +29,7 @@ + handle._init(loop, fd) + return handle + +- cdef int is_active(self): ++ cdef int is_active(self) noexcept: + return (self.reading_handle is not None or + self.writing_handle is not None) + +--- a/uvloop/handles/stream.pyx ++++ b/uvloop/handles/stream.pyx +@@ -1,4 +1,8 @@ +-DEF __PREALLOCED_BUFS = 4 ++cdef extern from *: ++ ''' ++ enum {__PREALLOCED_BUFS = 4}; ++ ''' ++ const bint __PREALLOCED_BUFS + + + @cython.no_gc_clear +@@ -279,7 +283,7 @@ + cdef inline _close_on_read_error(self): + self.__read_error_close = 1 + +- cdef bint _is_reading(self): ++ cdef bint _is_reading(self) noexcept: + return self.__reading + + cdef _start_reading(self): +@@ -578,7 +582,7 @@ + + self._maybe_resume_protocol() + +- cdef size_t _get_write_buffer_size(self): ++ cdef size_t _get_write_buffer_size(self) noexcept: + if self._handle is NULL: + return 0 + return ((<uv.uv_stream_t*>self._handle).write_queue_size + +@@ -755,7 +759,7 @@ + UVStream sc, + Loop loop, + ssize_t nread, +-): ++) noexcept: + if sc._closed: + # The stream was closed, there is no reason to + # do any work now. +@@ -818,7 +822,7 @@ + uv.uv_stream_t* stream, + ssize_t nread, + const uv.uv_buf_t* buf, +-): ++) noexcept: + cdef: + UVStream sc = <UVStream>stream.data + Loop loop = sc._loop +@@ -849,7 +853,7 @@ + cdef inline void __uv_stream_on_write_impl( + uv.uv_write_t* req, + int status, +-): ++) noexcept: + cdef: + _StreamWriteContext ctx = <_StreamWriteContext> req.data + UVStream stream = <UVStream>ctx.stream +--- a/uvloop/handles/udp.pyx ++++ b/uvloop/handles/udp.pyx +@@ -127,12 +127,12 @@ + exc = convert_error(err) + raise exc + +- cdef size_t _get_write_buffer_size(self): ++ cdef size_t _get_write_buffer_size(self) noexcept: + if self._handle is NULL: + return 0 + return (<uv.uv_udp_t*>self._handle).send_queue_size + +- cdef bint _is_reading(self): ++ cdef bint _is_reading(self) noexcept: + return self.__receiving + + cdef _start_reading(self): +--- a/uvloop/includes/consts.pxi ++++ /dev/null +@@ -1,25 +0,0 @@ +-DEF UV_STREAM_RECV_BUF_SIZE = 256000 # 250kb +- +-DEF FLOW_CONTROL_HIGH_WATER = 64 # KiB +-DEF FLOW_CONTROL_HIGH_WATER_SSL_READ = 256 # KiB +-DEF FLOW_CONTROL_HIGH_WATER_SSL_WRITE = 512 # KiB +- +-DEF DEFAULT_FREELIST_SIZE = 250 +-DEF DNS_PYADDR_TO_SOCKADDR_CACHE_SIZE = 2048 +- +-DEF DEBUG_STACK_DEPTH = 10 +- +- +-DEF __PROCESS_DEBUG_SLEEP_AFTER_FORK = 1 +- +- +-DEF LOG_THRESHOLD_FOR_CONNLOST_WRITES = 5 +- +- +-# Number of seconds to wait for SSL handshake to complete +-# The default timeout matches that of Nginx. +-DEF SSL_HANDSHAKE_TIMEOUT = 60.0 +-# Number of seconds to wait for SSL shutdown to complete +-# The default timeout mimics lingering_time +-DEF SSL_SHUTDOWN_TIMEOUT = 30.0 +-DEF SSL_READ_MAX_SIZE = 256 * 1024 +--- a/uvloop/includes/fork_handler.h ++++ b/uvloop/includes/fork_handler.h +@@ -1,7 +1,10 @@ ++#ifndef UVLOOP_FORK_HANDLER_H_ ++#define UVLOOP_FORK_HANDLER_H_ ++ + volatile uint64_t MAIN_THREAD_ID = 0; + volatile int8_t MAIN_THREAD_ID_SET = 0; + +-typedef void (*OnForkHandler)(); ++typedef void (*OnForkHandler)(void); + + OnForkHandler __forkHandler = NULL; + +@@ -36,3 +39,4 @@ + MAIN_THREAD_ID = id; + MAIN_THREAD_ID_SET = 1; + } ++#endif +--- /dev/null ++++ b/uvloop/includes/system.h +@@ -0,0 +1,16 @@ ++#ifndef UVLOOP_SYSTEM_H_ ++#define UVLOOP_SYSTEM_H_ ++#if defined(_WIN32) || defined(MS_WINDOWS) || defined(_MSC_VER) ++#include "Winsock2.h" ++#include "ws2def.h" ++#include "includes/fork_handler.h" ++#else ++#include "arpa/inet.h" ++#include "sys/socket.h" ++#include "sys/un.h" ++#include "unistd.h" ++#include "pthread.h" ++#endif ++#endif ++ ++ +--- a/uvloop/includes/system.pxd ++++ b/uvloop/includes/system.pxd +@@ -1,13 +1,9 @@ + from libc.stdint cimport int8_t, uint64_t + +-cdef extern from "arpa/inet.h" nogil: +- +- int ntohl(int) +- int htonl(int) +- int ntohs(int) +- +- +-cdef extern from "sys/socket.h" nogil: ++cdef extern from "includes/system.h": ++ int ntohl(int) nogil ++ int htonl(int) nogil ++ int ntohs(int) nogil + + struct sockaddr: + unsigned short sa_family +--- a/uvloop/includes/uv.pxd ++++ b/uvloop/includes/uv.pxd +@@ -220,7 +220,7 @@ + UV_LEAVE_GROUP = 0, + UV_JOIN_GROUP + +- cpdef enum uv_fs_event: ++ cdef enum uv_fs_event: + UV_RENAME = 1, + UV_CHANGE = 2 + +@@ -282,7 +282,7 @@ + int uv_loop_close(uv_loop_t* loop) + int uv_loop_alive(uv_loop_t* loop) + int uv_loop_fork(uv_loop_t* loop) +- int uv_backend_fd(uv_loop_t* loop) ++ uv_os_fd_t uv_backend_fd(uv_loop_t* loop) + + void uv_update_time(uv_loop_t* loop) + uint64_t uv_now(const uv_loop_t*) +@@ -378,7 +378,7 @@ + # Pipes + + int uv_pipe_init(uv_loop_t* loop, uv_pipe_t* handle, int ipc) +- int uv_pipe_open(uv_pipe_t* handle, uv_file file) ++ int uv_pipe_open(uv_pipe_t* handle, uv_os_fd_t file) + int uv_pipe_bind(uv_pipe_t* handle, const char* name) + + void uv_pipe_connect(uv_connect_t* req, uv_pipe_t* handle, +--- a/uvloop/loop.pxd ++++ b/uvloop/loop.pxd +@@ -1,15 +1,35 @@ + # cython: language_level=3 + ++cdef extern from *: ++ ''' ++ enum { UV_STREAM_RECV_BUF_SIZE = 256000, ++ SSL_READ_MAX_SIZE = 256 * 1024, // 250kb ++ }; ++ const float SSL_HANDSHAKE_TIMEOUT = 60.0; // Number of seconds to wait for SSL handshake to complete The default timeout matches that of Nginx. ++ const float SSL_SHUTDOWN_TIMEOUT = 30.0; // Number of seconds to wait for SSL shutdown to complete The default timeout mimics lingering_time ++ ''' ++ const bint UV_STREAM_RECV_BUF_SIZE ++ const bint SSL_READ_MAX_SIZE ++ ++ const float SSL_HANDSHAKE_TIMEOUT ++ const float SSL_SHUTDOWN_TIMEOUT ++ ++cdef enum: ++ FLOW_CONTROL_HIGH_WATER = 64 # KiB ++ FLOW_CONTROL_HIGH_WATER_SSL_READ = 256 # KiB ++ FLOW_CONTROL_HIGH_WATER_SSL_WRITE = 512 # KiB ++ ++ DNS_PYADDR_TO_SOCKADDR_CACHE_SIZE = 2048 ++ DEBUG_STACK_DEPTH = 10 ++ __PROCESS_DEBUG_SLEEP_AFTER_FORK = 1 ++ LOG_THRESHOLD_FOR_CONNLOST_WRITES = 5 ++ + + from .includes cimport uv + from .includes cimport system + + from libc.stdint cimport uint64_t, uint32_t, int64_t + +- +-include "includes/consts.pxi" +- +- + cdef extern from *: + ctypedef int vint "volatile int" + +@@ -200,7 +220,7 @@ + cdef inline _ceval_process_signals(self) + cdef _invoke_signals(self, bytes data) + +- cdef _set_coroutine_debug(self, bint enabled) ++ cpdef _set_coroutine_debug(self, bint enabled) + + cdef _print_debug_info(self) + +--- a/uvloop/loop.pyx ++++ b/uvloop/loop.pyx +@@ -43,7 +43,7 @@ + from . import _noop + + +-include "includes/consts.pxi" ++ + include "includes/stdlib.pxi" + + include "errors.pyx" +@@ -1118,7 +1118,7 @@ + + cdef _sock_set_reuseport(self, int fd): + cdef: +- int err ++ int err = 0 + int reuseport_flag = 1 + + err = system.setsockopt( +@@ -1131,7 +1131,7 @@ + if err < 0: + raise convert_error(-errno.errno) + +- cdef _set_coroutine_debug(self, bint enabled): ++ cpdef _set_coroutine_debug(self, bint enabled): + enabled = bool(enabled) + if self._coroutine_debug_set == enabled: + return +@@ -1396,8 +1396,7 @@ + def set_debug(self, enabled): + self._debug = bool(enabled) + if self.is_running(): +- self.call_soon_threadsafe( +- self._set_coroutine_debug, self, self._debug) ++ self.call_soon_threadsafe(self._set_coroutine_debug, self._debug) + + def is_running(self): + """Return whether the event loop is currently running.""" +@@ -2750,7 +2749,7 @@ + executable=None, + pass_fds=(), + # For tests only! Do not use in your code. Ever. +- __uvloop_sleep_after_fork=False): ++ uvloop_sleep_after_fork=False): + + # TODO: Implement close_fds (might not be very important in + # Python 3.5, since all FDs aren't inheritable by default.) +@@ -2770,7 +2769,7 @@ + if executable is not None: + args[0] = executable + +- if __uvloop_sleep_after_fork: ++ if uvloop_sleep_after_fork: + debug_flags |= __PROCESS_DEBUG_SLEEP_AFTER_FORK + + waiter = self._new_future() +--- a/uvloop/sslproto.pxd ++++ b/uvloop/sslproto.pxd +@@ -122,7 +122,7 @@ + # Flow control for writes from APP socket + + cdef _control_app_writing(self, object context=*) +- cdef size_t _get_write_buffer_size(self) ++ cdef size_t _get_write_buffer_size(self) noexcept + cdef _set_write_buffer_limits(self, high=*, low=*) + + # Flow control for reads to APP socket +@@ -134,5 +134,5 @@ + + cdef _control_ssl_reading(self) + cdef _set_read_buffer_limits(self, high=*, low=*) +- cdef size_t _get_read_buffer_size(self) ++ cdef size_t _get_read_buffer_size(self) noexcept + cdef _fatal_error(self, exc, message=*) +--- a/uvloop/sslproto.pyx ++++ b/uvloop/sslproto.pyx +@@ -861,7 +861,7 @@ + 'protocol': self, + }) + +- cdef size_t _get_write_buffer_size(self): ++ cdef size_t _get_write_buffer_size(self) noexcept: + return self._outgoing.pending + self._write_buffer_size + + cdef _set_write_buffer_limits(self, high=None, low=None): +@@ -903,7 +903,7 @@ + self._incoming_high_water = high + self._incoming_low_water = low + +- cdef size_t _get_read_buffer_size(self): ++ cdef size_t _get_read_buffer_size(self) noexcept: + return self._incoming.pending + + # Flow control for writes to SSL socket diff -Nru uvloop-0.19.0+ds1/debian/patches/libuv1.48.0.patch uvloop-0.19.0+ds1/debian/patches/libuv1.48.0.patch --- uvloop-0.19.0+ds1/debian/patches/libuv1.48.0.patch 1970-01-01 01:00:00.000000000 +0100 +++ uvloop-0.19.0+ds1/debian/patches/libuv1.48.0.patch 2024-03-26 18:29:16.000000000 +0100 @@ -0,0 +1,21 @@ +Description: Skip tests failing with libuv 1.48.0 + See https://github.com/libuv/libuv/commit/3530bcc30350d4a6ccf35d2f7b33e23292b9de70 +Bug: https://github.com/MagicStack/uvloop/issues/596 +Author: Graham Inggs <gin...@debian.org> +Last-Update: 2024-03-26 + +--- a/tests/test_dns.py ++++ b/tests/test_dns.py +@@ -103,10 +103,12 @@ + self._test_getaddrinfo(None, 0) + self._test_getaddrinfo(None, 0, type=socket.SOCK_STREAM) + ++ @unittest.skip("Fails with libuv 1.48.0") + def test_getaddrinfo_8(self): + self._test_getaddrinfo('', 0) + self._test_getaddrinfo('', 0, type=socket.SOCK_STREAM) + ++ @unittest.skip("Fails with libuv 1.48.0") + def test_getaddrinfo_9(self): + self._test_getaddrinfo(b'', 0) + self._test_getaddrinfo(b'', 0, type=socket.SOCK_STREAM) diff -Nru uvloop-0.19.0+ds1/debian/patches/series uvloop-0.19.0+ds1/debian/patches/series --- uvloop-0.19.0+ds1/debian/patches/series 2023-11-16 13:12:52.000000000 +0100 +++ uvloop-0.19.0+ds1/debian/patches/series 2024-03-26 18:21:40.000000000 +0100 @@ -1,3 +1,5 @@ 0001-relax-Cython-dependency.patch 2001-riscv-relax-test-timeout.patch 0003-Fix-unit-tests-on-IPv6-only-hosts.patch +cython3.patch +libuv1.48.0.patch