- Update to 3.9.9:

* Core and Builtins
    + bpo-30570: Fixed a crash in issubclass() from infinite recursion when searching pathological __bases__ tuples.
    + bpo-45494: Fix parser crash when reporting errors involving invalid continuation characters. Patch by Pablo Galindo.
    + bpo-45385: Fix reference leak from descr_check. Patch by Dong-hee Na.
    + bpo-45167: Fix deepcopying of types.GenericAlias objects.
    + bpo-44219: Release the GIL while performing isatty system calls on arbitrary file descriptors. In particular, this affects os.isatty(), os.device_encoding() and io.TextIOWrapper. By extension, io.open() in text mode is also affected. This change solves a deadlock in os.isatty(). Patch by Vincent Michel in bpo-44219.
    + bpo-44959: Added fallback to extension modules with ‘.sl’ suffix on HP-UX
    + bpo-44050: Extensions that indicate they use global state (by setting m_size to -1) can again be used in multiple interpreters. This reverts to behavior of Python 3.8.
    + bpo-45121: Fix issue where Protocol.__init__ raises RecursionError when it’s called directly or via super(). Patch provided by Yurii Karabas.
    + bpo-45083: When the interpreter renders an exception, its name now has a complete qualname. Previously only the class name was concatenated to the module name, which sometimes resulted in an incorrect full name being displayed.
    + bpo-45738: Fix computation of error location for invalid continuation characters in the parser. Patch by Pablo Galindo.
    + Library
    + bpo-45678: Fix bug in Python 3.9 that meant functools.singledispatchmethod failed to properly wrap the attributes of the target method. Patch by Alex Waygood.
    + bpo-45679: Fix caching of multi-value typing.Literal. Literal[True, 2] is no longer equal to Literal[1, 2].
    + bpo-45438: Fix typing.Signature string representation for generic builtin types.
    + bpo-45581: sqlite3.connect() now correctly raises MemoryError if the underlying SQLite API signals memory error. Patch by Erlend E. Aasland.
    + bpo-39679: Fix bug in functools.singledispatchmethod that caused it to fail when attempting to register a classmethod() or staticmethod() using type annotations. Patch contributed by Alex Waygood.
    + bpo-45515: Add references to zoneinfo in the datetime documentation, mostly replacing outdated references to dateutil.tz. Change by Paul Ganssle.
    + bpo-45467: Fix incremental decoder and stream reader in the “raw-unicode-escape” codec. Previously they failed if the escape sequence was split.
    + bpo-45461: Fix incremental decoder and stream reader in the “unicode-escape” codec. Previously they failed if the escape sequence was split.
    + bpo-45239: Fixed email.utils.parsedate_tz() crashing with UnboundLocalError on certain invalid input instead of returning None. Patch by Ben Hoyt.
    + bpo-44904: Fix bug in the doctest module that caused it to fail if a docstring included an example with a classmethod property. Patch by Alex Waygood.
    + bpo-45406: Make inspect.getmodule() catch FileNotFoundError raised by :’func:inspect.getabsfile, and return None to indicate that the module could not be determined.
    + bpo-45262: Prevent use-after-free in asyncio. Make sure the cached running loop holder gets cleared on dealloc to prevent use-after-free in get_running_loop
    + bpo-45386: Make xmlrpc.client more robust to C runtimes where the underlying C strftime function results in a ValueError when testing for year formatting options.
    + bpo-45371: Fix clang rpath issue in distutils. The UnixCCompiler now uses correct clang option to add a runtime library directory (rpath) to a shared library.
    + bpo-20028: Improve error message of csv.Dialect when initializing. Patch by Vajrasky Kok and Dong-hee Na.
    + bpo-45343: Update bundled pip to 21.2.4 and setuptools to 58.1.0
    + bpo-41710: On Unix, if the sem_clockwait() function is available in the C library (glibc 2.30 and newer), the threading.Lock.acquire() method now uses the monotonic clock (time.CLOCK_MONOTONIC) for the timeout, rather than using the system clock (time.CLOCK_REALTIME), to not be affected by system clock changes. Patch by Victor Stinner.

OBS-URL: https://build.opensuse.org/package/show/devel:languages:python:Factory/python39?expand=0&rev=87
This commit is contained in:
Steve Kowalik 2021-11-17 09:51:06 +00:00 committed by Git OBS Bridge
parent 415beff858
commit a87cc20a6a
7 changed files with 110 additions and 739 deletions

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f8145616e68c00041d1a6399b76387390388f8359581abc24432bb969b5e3c57
size 19123232

View File

@ -1,16 +0,0 @@
-----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEE4/8oOcBIslwITevpsmmV4xAlBWgFAmEtNmkACgkQsmmV4xAl
BWgFxA/+PbfnJKXOLH5s4cUARd5K1WAB7BvPKb5C3dxILvn7tp6nPFrMknhjGj5h
cAe/2uaAm6IsMXLm0hJLE1fZy1ht5M6U7e7gxSNWIjX/qKQYVKBlP7w9BK1BALE/
YGyv3jDH7tgECkELGE0bePtuTLVr7HzdTmyKeI6BHHIklOeJBmYl/4JuUi2UxZKD
76dq0a7XTuk6ce5BUvsWsOoZ80+lms5mfVq5mNkiERdxPYvGrrxkqQz89xHU08qw
ISIBF8hX62zmRzzmuTQCPRGYsd00jPYrZ5d2aKMI36wTA/O2ICVSrzeQB6ixYOfP
ex2DbYRfMMghQ942Q9wM53TYhieibVMxEJD8MPlxleDe7O5jbe+djuwgKE9mnfCI
MZrOOuXOk4pY0l6CwgIyCWCuDNQYTip9HYqP4AMjwM1Rt1UjMsvjIds1bWgL3pEc
EV3r1f2RpuAL7kKpjzrw5qFgg87z4IVKp21Ikg2T5rvKZrSmMFyz/tr8Kuw7W0LP
KYKDKrh+J0haTpZyIOxYL+WQZ3GaXqQQaIyLI1rx2Qt9jbIt7/ieguKOx44hTLuc
sUE5I+q5Nv/nI4BsJiKiK/Oa7nDJX1xNNaaX/7p/MjAP5waGWowZutQtpSTMSm6U
ymmtmVg8xrt3zrEHJl4HQWhBvf0if1dsWvbtcP+iOdyFOw2Bn/c=
=+3CX
-----END PGP SIGNATURE-----

3
Python-3.9.9.tar.xz Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:06828c04a573c073a4e51c4292a27c1be4ae26621c3edc7cf9318418ce3b6d27
size 19144372

16
Python-3.9.9.tar.xz.asc Normal file
View File

@ -0,0 +1,16 @@
-----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEE4/8oOcBIslwITevpsmmV4xAlBWgFAmGSq04ACgkQsmmV4xAl
BWjtXQ/8CggiE692fd0jq3sVMNdAarUwWPWTVblm3H0zkwrpkrLAOTZfb+6UMini
XbXgFBIAERLffO5XHumJgXKR9pkJmYxQ5gjz+9YA5hBswQzj6x6nFqANYj3Jes7N
GUTohgVgmhfTW8EsJwE+bfRuJfpQaWDS1YHErjvfH+iywpJdagNGoHlxjoFFY4LQ
pOxO9fe6WqCCqGcGoniyRrGOpoyo59eMezVc9bCOeuvsEhOxcxAJq8bEMrphL0AJ
EOAsb5AZYsQFZhxbdN//f5CPMJ1eskqYN0ho1LGhL/z0JcRUDpAb4h5YQHcCgQN+
rNM6keTfFtNEa19ByW74f1fJJw/VgqBHNm6AVnvw9WOJvhlwSei0xeZHZtSL5VtH
WsJtZuhYqRWCrokjt2HOVD4b8vvAegaEqEPR+SFPBqJJbiHJ/LQTOv+fweQnyo+F
EXKof0ZXbax7Q/ADIVhd2y3C0hYrpzRKVEk1u643ns0V+wZ2VuilL/k5aB/LaOoy
Z9O2WoxSw0SMm0etegVyefT5+gj5l/8euXwKWqxKFPhue7pWngwzMPzjkMDcvfYb
4o21d9vbTFvGAHJ5SCqHPLy5iIf40pfLLZreEXtSMLM1mGMlfGnt270UasUIIxWE
TxHYHthQX0M2hMW77dc5hcVcRrUNKmf8P7XbnDjc61eSlRgTJaE=
=2zA6
-----END PGP SIGNATURE-----

View File

@ -1,714 +0,0 @@
From 0d0aa3919527a704e2f79b80655ec5ee6e7ce1e6 Mon Sep 17 00:00:00 2001
From: Serhiy Storchaka <storchaka@gmail.com>
Date: Sat, 4 Sep 2021 13:10:34 +0300
Subject: [PATCH 1/2] bpo-45097: Remove incorrect deprecation warnings in
asyncio.
Deprecation warnings about the loop argument were incorrectly emitted
in cases when the loop argument was used inside the asyncio library,
not from user code.
---
Lib/asyncio/base_events.py | 8
Lib/asyncio/runners.py | 2
Lib/asyncio/subprocess.py | 4
Lib/asyncio/tasks.py | 13
Lib/asyncio/unix_events.py | 2
Lib/test/test_asyncgen.py | 78 +++
Lib/test/test_asyncio/__init__.py | 32 -
Lib/test/test_asyncio/test_events.py | 243 ++++------
Lib/test/test_asyncio/test_queues.py | 16
Lib/test/test_asyncio/test_tasks.py | 21
Misc/NEWS.d/next/Library/2021-09-04-13-10-25.bpo-45097.5J4IC-.rst | 2
11 files changed, 237 insertions(+), 184 deletions(-)
create mode 100644 Misc/NEWS.d/next/Library/2021-09-04-13-10-25.bpo-45097.5J4IC-.rst
--- a/Lib/asyncio/base_events.py
+++ b/Lib/asyncio/base_events.py
@@ -350,7 +350,7 @@ class Server(events.AbstractServer):
self._start_serving()
# Skip one loop iteration so that all 'loop.add_reader'
# go through.
- await tasks.sleep(0, loop=self._loop)
+ await tasks.sleep(0)
async def serve_forever(self):
if self._serving_forever_fut is not None:
@@ -539,7 +539,7 @@ class BaseEventLoop(events.AbstractEvent
closing_agens = list(self._asyncgens)
self._asyncgens.clear()
- results = await tasks.gather(
+ results = await tasks._gather(
*[ag.aclose() for ag in closing_agens],
return_exceptions=True,
loop=self)
@@ -1457,7 +1457,7 @@ class BaseEventLoop(events.AbstractEvent
fs = [self._create_server_getaddrinfo(host, port, family=family,
flags=flags)
for host in hosts]
- infos = await tasks.gather(*fs, loop=self)
+ infos = await tasks._gather(*fs, loop=self)
infos = set(itertools.chain.from_iterable(infos))
completed = False
@@ -1515,7 +1515,7 @@ class BaseEventLoop(events.AbstractEvent
server._start_serving()
# Skip one loop iteration so that all 'loop.add_reader'
# go through.
- await tasks.sleep(0, loop=self)
+ await tasks.sleep(0)
if self._debug:
logger.info("%r is serving", server)
--- a/Lib/asyncio/runners.py
+++ b/Lib/asyncio/runners.py
@@ -61,7 +61,7 @@ def _cancel_all_tasks(loop):
task.cancel()
loop.run_until_complete(
- tasks.gather(*to_cancel, loop=loop, return_exceptions=True))
+ tasks._gather(*to_cancel, loop=loop, return_exceptions=True))
for task in to_cancel:
if task.cancelled():
--- a/Lib/asyncio/subprocess.py
+++ b/Lib/asyncio/subprocess.py
@@ -193,8 +193,8 @@ class Process:
stderr = self._read_stream(2)
else:
stderr = self._noop()
- stdin, stdout, stderr = await tasks.gather(stdin, stdout, stderr,
- loop=self._loop)
+ stdin, stdout, stderr = await tasks._gather(stdin, stdout, stderr,
+ loop=self._loop)
await self.wait()
return (stdout, stderr)
--- a/Lib/asyncio/tasks.py
+++ b/Lib/asyncio/tasks.py
@@ -580,15 +580,16 @@ def as_completed(fs, *, loop=None, timeo
if futures.isfuture(fs) or coroutines.iscoroutine(fs):
raise TypeError(f"expect an iterable of futures, not {type(fs).__name__}")
+ if loop is not None:
+ warnings.warn("The loop argument is deprecated since Python 3.8, "
+ "and scheduled for removal in Python 3.10.",
+ DeprecationWarning, stacklevel=2)
+
from .queues import Queue # Import here to avoid circular import problem.
done = Queue(loop=loop)
if loop is None:
loop = events.get_event_loop()
- else:
- warnings.warn("The loop argument is deprecated since Python 3.8, "
- "and scheduled for removal in Python 3.10.",
- DeprecationWarning, stacklevel=2)
todo = {ensure_future(f, loop=loop) for f in set(fs)}
timeout_handle = None
@@ -756,6 +757,10 @@ def gather(*coros_or_futures, loop=None,
"and scheduled for removal in Python 3.10.",
DeprecationWarning, stacklevel=2)
+ return _gather(*coros_or_futures, loop=loop, return_exceptions=return_exceptions)
+
+
+def _gather(*coros_or_futures, loop=None, return_exceptions=False):
if not coros_or_futures:
if loop is None:
loop = events.get_event_loop()
--- a/Lib/asyncio/unix_events.py
+++ b/Lib/asyncio/unix_events.py
@@ -323,7 +323,7 @@ class _UnixSelectorEventLoop(selector_ev
server._start_serving()
# Skip one loop iteration so that all 'loop.add_reader'
# go through.
- await tasks.sleep(0, loop=self)
+ await tasks.sleep(0)
return server
--- a/Lib/test/test_asyncgen.py
+++ b/Lib/test/test_asyncgen.py
@@ -1077,6 +1077,84 @@ class AsyncGenAsyncioTest(unittest.TestC
self.assertEqual(finalized, 2)
+ def test_async_gen_asyncio_shutdown_02(self):
+ messages = []
+
+ def exception_handler(loop, context):
+ messages.append(context)
+
+ async def async_iterate():
+ yield 1
+ yield 2
+
+ it = async_iterate()
+ async def main():
+ loop = asyncio.get_running_loop()
+ loop.set_exception_handler(exception_handler)
+
+ async for i in it:
+ break
+
+ asyncio.run(main())
+
+ self.assertEqual(messages, [])
+
+ def test_async_gen_asyncio_shutdown_exception_01(self):
+ messages = []
+
+ def exception_handler(loop, context):
+ messages.append(context)
+
+ async def async_iterate():
+ try:
+ yield 1
+ yield 2
+ finally:
+ 1/0
+
+ it = async_iterate()
+ async def main():
+ loop = asyncio.get_running_loop()
+ loop.set_exception_handler(exception_handler)
+
+ async for i in it:
+ break
+
+ asyncio.run(main())
+
+ message, = messages
+ self.assertEqual(message['asyncgen'], it)
+ self.assertIsInstance(message['exception'], ZeroDivisionError)
+ self.assertIn('an error occurred during closing of asynchronous generator',
+ message['message'])
+
+ def test_async_gen_asyncio_shutdown_exception_02(self):
+ messages = []
+
+ def exception_handler(loop, context):
+ messages.append(context)
+
+ async def async_iterate():
+ try:
+ yield 1
+ yield 2
+ finally:
+ 1/0
+
+ async def main():
+ loop = asyncio.get_running_loop()
+ loop.set_exception_handler(exception_handler)
+
+ async for i in async_iterate():
+ break
+
+ asyncio.run(main())
+
+ message, = messages
+ self.assertIsInstance(message['exception'], ZeroDivisionError)
+ self.assertIn('unhandled exception during asyncio.run() shutdown',
+ message['message'])
+
def test_async_gen_expression_01(self):
async def arange(n):
for i in range(n):
--- a/Lib/test/test_asyncio/__init__.py
+++ b/Lib/test/test_asyncio/__init__.py
@@ -1,38 +1,10 @@
import os
from test import support
-import unittest
# Skip tests if we don't have concurrent.futures.
support.import_module('concurrent.futures')
-def load_tests(loader, _, pattern):
+def load_tests(*args):
pkg_dir = os.path.dirname(__file__)
- suite = AsyncioTestSuite()
- return support.load_package_tests(pkg_dir, loader, suite, pattern)
-
-
-class AsyncioTestSuite(unittest.TestSuite):
- """A custom test suite that also runs setup/teardown for the whole package.
-
- Normally unittest only runs setUpModule() and tearDownModule() within each
- test module part of the test suite. Copying those functions to each file
- would be tedious, let's run this once and for all.
- """
- def run(self, result, debug=False):
- ignore = support.ignore_deprecations_from
- tokens = {
- ignore("asyncio.base_events", like=r".*loop argument.*"),
- ignore("asyncio.unix_events", like=r".*loop argument.*"),
- ignore("asyncio.futures", like=r".*loop argument.*"),
- ignore("asyncio.runners", like=r".*loop argument.*"),
- ignore("asyncio.subprocess", like=r".*loop argument.*"),
- ignore("asyncio.tasks", like=r".*loop argument.*"),
- ignore("test.test_asyncio.test_events", like=r".*loop argument.*"),
- ignore("test.test_asyncio.test_queues", like=r".*loop argument.*"),
- ignore("test.test_asyncio.test_tasks", like=r".*loop argument.*"),
- }
- try:
- super().run(result, debug=debug)
- finally:
- support.clear_ignored_deprecations(*tokens)
+ return support.load_package_tests(pkg_dir, *args)
--- a/Lib/test/test_asyncio/test_events.py
+++ b/Lib/test/test_asyncio/test_events.py
@@ -205,8 +205,8 @@ class MySubprocessProtocol(asyncio.Subpr
self.disconnects = {fd: loop.create_future() for fd in range(3)}
self.data = {1: b'', 2: b''}
self.returncode = None
- self.got_data = {1: asyncio.Event(loop=loop),
- 2: asyncio.Event(loop=loop)}
+ self.got_data = {1: asyncio.Event(),
+ 2: asyncio.Event()}
def connection_made(self, transport):
self.transport = transport
@@ -1736,20 +1736,19 @@ class SubprocessTestsMixin:
connect = self.loop.subprocess_exec(
functools.partial(MySubprocessProtocol, self.loop),
sys.executable, prog)
- with self.assertWarns(DeprecationWarning):
- transp, proto = self.loop.run_until_complete(connect)
- self.assertIsInstance(proto, MySubprocessProtocol)
- self.loop.run_until_complete(proto.connected)
- self.assertEqual('CONNECTED', proto.state)
+ transp, proto = self.loop.run_until_complete(connect)
+ self.assertIsInstance(proto, MySubprocessProtocol)
+ self.loop.run_until_complete(proto.connected)
+ self.assertEqual('CONNECTED', proto.state)
- stdin = transp.get_pipe_transport(0)
- stdin.write(b'Python The Winner')
- self.loop.run_until_complete(proto.got_data[1].wait())
- with test_utils.disable_logger():
- transp.close()
- self.loop.run_until_complete(proto.completed)
- self.check_killed(proto.returncode)
- self.assertEqual(b'Python The Winner', proto.data[1])
+ stdin = transp.get_pipe_transport(0)
+ stdin.write(b'Python The Winner')
+ self.loop.run_until_complete(proto.got_data[1].wait())
+ with test_utils.disable_logger():
+ transp.close()
+ self.loop.run_until_complete(proto.completed)
+ self.check_killed(proto.returncode)
+ self.assertEqual(b'Python The Winner', proto.data[1])
def test_subprocess_interactive(self):
prog = os.path.join(os.path.dirname(__file__), 'echo.py')
@@ -1758,51 +1757,48 @@ class SubprocessTestsMixin:
functools.partial(MySubprocessProtocol, self.loop),
sys.executable, prog)
- with self.assertWarns(DeprecationWarning):
- transp, proto = self.loop.run_until_complete(connect)
- self.assertIsInstance(proto, MySubprocessProtocol)
- self.loop.run_until_complete(proto.connected)
- self.assertEqual('CONNECTED', proto.state)
+ transp, proto = self.loop.run_until_complete(connect)
+ self.assertIsInstance(proto, MySubprocessProtocol)
+ self.loop.run_until_complete(proto.connected)
+ self.assertEqual('CONNECTED', proto.state)
- stdin = transp.get_pipe_transport(0)
- stdin.write(b'Python ')
- self.loop.run_until_complete(proto.got_data[1].wait())
- proto.got_data[1].clear()
- self.assertEqual(b'Python ', proto.data[1])
-
- stdin.write(b'The Winner')
- self.loop.run_until_complete(proto.got_data[1].wait())
- self.assertEqual(b'Python The Winner', proto.data[1])
+ stdin = transp.get_pipe_transport(0)
+ stdin.write(b'Python ')
+ self.loop.run_until_complete(proto.got_data[1].wait())
+ proto.got_data[1].clear()
+ self.assertEqual(b'Python ', proto.data[1])
+
+ stdin.write(b'The Winner')
+ self.loop.run_until_complete(proto.got_data[1].wait())
+ self.assertEqual(b'Python The Winner', proto.data[1])
- with test_utils.disable_logger():
- transp.close()
- self.loop.run_until_complete(proto.completed)
- self.check_killed(proto.returncode)
+ with test_utils.disable_logger():
+ transp.close()
+ self.loop.run_until_complete(proto.completed)
+ self.check_killed(proto.returncode)
def test_subprocess_shell(self):
- with self.assertWarns(DeprecationWarning):
- connect = self.loop.subprocess_shell(
- functools.partial(MySubprocessProtocol, self.loop),
- 'echo Python')
- transp, proto = self.loop.run_until_complete(connect)
- self.assertIsInstance(proto, MySubprocessProtocol)
- self.loop.run_until_complete(proto.connected)
+ connect = self.loop.subprocess_shell(
+ functools.partial(MySubprocessProtocol, self.loop),
+ 'echo Python')
+ transp, proto = self.loop.run_until_complete(connect)
+ self.assertIsInstance(proto, MySubprocessProtocol)
+ self.loop.run_until_complete(proto.connected)
- transp.get_pipe_transport(0).close()
- self.loop.run_until_complete(proto.completed)
- self.assertEqual(0, proto.returncode)
- self.assertTrue(all(f.done() for f in proto.disconnects.values()))
- self.assertEqual(proto.data[1].rstrip(b'\r\n'), b'Python')
- self.assertEqual(proto.data[2], b'')
- transp.close()
+ transp.get_pipe_transport(0).close()
+ self.loop.run_until_complete(proto.completed)
+ self.assertEqual(0, proto.returncode)
+ self.assertTrue(all(f.done() for f in proto.disconnects.values()))
+ self.assertEqual(proto.data[1].rstrip(b'\r\n'), b'Python')
+ self.assertEqual(proto.data[2], b'')
+ transp.close()
def test_subprocess_exitcode(self):
connect = self.loop.subprocess_shell(
functools.partial(MySubprocessProtocol, self.loop),
'exit 7', stdin=None, stdout=None, stderr=None)
- with self.assertWarns(DeprecationWarning):
- transp, proto = self.loop.run_until_complete(connect)
+ transp, proto = self.loop.run_until_complete(connect)
self.assertIsInstance(proto, MySubprocessProtocol)
self.loop.run_until_complete(proto.completed)
self.assertEqual(7, proto.returncode)
@@ -1812,8 +1808,7 @@ class SubprocessTestsMixin:
connect = self.loop.subprocess_shell(
functools.partial(MySubprocessProtocol, self.loop),
'exit 7', stdin=None, stdout=None, stderr=None)
- with self.assertWarns(DeprecationWarning):
- transp, proto = self.loop.run_until_complete(connect)
+ transp, proto = self.loop.run_until_complete(connect)
self.assertIsInstance(proto, MySubprocessProtocol)
self.assertIsNone(transp.get_pipe_transport(0))
self.assertIsNone(transp.get_pipe_transport(1))
@@ -1829,15 +1824,14 @@ class SubprocessTestsMixin:
functools.partial(MySubprocessProtocol, self.loop),
sys.executable, prog)
- with self.assertWarns(DeprecationWarning):
- transp, proto = self.loop.run_until_complete(connect)
- self.assertIsInstance(proto, MySubprocessProtocol)
- self.loop.run_until_complete(proto.connected)
+ transp, proto = self.loop.run_until_complete(connect)
+ self.assertIsInstance(proto, MySubprocessProtocol)
+ self.loop.run_until_complete(proto.connected)
- transp.kill()
- self.loop.run_until_complete(proto.completed)
- self.check_killed(proto.returncode)
- transp.close()
+ transp.kill()
+ self.loop.run_until_complete(proto.completed)
+ self.check_killed(proto.returncode)
+ transp.close()
def test_subprocess_terminate(self):
prog = os.path.join(os.path.dirname(__file__), 'echo.py')
@@ -1846,15 +1840,14 @@ class SubprocessTestsMixin:
functools.partial(MySubprocessProtocol, self.loop),
sys.executable, prog)
- with self.assertWarns(DeprecationWarning):
- transp, proto = self.loop.run_until_complete(connect)
- self.assertIsInstance(proto, MySubprocessProtocol)
- self.loop.run_until_complete(proto.connected)
+ transp, proto = self.loop.run_until_complete(connect)
+ self.assertIsInstance(proto, MySubprocessProtocol)
+ self.loop.run_until_complete(proto.connected)
- transp.terminate()
- self.loop.run_until_complete(proto.completed)
- self.check_terminated(proto.returncode)
- transp.close()
+ transp.terminate()
+ self.loop.run_until_complete(proto.completed)
+ self.check_terminated(proto.returncode)
+ transp.close()
@unittest.skipIf(sys.platform == 'win32', "Don't have SIGHUP")
def test_subprocess_send_signal(self):
@@ -1869,15 +1862,14 @@ class SubprocessTestsMixin:
functools.partial(MySubprocessProtocol, self.loop),
sys.executable, prog)
- with self.assertWarns(DeprecationWarning):
- transp, proto = self.loop.run_until_complete(connect)
- self.assertIsInstance(proto, MySubprocessProtocol)
- self.loop.run_until_complete(proto.connected)
-
- transp.send_signal(signal.SIGHUP)
- self.loop.run_until_complete(proto.completed)
- self.assertEqual(-signal.SIGHUP, proto.returncode)
- transp.close()
+ transp, proto = self.loop.run_until_complete(connect)
+ self.assertIsInstance(proto, MySubprocessProtocol)
+ self.loop.run_until_complete(proto.connected)
+
+ transp.send_signal(signal.SIGHUP)
+ self.loop.run_until_complete(proto.completed)
+ self.assertEqual(-signal.SIGHUP, proto.returncode)
+ transp.close()
finally:
signal.signal(signal.SIGHUP, old_handler)
@@ -1888,20 +1880,19 @@ class SubprocessTestsMixin:
functools.partial(MySubprocessProtocol, self.loop),
sys.executable, prog)
- with self.assertWarns(DeprecationWarning):
- transp, proto = self.loop.run_until_complete(connect)
- self.assertIsInstance(proto, MySubprocessProtocol)
- self.loop.run_until_complete(proto.connected)
+ transp, proto = self.loop.run_until_complete(connect)
+ self.assertIsInstance(proto, MySubprocessProtocol)
+ self.loop.run_until_complete(proto.connected)
- stdin = transp.get_pipe_transport(0)
- stdin.write(b'test')
+ stdin = transp.get_pipe_transport(0)
+ stdin.write(b'test')
- self.loop.run_until_complete(proto.completed)
+ self.loop.run_until_complete(proto.completed)
- transp.close()
- self.assertEqual(b'OUT:test', proto.data[1])
- self.assertTrue(proto.data[2].startswith(b'ERR:test'), proto.data[2])
- self.assertEqual(0, proto.returncode)
+ transp.close()
+ self.assertEqual(b'OUT:test', proto.data[1])
+ self.assertTrue(proto.data[2].startswith(b'ERR:test'), proto.data[2])
+ self.assertEqual(0, proto.returncode)
def test_subprocess_stderr_redirect_to_stdout(self):
prog = os.path.join(os.path.dirname(__file__), 'echo2.py')
@@ -1910,23 +1901,22 @@ class SubprocessTestsMixin:
functools.partial(MySubprocessProtocol, self.loop),
sys.executable, prog, stderr=subprocess.STDOUT)
- with self.assertWarns(DeprecationWarning):
- transp, proto = self.loop.run_until_complete(connect)
- self.assertIsInstance(proto, MySubprocessProtocol)
- self.loop.run_until_complete(proto.connected)
+ transp, proto = self.loop.run_until_complete(connect)
+ self.assertIsInstance(proto, MySubprocessProtocol)
+ self.loop.run_until_complete(proto.connected)
- stdin = transp.get_pipe_transport(0)
- self.assertIsNotNone(transp.get_pipe_transport(1))
- self.assertIsNone(transp.get_pipe_transport(2))
+ stdin = transp.get_pipe_transport(0)
+ self.assertIsNotNone(transp.get_pipe_transport(1))
+ self.assertIsNone(transp.get_pipe_transport(2))
- stdin.write(b'test')
- self.loop.run_until_complete(proto.completed)
- self.assertTrue(proto.data[1].startswith(b'OUT:testERR:test'),
- proto.data[1])
- self.assertEqual(b'', proto.data[2])
+ stdin.write(b'test')
+ self.loop.run_until_complete(proto.completed)
+ self.assertTrue(proto.data[1].startswith(b'OUT:testERR:test'),
+ proto.data[1])
+ self.assertEqual(b'', proto.data[2])
- transp.close()
- self.assertEqual(0, proto.returncode)
+ transp.close()
+ self.assertEqual(0, proto.returncode)
def test_subprocess_close_client_stream(self):
prog = os.path.join(os.path.dirname(__file__), 'echo3.py')
@@ -1934,33 +1924,32 @@ class SubprocessTestsMixin:
connect = self.loop.subprocess_exec(
functools.partial(MySubprocessProtocol, self.loop),
sys.executable, prog)
- with self.assertWarns(DeprecationWarning):
- transp, proto = self.loop.run_until_complete(connect)
- self.assertIsInstance(proto, MySubprocessProtocol)
- self.loop.run_until_complete(proto.connected)
+ transp, proto = self.loop.run_until_complete(connect)
+ self.assertIsInstance(proto, MySubprocessProtocol)
+ self.loop.run_until_complete(proto.connected)
- stdin = transp.get_pipe_transport(0)
- stdout = transp.get_pipe_transport(1)
- stdin.write(b'test')
- self.loop.run_until_complete(proto.got_data[1].wait())
- self.assertEqual(b'OUT:test', proto.data[1])
-
- stdout.close()
- self.loop.run_until_complete(proto.disconnects[1])
- stdin.write(b'xxx')
- self.loop.run_until_complete(proto.got_data[2].wait())
- if sys.platform != 'win32':
- self.assertEqual(b'ERR:BrokenPipeError', proto.data[2])
- else:
- # After closing the read-end of a pipe, writing to the
- # write-end using os.write() fails with errno==EINVAL and
- # GetLastError()==ERROR_INVALID_NAME on Windows!?! (Using
- # WriteFile() we get ERROR_BROKEN_PIPE as expected.)
- self.assertEqual(b'ERR:OSError', proto.data[2])
- with test_utils.disable_logger():
- transp.close()
- self.loop.run_until_complete(proto.completed)
- self.check_killed(proto.returncode)
+ stdin = transp.get_pipe_transport(0)
+ stdout = transp.get_pipe_transport(1)
+ stdin.write(b'test')
+ self.loop.run_until_complete(proto.got_data[1].wait())
+ self.assertEqual(b'OUT:test', proto.data[1])
+
+ stdout.close()
+ self.loop.run_until_complete(proto.disconnects[1])
+ stdin.write(b'xxx')
+ self.loop.run_until_complete(proto.got_data[2].wait())
+ if sys.platform != 'win32':
+ self.assertEqual(b'ERR:BrokenPipeError', proto.data[2])
+ else:
+ # After closing the read-end of a pipe, writing to the
+ # write-end using os.write() fails with errno==EINVAL and
+ # GetLastError()==ERROR_INVALID_NAME on Windows!?! (Using
+ # WriteFile() we get ERROR_BROKEN_PIPE as expected.)
+ self.assertEqual(b'ERR:OSError', proto.data[2])
+ with test_utils.disable_logger():
+ transp.close()
+ self.loop.run_until_complete(proto.completed)
+ self.check_killed(proto.returncode)
def test_subprocess_wait_no_same_group(self):
# start the new process in a new session
--- a/Lib/test/test_asyncio/test_queues.py
+++ b/Lib/test/test_asyncio/test_queues.py
@@ -301,11 +301,12 @@ class QueueGetTests(_QueueTestBase):
with self.assertWarns(DeprecationWarning):
q = asyncio.Queue(queue_size, loop=self.loop)
- self.loop.run_until_complete(
- asyncio.gather(producer(q, producer_num_items),
- consumer(q, producer_num_items),
- loop=self.loop),
- )
+ with self.assertWarns(DeprecationWarning):
+ self.loop.run_until_complete(
+ asyncio.gather(producer(q, producer_num_items),
+ consumer(q, producer_num_items),
+ loop=self.loop),
+ )
def test_cancelled_getters_not_being_held_in_self_getters(self):
def a_generator():
@@ -555,8 +556,9 @@ class QueuePutTests(_QueueTestBase):
t1 = putter(1)
t2 = putter(2)
t3 = putter(3)
- self.loop.run_until_complete(
- asyncio.gather(getter(), t0, t1, t2, t3, loop=self.loop))
+ with self.assertWarns(DeprecationWarning):
+ self.loop.run_until_complete(
+ asyncio.gather(getter(), t0, t1, t2, t3, loop=self.loop))
def test_cancelled_puts_not_being_held_in_self_putters(self):
def a_generator():
--- a/Lib/test/test_asyncio/test_tasks.py
+++ b/Lib/test/test_asyncio/test_tasks.py
@@ -1606,8 +1606,9 @@ class BaseTaskTests:
for f in asyncio.as_completed([b, c, a], loop=loop):
values.append(await f)
return values
- with self.assertWarns(DeprecationWarning):
+ with self.assertWarns(DeprecationWarning) as w:
res = loop.run_until_complete(self.new_task(loop, foo()))
+ self.assertEqual(w.warnings[0].filename, __file__)
self.assertAlmostEqual(0.15, loop.time())
self.assertTrue('a' in res[:2])
self.assertTrue('b' in res[:2])
@@ -3348,7 +3349,8 @@ class FutureGatherTests(GatherTestsBase,
with self.assertRaises(ValueError):
asyncio.gather(fut1, fut2)
with self.assertRaises(ValueError):
- asyncio.gather(fut1, loop=self.other_loop)
+ with self.assertWarns(DeprecationWarning):
+ asyncio.gather(fut1, loop=self.other_loop)
def test_constructor_homogenous_futures(self):
children = [self.other_loop.create_future() for i in range(3)]
@@ -3356,7 +3358,8 @@ class FutureGatherTests(GatherTestsBase,
self.assertIs(fut._loop, self.other_loop)
self._run_loop(self.other_loop)
self.assertFalse(fut.done())
- fut = asyncio.gather(*children, loop=self.other_loop)
+ with self.assertWarns(DeprecationWarning):
+ fut = asyncio.gather(*children, loop=self.other_loop)
self.assertIs(fut._loop, self.other_loop)
self._run_loop(self.other_loop)
self.assertFalse(fut.done())
@@ -3429,7 +3432,8 @@ class CoroutineGatherTests(GatherTestsBa
self.set_event_loop(self.other_loop, cleanup=False)
gen3 = coro()
gen4 = coro()
- fut2 = asyncio.gather(gen3, gen4, loop=self.other_loop)
+ with self.assertWarns(DeprecationWarning):
+ fut2 = asyncio.gather(gen3, gen4, loop=self.other_loop)
self.assertIs(fut2._loop, self.other_loop)
self.other_loop.run_until_complete(fut2)
@@ -3439,7 +3443,8 @@ class CoroutineGatherTests(GatherTestsBa
def coro(s):
return s
c = coro('abc')
- fut = asyncio.gather(c, c, coro('def'), c, loop=self.one_loop)
+ with self.assertWarns(DeprecationWarning):
+ fut = asyncio.gather(c, c, coro('def'), c, loop=self.one_loop)
self._run_loop(self.one_loop)
self.assertEqual(fut.result(), ['abc', 'abc', 'def', 'abc'])
@@ -3459,7 +3464,7 @@ class CoroutineGatherTests(GatherTestsBa
async def outer():
nonlocal proof, gatherer
- gatherer = asyncio.gather(child1, child2, loop=self.one_loop)
+ gatherer = asyncio.gather(child1, child2)
await gatherer
proof += 100
@@ -3486,7 +3491,7 @@ class CoroutineGatherTests(GatherTestsBa
b = self.one_loop.create_future()
async def outer():
- await asyncio.gather(inner(a), inner(b), loop=self.one_loop)
+ await asyncio.gather(inner(a), inner(b))
f = asyncio.ensure_future(outer(), loop=self.one_loop)
test_utils.run_briefly(self.one_loop)
@@ -3705,7 +3710,7 @@ class CompatibilityTests(test_utils.Test
return 'ok2'
async def inner():
- return await asyncio.gather(coro1(), coro2(), loop=self.loop)
+ return await asyncio.gather(coro1(), coro2())
result = self.loop.run_until_complete(inner())
self.assertEqual(['ok1', 'ok2'], result)
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2021-09-04-13-10-25.bpo-45097.5J4IC-.rst
@@ -0,0 +1,2 @@
+Remove deprecation warnings about the loop argument in :mod:`asyncio`
+incorrectly emitted in cases when the user does not pass the loop argument.

View File

@ -1,3 +1,92 @@
-------------------------------------------------------------------
Wed Nov 17 09:49:22 UTC 2021 - Steve Kowalik <steven.kowalik@suse.com>
- Update to 3.9.9:
* Core and Builtins
+ bpo-30570: Fixed a crash in issubclass() from infinite recursion when searching pathological __bases__ tuples.
+ bpo-45494: Fix parser crash when reporting errors involving invalid continuation characters. Patch by Pablo Galindo.
+ bpo-45385: Fix reference leak from descr_check. Patch by Dong-hee Na.
+ bpo-45167: Fix deepcopying of types.GenericAlias objects.
+ bpo-44219: Release the GIL while performing isatty system calls on arbitrary file descriptors. In particular, this affects os.isatty(), os.device_encoding() and io.TextIOWrapper. By extension, io.open() in text mode is also affected. This change solves a deadlock in os.isatty(). Patch by Vincent Michel in bpo-44219.
+ bpo-44959: Added fallback to extension modules with .sl suffix on HP-UX
+ bpo-44050: Extensions that indicate they use global state (by setting m_size to -1) can again be used in multiple interpreters. This reverts to behavior of Python 3.8.
+ bpo-45121: Fix issue where Protocol.__init__ raises RecursionError when its called directly or via super(). Patch provided by Yurii Karabas.
+ bpo-45083: When the interpreter renders an exception, its name now has a complete qualname. Previously only the class name was concatenated to the module name, which sometimes resulted in an incorrect full name being displayed.
+ bpo-45738: Fix computation of error location for invalid continuation characters in the parser. Patch by Pablo Galindo.
+ Library
+ bpo-45678: Fix bug in Python 3.9 that meant functools.singledispatchmethod failed to properly wrap the attributes of the target method. Patch by Alex Waygood.
+ bpo-45679: Fix caching of multi-value typing.Literal. Literal[True, 2] is no longer equal to Literal[1, 2].
+ bpo-45438: Fix typing.Signature string representation for generic builtin types.
+ bpo-45581: sqlite3.connect() now correctly raises MemoryError if the underlying SQLite API signals memory error. Patch by Erlend E. Aasland.
+ bpo-39679: Fix bug in functools.singledispatchmethod that caused it to fail when attempting to register a classmethod() or staticmethod() using type annotations. Patch contributed by Alex Waygood.
+ bpo-45515: Add references to zoneinfo in the datetime documentation, mostly replacing outdated references to dateutil.tz. Change by Paul Ganssle.
+ bpo-45467: Fix incremental decoder and stream reader in the “raw-unicode-escape” codec. Previously they failed if the escape sequence was split.
+ bpo-45461: Fix incremental decoder and stream reader in the “unicode-escape” codec. Previously they failed if the escape sequence was split.
+ bpo-45239: Fixed email.utils.parsedate_tz() crashing with UnboundLocalError on certain invalid input instead of returning None. Patch by Ben Hoyt.
+ bpo-44904: Fix bug in the doctest module that caused it to fail if a docstring included an example with a classmethod property. Patch by Alex Waygood.
+ bpo-45406: Make inspect.getmodule() catch FileNotFoundError raised by :func:inspect.getabsfile, and return None to indicate that the module could not be determined.
+ bpo-45262: Prevent use-after-free in asyncio. Make sure the cached running loop holder gets cleared on dealloc to prevent use-after-free in get_running_loop
+ bpo-45386: Make xmlrpc.client more robust to C runtimes where the underlying C strftime function results in a ValueError when testing for year formatting options.
+ bpo-45371: Fix clang rpath issue in distutils. The UnixCCompiler now uses correct clang option to add a runtime library directory (rpath) to a shared library.
+ bpo-20028: Improve error message of csv.Dialect when initializing. Patch by Vajrasky Kok and Dong-hee Na.
+ bpo-45343: Update bundled pip to 21.2.4 and setuptools to 58.1.0
+ bpo-41710: On Unix, if the sem_clockwait() function is available in the C library (glibc 2.30 and newer), the threading.Lock.acquire() method now uses the monotonic clock (time.CLOCK_MONOTONIC) for the timeout, rather than using the system clock (time.CLOCK_REALTIME), to not be affected by system clock changes. Patch by Victor Stinner.
+ bpo-45328: Fixed http.client.HTTPConnection to work properly in OSs that dont support the TCP_NODELAY socket option.
+ bpo-1596321: Fix the threading._shutdown() function when the threading module was imported first from a thread different than the main thread: no longer log an error at Python exit.
+ bpo-45274: Fix a race condition in the Thread.join() method of the threading module. If the function is interrupted by a signal and the signal handler raises an exception, make sure that the thread remains in a consistent state to prevent a deadlock. Patch by Victor Stinner.
+ bpo-45238: Fix unittest.IsolatedAsyncioTestCase.debug(): it runs now asynchronous methods and callbacks.
+ bpo-36674: unittest.TestCase.debug() raises now a unittest.SkipTest if the class or the test method are decorated with the skipping decorator.
+ bpo-45235: Fix an issue where argparse would not preserve values in a provided namespace when using a subparser with defaults.
+ bpo-45234: Fixed a regression in copyfile(), copy(), copy2() raising FileNotFoundError when source is a directory, which should raise IsADirectoryError
+ bpo-45228: Fix stack buffer overflow in parsing J1939 network address.
+ bpo-45192: Fix the tempfile._infer_return_type function so that the dir argument of the tempfile functions accepts an object implementing the os.PathLike protocol.
+ bpo-45160: When tracing a tkinter variable used by a ttk OptionMenu, callbacks are no longer made twice.
+ bpo-35474: Calling mimetypes.guess_all_extensions() with strict=False no longer affects the result of the following call with strict=True. Also, mutating the returned list no longer affects the global state.
+ bpo-45166: typing.get_type_hints() now works with Final wrapped in ForwardRef.
+ bpo-45097: Remove deprecation warnings about the loop argument in asyncio incorrectly emitted in cases when the user does not pass the loop argument.
+ bpo-45081: Fix issue when dataclasses that inherit from typing.Protocol subclasses have wrong __init__. Patch provided by Yurii Karabas.
+ bpo-24444: Fixed an error raised in argparse help display when help for an option is set to 1+ blank spaces or when choices arg is an empty container.
+ bpo-45021: Fix a potential deadlock at shutdown of forked children when using concurrent.futures module
+ bpo-45030: Fix integer overflow in pickling and copying the range iterator.
+ bpo-39039: tarfile.open raises ReadError when a zlib error occurs during file extraction.
+ bpo-44594: Fix an edge case of ExitStack and AsyncExitStack exception chaining. They will now match with block behavior when __context__ is explicitly set to None when the exception is in flight.
* Documentation
+ bpo-45726: Improve documentation for functools.singledispatch() and functools.singledispatchmethod.
+ bpo-45680: Amend the docs on GenericAlias objects to clarify that non-container classes can also implement __class_getitem__. Patch contributed by Alex Waygood.
+ bpo-45655: Add a new “relevant PEPs” section to the top of the documentation for the typing module. Patch by Alex Waygood.
+ bpo-45604: Add level argument to multiprocessing.log_to_stderr function docs.
+ bpo-45464: Mention in the documentation of Built-in Exceptions that inheriting from multiple exception types in a single subclass is not recommended due to possible memory layout incompatibility.
+ bpo-45449: Add note about PEP 585 in collections.abc.
+ bpo-45516: Add protocol description to the importlib.abc.Traversable documentation.
+ bpo-20692: Add Programming FAQ entry explaining that int literal attribute access requires either a space after or parentheses around the literal.
+ bpo-45216: Remove extra documentation listing methods in difflib. It was rendering twice in pydoc and was outdated in some places.
+ bpo-45772: socket.socket documentation is corrected to a class from a function.
+ bpo-45392: Update the docstring of the type built-in to remove a redundant line and to mention keyword arguments for the constructor.
* Tests
+ bpo-45578: Add tests for dis.distb()
+ bpo-45577: Add subtests for all pickle protocols in test_zoneinfo.
+ bpo-43592: test.libregrtest now raises the soft resource limit for the maximum number of file descriptors when the default is too low for our test suite as was often the case on macOS.
+ bpo-40173: Fix test.support.import_helper.import_fresh_module().
+ bpo-45280: Add a test case for empty typing.NamedTuple.
+ bpo-45269: Cover case when invalid markers type is supplied to c_make_encoder.
+ bpo-45209: Fix UserWarning: resource_tracker warning in _test_multiprocessing._TestSharedMemory.test_shared_memory_cleaned_after_process_termination
+ bpo-45195: Fix test_readline.test_nonascii(): sometimes, the newline character is not written at the end, so dont expect it in the output. Patch by Victor Stinner.
+ bpo-45156: Fixes infinite loop on unittest.mock.seal() of mocks created by create_autospec().
+ bpo-45042: Fixes that test classes decorated with @hashlib_helper.requires_hashdigest were skipped all the time.
+ bpo-45235: Reverted an argparse bugfix that caused regression in the handling of default arguments for subparsers. This prevented leaf level arguments from taking precedence over root level arguments.
+ bpo-45765: In importlib.metadata, fix distribution discovery for an empty path.
+ bpo-45644: In-place JSON file formatting using python3 -m json.tool infile infile now works correctly, previously it left the file empty. Patch by Chris Wesseling.
* Build
+ bpo-43158: setup.py now uses values from configure script to build the _uuid extension module. Configure now detects util-linuxs libuuid, too.
+ bpo-45571: Modules/Setup now use PY_CFLAGS_NODIST instead of PY_CFLAGS to compile shared modules.
+ bpo-45532: Update sys.version to use main as fallback information. Patch by Jeong YunWon.
+ bpo-45405: Prevent internal configure error when running configure with recent versions of non-Apple clang. Patch by David Bohman.
+ bpo-45220: Avoid building with the Windows 11 SDK previews automatically. This may be overridden by setting the DefaultWindowsSDKVersion environment variable before building.
* C API
+ bpo-44687: BufferedReader.peek() no longer raises ValueError when the entire file has already been buffered.
+ bpo-44751: Remove crypt.h include from the public Python.h header.
- Drop patch incorrect-deprecation-warn-asyncio.patch, fix included.
-------------------------------------------------------------------
Sat Oct 30 12:37:34 UTC 2021 - Matej Cepl <mcepl@suse.com>

View File

@ -53,7 +53,7 @@
# Will do the /usr/bin/python3 and all the core links
%define primary_interpreter 0
# We don't process beta signs well
%define folderversion 3.9.7
%define folderversion 3.9.9
%define tarname Python-%{tarversion}
%define sitedir %{_libdir}/python%{python_version}
# three possible ABI kinds: m - pymalloc, d - debug build; see PEP 3149
@ -89,7 +89,7 @@
%define dynlib() %{sitedir}/lib-dynload/%{1}.cpython-%{abi_tag}-%{archname}-%{_os}%{?_gnu}%{?armsuffix}.so
%bcond_without profileopt
Name: %{python_pkg_name}%{psuffix}
Version: 3.9.7
Version: 3.9.9
Release: 0
Summary: Python 3 Interpreter
License: Python-2.0
@ -151,9 +151,6 @@ Patch33: no-skipif-doctests.patch
# PATCH-FIX-SLE skip-test_pyobject_freed_is_freed.patch mcepl@suse.com
# skip a test failing on SLE-15
Patch34: skip-test_pyobject_freed_is_freed.patch
# PATCH-FIX-UPSTREAM incorrect-deprecation-warn-asyncio.patch bpo#45097 mcepl@suse.com
# Remove incorrect deprecation warnings in asyncio
Patch35: incorrect-deprecation-warn-asyncio.patch
BuildRequires: autoconf-archive
BuildRequires: automake
BuildRequires: fdupes
@ -411,7 +408,6 @@ other applications.
%if %{with mpdecimal}
%patch05 -p1
%endif
%patch35 -p1
# drop Autoconf version requirement
sed -i 's/^AC_PREREQ/dnl AC_PREREQ/' configure.ac