public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
From: Benjamin A. Beasley <code@musicinmybrain.net>
To: git-commits@fedoraproject.org
Subject: [rpms/python-zlib-ng] rawhide: Use upstream patch for Python 3.15; also fixes pytest 9.1
Date: Sun, 05 Jul 2026 08:11:24 GMT	[thread overview]
Message-ID: <178323908426.1.4306048727377062106.rpms-python-zlib-ng-e81867188071@fedoraproject.org> (raw)

A new commit has been pushed.

Repo   : rpms/python-zlib-ng
Branch : rawhide
Commit : e8186718807181b56ac07088eb3e757b2e656621
Author : Benjamin A. Beasley <code@musicinmybrain.net>
Date   : 2026-07-05T09:10:58+01:00
Stats  : +261/-41 in 3 file(s)
URL    : https://src.fedoraproject.org/rpms/python-zlib-ng/c/e8186718807181b56ac07088eb3e757b2e656621?branch=rawhide

Log:
Use upstream patch for Python 3.15; also fixes pytest 9.1

---
diff --git a/0001-Fix-a-crash-when-calling-copy-on-a-flushed-compress-.patch b/0001-Fix-a-crash-when-calling-copy-on-a-flushed-compress-.patch
new file mode 100644
index 0000000..5dcf2a5
--- /dev/null
+++ b/0001-Fix-a-crash-when-calling-copy-on-a-flushed-compress-.patch
@@ -0,0 +1,256 @@
+From 21e96bb9df1771d8caeea18f16362655db4f9f4c Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?=
+ <16805946+edgarrmondragon@users.noreply.github.com>
+Date: Fri, 3 Jul 2026 01:02:25 -0600
+Subject: [PATCH] Fix a crash when calling ``copy()`` on a flushed compress
+ object on Python 3.15 (#80)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+* Fix a crash when calling `copy()` on a flushed compress object on Python 3.15
+
+Signed-off-by: Edgar Ramírez Mondragón <edgarrm358@gmail.com>
+
+* test: Address Pytest 9.1 warnings
+
+Signed-off-by: Edgar Ramírez Mondragón <edgarrm358@gmail.com>
+
+* chore: Allow usage of ` tox -e 3.15 -- <some pytest params>`
+
+Signed-off-by: Edgar Ramírez Mondragón <edgarrm358@gmail.com>
+
+* ci: Add Python 3.15 and 3.15t to CI matrix
+
+Signed-off-by: Edgar Ramírez Mondragón <edgarrm358@gmail.com>
+
+* ci: Replace `macos-13` runner with `macos-15-intel`
+
+Signed-off-by: Edgar Ramírez Mondragón <edgarrm358@gmail.com>
+
+---------
+
+Signed-off-by: Edgar Ramírez Mondragón <edgarrm358@gmail.com>
+---
+ .github/workflows/ci.yml       |  8 +++++---
+ src/zlib_ng/zlib_ngmodule.c    |  3 ++-
+ tests/test_compat.py           | 24 ++++++++++++------------
+ tests/test_gzip_ng.py          |  2 +-
+ tests/test_gzip_ng_threaded.py |  4 ++--
+ tox.ini                        |  2 +-
+ 6 files changed, 23 insertions(+), 20 deletions(-)
+
+diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
+index e2bc13d..cf45278 100644
+--- a/.github/workflows/ci.yml
++++ b/.github/workflows/ci.yml
+@@ -59,13 +59,15 @@ jobs:
+           - "3.13"
+           - "3.14"
+           - "3.14t"
++          - "3.15"
++          - "3.15t"
+           - "pypy-3.10"
+           - "pypy-3.11"
+         os: ["ubuntu-latest"]
+         include:
+           - os: "macos-latest"  # For m1 macos
+             python-version: "3.12"
+-          - os: "macos-13"  # for x86 macos
++          - os: "macos-15-intel"  # for x86 macos
+             python-version: "3.10"
+           - os: "windows-latest"
+             python-version: "3.10"
+@@ -129,7 +131,7 @@ jobs:
+       matrix:
+         os:
+           - "ubuntu-latest"
+-          - "macos-13"
++          - "macos-15-intel"
+           - "macos-latest"
+           - "windows-latest"
+         python_version: [ "python" ]
+@@ -167,7 +169,7 @@ jobs:
+       matrix:
+         os:
+           - ubuntu-latest
+-          - macos-13
++          - macos-15-intel
+           - macos-latest
+           - windows-latest
+         cibw_archs_linux: ["x86_64"]
+diff --git a/src/zlib_ng/zlib_ngmodule.c b/src/zlib_ng/zlib_ngmodule.c
+index ea71d53..c8c2a32 100644
+--- a/src/zlib_ng/zlib_ngmodule.c
++++ b/src/zlib_ng/zlib_ngmodule.c
+@@ -801,7 +801,8 @@ zlib_Compress_copy(compobject *self, PyObject *Py_UNUSED(ignored))
+ 
+     if (!self->is_initialised) {
+         PyErr_SetString(PyExc_ValueError, "Cannot copy flushed objects.");
+-        goto error;
++        Py_DECREF(return_value);
++        return NULL;
+     }
+ 
+     /* Copy the zstream state
+diff --git a/tests/test_compat.py b/tests/test_compat.py
+index 12dda97..871bf84 100644
+--- a/tests/test_compat.py
++++ b/tests/test_compat.py
+@@ -64,21 +64,21 @@ def limited_zlib_tests(strategies=ZLIB_STRATEGIES):
+ 
+ 
+ @pytest.mark.parametrize(["data_size", "value"],
+-                         itertools.product(DATA_SIZES, SEEDS))
++                         list(itertools.product(DATA_SIZES, SEEDS)))
+ def test_crc32(data_size, value):
+     data = DATA[:data_size]
+     assert zlib.crc32(data, value) == zlib_ng.crc32(data, value)
+ 
+ 
+ @pytest.mark.parametrize(["data_size", "value"],
+-                         itertools.product(DATA_SIZES, SEEDS))
++                         list(itertools.product(DATA_SIZES, SEEDS)))
+ def test_adler32(data_size, value):
+     data = DATA[:data_size]
+     assert zlib.adler32(data, value) == zlib_ng.adler32(data, value)
+ 
+ 
+ @pytest.mark.parametrize(["data_size", "level", "wbits"],
+-                         itertools.product(DATA_SIZES, range(10), WBITS_RANGE))
++                         list(itertools.product(DATA_SIZES, range(10), WBITS_RANGE)))
+ def test_compress(data_size, level, wbits):
+     data = DATA[:data_size]
+     compressed = zlib_ng.compress(data, level=level, wbits=wbits)
+@@ -87,7 +87,7 @@ def test_compress(data_size, level, wbits):
+ 
+ 
+ @pytest.mark.parametrize(["data_size", "level"],
+-                         itertools.product(DATA_SIZES, range(10)))
++                         list(itertools.product(DATA_SIZES, range(10))))
+ def test_decompress_zlib(data_size, level):
+     data = DATA[:data_size]
+     compressed = zlib.compress(data, level=level)
+@@ -96,7 +96,7 @@ def test_decompress_zlib(data_size, level):
+ 
+ 
+ @pytest.mark.parametrize(["data_size", "level", "wbits", "memLevel", "strategy"],
+-                         limited_zlib_tests(ZLIB_STRATEGIES))
++                         list(limited_zlib_tests(ZLIB_STRATEGIES)))
+ def test_decompress_wbits(data_size, level, wbits, memLevel, strategy):
+     data = DATA[:data_size]
+     compressobj = zlib.compressobj(level=level, wbits=wbits, memLevel=memLevel,
+@@ -107,7 +107,7 @@ def test_decompress_wbits(data_size, level, wbits, memLevel, strategy):
+ 
+ 
+ @pytest.mark.parametrize(["data_size", "level", "wbits"],
+-                         itertools.product([128 * 1024], range(10), WBITS_RANGE),)
++                         list(itertools.product([128 * 1024], range(10), WBITS_RANGE),))
+ def test_decompress_zlib_ng(data_size, level, wbits):
+     data = DATA[:data_size]
+     compressed = zlib_ng.compress(data, level=level, wbits=wbits)
+@@ -116,7 +116,7 @@ def test_decompress_zlib_ng(data_size, level, wbits):
+ 
+ 
+ @pytest.mark.parametrize(["data_size", "level", "wbits", "memLevel", "strategy"],
+-                         limited_zlib_tests(ZLIBNG_STRATEGIES))
++                         list(limited_zlib_tests(ZLIBNG_STRATEGIES)))
+ def test_compress_compressobj(data_size, level, wbits, memLevel, strategy):
+     data = DATA[:data_size]
+     compressobj = zlib_ng.compressobj(level=level,
+@@ -129,7 +129,7 @@ def test_compress_compressobj(data_size, level, wbits, memLevel, strategy):
+ 
+ 
+ @pytest.mark.parametrize(["data_size", "level", "wbits", "memLevel", "strategy"],
+-                         limited_zlib_tests(ZLIB_STRATEGIES))
++                         list(limited_zlib_tests(ZLIB_STRATEGIES)))
+ def test_decompress_decompressobj(data_size, level, wbits, memLevel, strategy):
+     data = DATA[:data_size]
+     compressobj = zlib.compressobj(level=level, wbits=wbits, memLevel=memLevel,
+@@ -151,7 +151,7 @@ def test_decompressobj_unconsumed_tail():
+ 
+ 
+ @pytest.mark.parametrize(["data_size", "level"],
+-                         itertools.product(DATA_SIZES, range(10)))
++                         list(itertools.product(DATA_SIZES, range(10))))
+ def test_gzip_ng_compress(data_size, level):
+     data = DATA[:data_size]
+     compressed = gzip_ng.compress(data, compresslevel=level)
+@@ -159,7 +159,7 @@ def test_gzip_ng_compress(data_size, level):
+ 
+ 
+ @pytest.mark.parametrize(["data_size", "level"],
+-                         itertools.product(DATA_SIZES, range(10)))
++                         list(itertools.product(DATA_SIZES, range(10))))
+ def test_decompress_gzip(data_size, level):
+     data = DATA[:data_size]
+     compressed = gzip.compress(data, compresslevel=level)
+@@ -168,7 +168,7 @@ def test_decompress_gzip(data_size, level):
+ 
+ 
+ @pytest.mark.parametrize(["data_size", "level"],
+-                         itertools.product(DATA_SIZES, range(10)))
++                         list(itertools.product(DATA_SIZES, range(10))))
+ def test_decompress_gzip_ng(data_size, level):
+     data = DATA[:data_size]
+     compressed = gzip_ng.compress(data, compresslevel=level)
+@@ -177,7 +177,7 @@ def test_decompress_gzip_ng(data_size, level):
+ 
+ 
+ @pytest.mark.parametrize(["unused_size", "wbits"],
+-                         itertools.product([26], [-15, 15, 31]))
++                         list(itertools.product([26], [-15, 15, 31])))
+ def test_unused_data(unused_size, wbits):
+     unused_data = b"abcdefghijklmnopqrstuvwxyz"[:unused_size]
+     compressor = zlib.compressobj(wbits=wbits)
+diff --git a/tests/test_gzip_ng.py b/tests/test_gzip_ng.py
+index abfd283..6c9d3c6 100644
+--- a/tests/test_gzip_ng.py
++++ b/tests/test_gzip_ng.py
+@@ -65,7 +65,7 @@ def test_GzipNGFile_read_truncated():
+                 "reached")
+ 
+ 
+-@pytest.mark.parametrize("level", range(1, 10))
++@pytest.mark.parametrize("level", list(range(1, 10)))
+ def test_decompress_stdin_stdout(capsysbinary, level):
+     """Test if the command line can decompress data that has been compressed
+     by gzip at all levels."""
+diff --git a/tests/test_gzip_ng_threaded.py b/tests/test_gzip_ng_threaded.py
+index b976419..a587193 100644
+--- a/tests/test_gzip_ng_threaded.py
++++ b/tests/test_gzip_ng_threaded.py
+@@ -31,7 +31,7 @@ def test_threaded_read():
+ 
+ 
+ @pytest.mark.parametrize(["mode", "threads"],
+-                         itertools.product(["wb", "wt"], [1, 3, -1]))
++                         list(itertools.product(["wb", "wt"], [1, 3, -1])))
+ def test_threaded_write(mode, threads):
+     with tempfile.NamedTemporaryFile("wb", delete=False) as tmp:
+         # Use a small block size to simulate many writes.
+@@ -216,7 +216,7 @@ def test_threaded_writer_does_not_close_stream():
+ 
+ @pytest.mark.timeout(5)
+ @pytest.mark.parametrize(
+-    ["mode", "threads"], itertools.product(["rb", "wb"], [1, 2]))
++    ["mode", "threads"], list(itertools.product(["rb", "wb"], [1, 2])))
+ def test_threaded_program_can_exit_on_error(tmp_path, mode, threads):
+     program = tmp_path / "no_context_manager.py"
+     test_file = tmp_path / "output.gz"
+diff --git a/tox.ini b/tox.ini
+index 14409e4..dfefd90 100644
+--- a/tox.ini
++++ b/tox.ini
+@@ -15,7 +15,7 @@ setenv=
+     PYTHONDEVMODE=1
+ commands =
+     # Create HTML coverage report for humans and xml coverage report for external services.
+-    coverage run --branch --source=zlib_ng -m pytest tests
++    coverage run --branch --source=zlib_ng -m pytest {posargs:tests}
+     # Ignore errors during report generation. Pypy does not generate proper coverage reports.
+     coverage html -i
+     coverage xml -i
+-- 
+2.54.0
+

diff --git a/0001-Fix-crash-when-copying-flushed-compress-objects.patch b/0001-Fix-crash-when-copying-flushed-compress-objects.patch
deleted file mode 100644
index 191c498..0000000
--- a/0001-Fix-crash-when-copying-flushed-compress-objects.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 7f818db5343887f17923c37a36e82c41ef933b5e Mon Sep 17 00:00:00 2001
-From: Karolina Surma <ksurma@redhat.com>
-Date: Mon, 20 Apr 2026 17:37:04 +0200
-Subject: [PATCH] Fix crash when copying flushed compress objects
-
-The error path in zlib_Compress_copy() called LEAVE_ZLIB(self) via the
-error label even when ENTER_ZLIB(self) was never called. This happened
-when is_initialised is false (object already flushed), causing an
-unlock of a mutex that was never locked.
-
-On Python 3.15, PyThread_release_lock() now uses PyMutex_Unlock()
-(gh-134745) which fatally aborts on unlocking an unheld mutex, turning
-this latent bug into a crash (SIGABRT).
-
-Fix by returning directly instead of jumping to the error label that
-assumes the lock is held.
-
-Assisted-By: Claude 4.6 Sonnet
----
- src/zlib_ng/zlib_ngmodule.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/src/zlib_ng/zlib_ngmodule.c b/src/zlib_ng/zlib_ngmodule.c
-index ea71d53..c8c2a32 100644
---- a/src/zlib_ng/zlib_ngmodule.c
-+++ b/src/zlib_ng/zlib_ngmodule.c
-@@ -801,7 +801,8 @@ zlib_Compress_copy(compobject *self, PyObject *Py_UNUSED(ignored))
- 
-     if (!self->is_initialised) {
-         PyErr_SetString(PyExc_ValueError, "Cannot copy flushed objects.");
--        goto error;
-+        Py_DECREF(return_value);
-+        return NULL;
-     }
- 
-     /* Copy the zstream state
--- 
-2.53.0
-

diff --git a/python-zlib-ng.spec b/python-zlib-ng.spec
index d15aeb6..445c056 100644
--- a/python-zlib-ng.spec
+++ b/python-zlib-ng.spec
@@ -10,8 +10,11 @@ License:        PSF-2.0
 URL:            https://github.com/pycompression/python-zlib-ng
 Source:         %{url}/archive/v%{version}/python-zlib-ng-%{version}.tar.gz
 
-# https://github.com/pycompression/python-zlib-ng/issues/75
-Patch:          0001-Fix-crash-when-copying-flushed-compress-objects.patch
+# Fix a crash when calling `copy()` on a flushed compress object on Python 3.15
+# * test: Address Pytest 9.1 warnings
+# …etc. Fixes https://github.com/pycompression/python-zlib-ng/issues/75.
+# https://github.com/pycompression/python-zlib-ng/commit/10d2ffd6e97dca906da84d59c5b39fad915b5262
+Patch:          0001-Fix-a-crash-when-calling-copy-on-a-flushed-compress-.patch
 
 BuildSystem:    pyproject
 BuildOption(install): --assert-license zlib_ng

                 reply	other threads:[~2026-07-05  8:11 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=178323908426.1.4306048727377062106.rpms-python-zlib-ng-e81867188071@fedoraproject.org \
    --to=code@musicinmybrain.net \
    --cc=git-commits@fedoraproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox