Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-qt5-sip for openSUSE:Factory checked in at 2026-10-01 16:59:57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-qt5-sip (Old) and /work/SRC/openSUSE:Factory/.python-qt5-sip.new.1253 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-qt5-sip" Thu Oct 1 16:59:57 2026 rev:15 rq:1381694 version:12.19.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-qt5-sip/python-qt5-sip.changes 2025-07-06 17:05:30.484987876 +0200 +++ /work/SRC/openSUSE:Factory/.python-qt5-sip.new.1253/python-qt5-sip.changes 2026-10-01 17:00:15.939238541 +0200 @@ -1,0 +2,22 @@ +Sat Sep 26 15:50:42 UTC 2026 - Andrea Manzini <[email protected]> + +- Update to 12.19.0 (crosses 12.17.0, 12.17.1, 12.17.2, 12.18.0): + * Added support for Python v3.14 and v3.15. + * Added SIP_ABI_VERSION as a module attribute. + * Changed the type/enum pickle format to be more robust and + faster; still reads the legacy format. + * Fixed a potential buffer overflow in sipDeprecated() with long + deprecation messages. + * Fixed a missing early return on an array-to-list conversion + error path. + * Setting a read-only class attribute to None now raises + AttributeError instead of undefined behaviour. +- Drop fix-license-in-setup_py.patch: upstream's own setup.py and + PKG-INFO now natively declare BSD-2-Clause (previously "SIP"). +- Rebase support-python3.6.patch onto upstream's new Python 3.10 + floor (previously 3.9); still overrides down to 3.6 for Leap. +- Raise python-setuptools BuildRequires floor to >= 75.8.1, + matching upstream's pyproject.toml build-system requirement + (previously an unrelated stale >= 30.3). + +------------------------------------------------------------------- Old: ---- fix-license-in-setup_py.patch pyqt5_sip-12.16.1.tar.gz New: ---- pyqt5_sip-12.19.0.tar.gz ----------(Old B)---------- Old: AttributeError instead of undefined behaviour. - Drop fix-license-in-setup_py.patch: upstream's own setup.py and PKG-INFO now natively declare BSD-2-Clause (previously "SIP"). ----------(Old E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-qt5-sip.spec ++++++ --- /var/tmp/diff_new_pack.jwXDOB/_old 2026-10-01 17:00:17.022283909 +0200 +++ /var/tmp/diff_new_pack.jwXDOB/_new 2026-10-01 17:00:17.024283992 +0200 @@ -18,24 +18,21 @@ %{?sle15_python_module_pythons} Name: python-qt5-sip -Version: 12.16.1 +Version: 12.19.0 Release: 0 -License: BSD-2-Clause Summary: The sip module support for PyQt5 +License: BSD-2-Clause URL: https://github.com/Python-SIP/sip -Group: Development/Languages/Python -Source0: https://files.pythonhosted.org/packages/source/P/PyQt5-sip/pyqt5_sip-%{version}.tar.gz -Patch0: fix-license-in-setup_py.patch +Source0: https://files.pythonhosted.org/packages/source/p/pyqt5_sip/pyqt5_sip-%{version}.tar.gz # PATCH-FIX-OPENSUSE Set minimum python version to 3.6 to support Leap distribution Patch100: support-python3.6.patch BuildRequires: %{python_module devel >= 3.6} -BuildRequires: %{python_module setuptools >= 30.3} BuildRequires: %{python_module pip} +BuildRequires: %{python_module setuptools >= 75.8.1} BuildRequires: %{python_module wheel} BuildRequires: fdupes BuildRequires: python-rpm-macros Provides: python-PyQt5-sip = %{version}-%{release} - %python_subpackages %description ++++++ pyqt5_sip-12.16.1.tar.gz -> pyqt5_sip-12.19.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyqt5_sip-12.16.1/LICENSE new/pyqt5_sip-12.19.0/LICENSE --- old/pyqt5_sip-12.16.1/LICENSE 2024-12-12 11:01:35.000000000 +0100 +++ new/pyqt5_sip-12.19.0/LICENSE 2026-08-02 13:20:00.000000000 +0200 @@ -1,4 +1,4 @@ -Copyright 2024 Phil Thompson <[email protected]> +Copyright (c) 2025 Phil Thompson <[email protected]> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyqt5_sip-12.16.1/PKG-INFO new/pyqt5_sip-12.19.0/PKG-INFO --- old/pyqt5_sip-12.16.1/PKG-INFO 2024-12-12 11:01:36.048525000 +0100 +++ new/pyqt5_sip-12.19.0/PKG-INFO 2026-08-02 13:20:00.472665800 +0200 @@ -1,16 +1,19 @@ -Metadata-Version: 2.1 +Metadata-Version: 2.4 Name: PyQt5_sip -Version: 12.16.1 +Version: 12.19.0 Summary: The sip module support for PyQt5 Home-page: https://github.com/Python-SIP/sip Author: Phil Thompson Author-email: [email protected] -License: SIP +License: BSD-2-Clause Platform: X11 Platform: macOS Platform: Windows -Requires-Python: >=3.9 +Requires-Python: >=3.10 License-File: LICENSE +Dynamic: license +Dynamic: license-file +Dynamic: requires-python sip Extension Module ==================== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyqt5_sip-12.16.1/PyQt5_sip.egg-info/PKG-INFO new/pyqt5_sip-12.19.0/PyQt5_sip.egg-info/PKG-INFO --- old/pyqt5_sip-12.16.1/PyQt5_sip.egg-info/PKG-INFO 2024-12-12 11:01:35.000000000 +0100 +++ new/pyqt5_sip-12.19.0/PyQt5_sip.egg-info/PKG-INFO 2026-08-02 13:20:00.000000000 +0200 @@ -1,16 +1,19 @@ -Metadata-Version: 2.1 +Metadata-Version: 2.4 Name: PyQt5_sip -Version: 12.16.1 +Version: 12.19.0 Summary: The sip module support for PyQt5 Home-page: https://github.com/Python-SIP/sip Author: Phil Thompson Author-email: [email protected] -License: SIP +License: BSD-2-Clause Platform: X11 Platform: macOS Platform: Windows -Requires-Python: >=3.9 +Requires-Python: >=3.10 License-File: LICENSE +Dynamic: license +Dynamic: license-file +Dynamic: requires-python sip Extension Module ==================== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyqt5_sip-12.16.1/apiversions.c new/pyqt5_sip-12.19.0/apiversions.c --- old/pyqt5_sip-12.16.1/apiversions.c 2024-12-12 11:01:35.000000000 +0100 +++ new/pyqt5_sip-12.19.0/apiversions.c 2026-08-02 13:20:00.000000000 +0200 @@ -3,7 +3,7 @@ /* * The implementation of the supprt for setting API versions. * - * Copyright (c) 2024 Phil Thompson <[email protected]> + * Copyright (c) 2025 Phil Thompson <[email protected]> */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyqt5_sip-12.16.1/descriptors.c new/pyqt5_sip-12.19.0/descriptors.c --- old/pyqt5_sip-12.16.1/descriptors.c 2024-12-12 11:01:35.000000000 +0100 +++ new/pyqt5_sip-12.19.0/descriptors.c 2026-08-02 13:20:00.000000000 +0200 @@ -3,7 +3,7 @@ /* * The implementation of the different descriptors. * - * Copyright (c) 2024 Phil Thompson <[email protected]> + * Copyright (c) 2025 Phil Thompson <[email protected]> */ @@ -371,6 +371,16 @@ sipVariableDescr *vd = (sipVariableDescr *)self; void *addr; + /* Check that the value isn't being deleted. */ + if (value == NULL) + { + PyErr_Format(PyExc_AttributeError, + "'%s' object attribute '%s' cannot be deleted", + sipPyNameOfContainer(vd->cod, vd->td), vd->vd->vd_name); + + return -1; + } + /* Check that the value isn't const. */ if (vd->vd->vd_setter == NULL) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyqt5_sip-12.16.1/int_convertors.c new/pyqt5_sip-12.19.0/int_convertors.c --- old/pyqt5_sip-12.16.1/int_convertors.c 2024-12-12 11:01:35.000000000 +0100 +++ new/pyqt5_sip-12.19.0/int_convertors.c 2026-08-02 13:20:00.000000000 +0200 @@ -3,7 +3,7 @@ /* * The implementation of the Python object to C/C++ integer convertors. * - * Copyright (c) 2024 Phil Thompson <[email protected]> + * Copyright (c) 2025 Phil Thompson <[email protected]> */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyqt5_sip-12.16.1/objmap.c new/pyqt5_sip-12.19.0/objmap.c --- old/pyqt5_sip-12.16.1/objmap.c 2024-12-12 11:01:35.000000000 +0100 +++ new/pyqt5_sip-12.19.0/objmap.c 2026-08-02 13:20:00.000000000 +0200 @@ -4,7 +4,7 @@ * This module implements a hash table class for mapping C/C++ addresses to the * corresponding wrapped Python object. * - * Copyright (c) 2024 Phil Thompson <[email protected]> + * Copyright (c) 2025 Phil Thompson <[email protected]> */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyqt5_sip-12.16.1/pyproject.toml new/pyqt5_sip-12.19.0/pyproject.toml --- old/pyqt5_sip-12.16.1/pyproject.toml 2024-12-12 11:01:35.000000000 +0100 +++ new/pyqt5_sip-12.19.0/pyproject.toml 2026-08-02 13:20:00.000000000 +0200 @@ -1,2 +1,2 @@ [build-system] -requires = ["setuptools >=69.5"] +requires = ["setuptools >=75.8.1"] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyqt5_sip-12.16.1/qtlib.c new/pyqt5_sip-12.19.0/qtlib.c --- old/pyqt5_sip-12.16.1/qtlib.c 2024-12-12 11:01:35.000000000 +0100 +++ new/pyqt5_sip-12.19.0/qtlib.c 2026-08-02 13:20:00.000000000 +0200 @@ -4,7 +4,7 @@ * The SIP library code that implements the interface to the optional module * supplied Qt support. * - * Copyright (c) 2024 Phil Thompson <[email protected]> + * Copyright (c) 2025 Phil Thompson <[email protected]> */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyqt5_sip-12.16.1/setup.py new/pyqt5_sip-12.19.0/setup.py --- old/pyqt5_sip-12.16.1/setup.py 2024-12-12 11:01:35.000000000 +0100 +++ new/pyqt5_sip-12.19.0/setup.py 2026-08-02 13:20:00.000000000 +0200 @@ -1,6 +1,6 @@ # SPDX-License-Identifier: BSD-2-Clause -# Copyright (c) 2024 Phil Thompson <[email protected]> +# Copyright (c) 2025 Phil Thompson <[email protected]> import glob @@ -16,8 +16,8 @@ # Do the setup. setup( name='PyQt5_sip', - version='12.16.1', - license='SIP', - python_requires='>=3.9', + version='12.19.0', + license='BSD-2-Clause', + python_requires='>=3.10', ext_modules=[module] ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyqt5_sip-12.16.1/sip.h new/pyqt5_sip-12.19.0/sip.h --- old/pyqt5_sip-12.16.1/sip.h 2024-12-12 11:01:35.000000000 +0100 +++ new/pyqt5_sip-12.19.0/sip.h 2026-08-02 13:20:00.000000000 +0200 @@ -3,7 +3,7 @@ /* * The SIP module interface. * - * Copyright (c) 2024 Phil Thompson <[email protected]> + * Copyright (c) 2026 Phil Thompson <[email protected]> */ @@ -14,11 +14,14 @@ #include <Python.h> /* Sanity check on the Python version. */ -#if PY_VERSION_HEX < 0x03090000 -#error "This version of PyQt5.sip requires Python v3.9 or later" +#if PY_VERSION_HEX < 0x030a0000 +#error "This version of PyQt5.sip requires Python v3.10 or later" #endif +#include <stdbool.h> + + #ifdef __cplusplus #include <exception> @@ -35,13 +38,29 @@ /* The version of the ABI. */ #define SIP_ABI_MAJOR_VERSION 12 -#define SIP_ABI_MINOR_VERSION 16 -#define SIP_MODULE_PATCH_VERSION 1 +#define SIP_ABI_MINOR_VERSION 19 +#define SIP_MODULE_PATCH_VERSION 0 /* * The change history of the ABI. * + * v12.19 + * - Added support for Python v3.15. + * - The format use to pickle wrapped types has changed so that it is more + * robust and faster. The legacy format can still be read and will be + * converted to the new format when written. Older versions of the sip + * module can already read the new format. + * - Added definitions of sipTypeID and sipType_Invalid to aid porting to ABI + * v14. + * + * v12.18 + * - Added support for Python v3.14. + * - Python v3.10 or later is required. + * + * v12.17 + * - Added SIP_ABI_VERSION as a module attribute. + * * v12.16 * - Python v3.9 or later is required. * - Added a new implementation of sipDeprecated() that takes an optional @@ -81,8 +100,8 @@ /* The version of the code generator. */ -#define SIP_VERSION 0x60901 -#define SIP_VERSION_STR "6.9.1" +#define SIP_VERSION 0x61000 +#define SIP_VERSION_STR "6.16.0" /* These are all dependent on the user-specified name of the sip module. */ #define _SIP_MODULE_FQ_NAME "PyQt5.sip" @@ -170,20 +189,11 @@ #define SIP_TRACE_METHODS 0x0020 -/* - * Hide some thread dependent stuff. - */ -#ifdef WITH_THREAD +/* Hide some thread related stuff. */ typedef PyGILState_STATE sip_gilstate_t; #define SIP_RELEASE_GIL(gs) PyGILState_Release(gs); #define SIP_BLOCK_THREADS {PyGILState_STATE sipGIL = PyGILState_Ensure(); #define SIP_UNBLOCK_THREADS PyGILState_Release(sipGIL);} -#else -typedef int sip_gilstate_t; -#define SIP_RELEASE_GIL(gs) -#define SIP_BLOCK_THREADS -#define SIP_UNBLOCK_THREADS -#endif /* @@ -224,6 +234,13 @@ /* + * The following make it easier to write code that supports ABI v14. + */ +#define sipType_Invalid NULL +typedef const sipTypeDef *sipTypeID; + + +/* * The different events a handler can be registered for. */ typedef enum diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyqt5_sip-12.16.1/sip_array.c new/pyqt5_sip-12.19.0/sip_array.c --- old/pyqt5_sip-12.16.1/sip_array.c 2024-12-12 11:01:35.000000000 +0100 +++ new/pyqt5_sip-12.19.0/sip_array.c 2026-08-02 13:20:00.000000000 +0200 @@ -3,7 +3,7 @@ /* * This file implements the API for the array type. * - * Copyright (c) 2024 Phil Thompson <[email protected]> + * Copyright (c) 2025 Phil Thompson <[email protected]> */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyqt5_sip-12.16.1/sip_array.h new/pyqt5_sip-12.19.0/sip_array.h --- old/pyqt5_sip-12.16.1/sip_array.h 2024-12-12 11:01:35.000000000 +0100 +++ new/pyqt5_sip-12.19.0/sip_array.h 2026-08-02 13:20:00.000000000 +0200 @@ -3,7 +3,7 @@ /* * This file defines the API for the array type. * - * Copyright (c) 2024 Phil Thompson <[email protected]> + * Copyright (c) 2025 Phil Thompson <[email protected]> */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyqt5_sip-12.16.1/sipint.h new/pyqt5_sip-12.19.0/sipint.h --- old/pyqt5_sip-12.16.1/sipint.h 2024-12-12 11:01:35.000000000 +0100 +++ new/pyqt5_sip-12.19.0/sipint.h 2026-08-02 13:20:00.000000000 +0200 @@ -3,7 +3,7 @@ /* * This file defines the SIP library internal interfaces. * - * Copyright (c) 2024 Phil Thompson <[email protected]> + * Copyright (c) 2025 Phil Thompson <[email protected]> */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyqt5_sip-12.16.1/siplib.c new/pyqt5_sip-12.19.0/siplib.c --- old/pyqt5_sip-12.16.1/siplib.c 2024-12-12 11:01:35.000000000 +0100 +++ new/pyqt5_sip-12.19.0/siplib.c 2026-08-02 13:20:00.000000000 +0200 @@ -3,7 +3,7 @@ /* * SIP library code. * - * Copyright (c) 2024 Phil Thompson <[email protected]> + * Copyright (c) 2025 Phil Thompson <[email protected]> */ @@ -798,8 +798,6 @@ static PyObject *init_name = NULL; /* '__init__'. */ static PyObject *empty_tuple; /* The empty tuple. */ -static PyObject *type_unpickler; /* The type unpickler function. */ -static PyObject *enum_unpickler; /* The enum unpickler function. */ static sipSymbol *sipSymbolList = NULL; /* The list of published symbols. */ static sipAttrGetter *sipAttrGetters = NULL; /* The list of attribute getters. */ static sipProxyResolver *proxyResolvers = NULL; /* The list of proxy resolvers. */ @@ -859,7 +857,6 @@ static sipExportedModuleDef *getModule(PyObject *mname_obj); static PyObject *pickle_type(PyObject *obj, PyObject *args); static PyObject *unpickle_type(PyObject *obj, PyObject *args); -static PyObject *pickle_enum(PyObject *obj, PyObject *args); static PyObject *unpickle_enum(PyObject *obj, PyObject *args); static int setReduce(PyTypeObject *type, PyMethodDef *pickler); static int createEnum(sipExportedModuleDef *client, sipEnumTypeDef *etd, @@ -995,9 +992,7 @@ const sipAPIDef *sip_init_library(PyObject *mod_dict) { static PyMethodDef methods[] = { - /* This must be first. */ {"_unpickle_enum", unpickle_enum, METH_VARARGS, NULL}, - /* This must be second. */ {"_unpickle_type", unpickle_type, METH_VARARGS, NULL}, {"assign", assign, METH_VARARGS, NULL}, {"cast", cast, METH_VARARGS, NULL}, @@ -1038,6 +1033,14 @@ if (dict_set_and_discard(mod_dict, "SIP_VERSION_STR", obj) < 0) return NULL; + /* Add the SIP ABI version number. */ + obj = PyLong_FromLong((SIP_ABI_MAJOR_VERSION << 16) + + (SIP_ABI_MINOR_VERSION << 8) + + SIP_MODULE_PATCH_VERSION); + + if (dict_set_and_discard(mod_dict, "SIP_ABI_VERSION", obj) < 0) + return NULL; + /* Add the methods. */ for (md = methods; md->ml_name != NULL; ++md) { @@ -1045,17 +1048,6 @@ if (dict_set_and_discard(mod_dict, md->ml_name, meth) < 0) return NULL; - - if (md == &methods[0]) - { - Py_INCREF(meth); - enum_unpickler = meth; - } - else if (md == &methods[1]) - { - Py_INCREF(meth); - type_unpickler = meth; - } } /* Initialise the types. */ @@ -1823,20 +1815,6 @@ if (td->td_version < 0 || sipIsRangeEnabled(client, td->td_version)) if (createEnum(client, etd, i, mod_dict) < 0) return -1; - - /* - * Register the enum pickler for nested enums (non-nested enums - * don't need special treatment). - */ - if (sipTypeIsEnum(td) && etd->etd_scope >= 0) - { - static PyMethodDef md = { - "_pickle_enum", pickle_enum, METH_NOARGS, NULL - }; - - if (setReduce(sipTypeAsPyTypeObject(td), &md) < 0) - return -1; - } } else if (sipTypeIsMapped(td)) { @@ -5992,6 +5970,7 @@ { release(el, td, 0); Py_DECREF(seq); + return NULL; } PyTuple_SET_ITEM(seq, i, el_obj); @@ -6575,7 +6554,7 @@ /* - * The type unpickler. + * The legacy type unpickler. */ static PyObject *unpickle_type(PyObject *obj, PyObject *args) { @@ -6657,8 +6636,7 @@ return NULL; } - return Py_BuildValue("O(OsN)", type_unpickler, - em->em_nameobj, pyname, init_args); + return Py_BuildValue("ON", Py_TYPE(obj), init_args); } } } @@ -6672,7 +6650,7 @@ /* - * The enum unpickler. + * The legacy enum unpickler. */ static PyObject *unpickle_enum(PyObject *obj, PyObject *args) { @@ -6707,20 +6685,6 @@ /* - * The enum pickler. - */ -static PyObject *pickle_enum(PyObject *obj, PyObject *args) -{ - sipTypeDef *td = ((sipEnumTypeObject *)Py_TYPE(obj))->type; - - (void)args; - - return Py_BuildValue("O(Osi)", enum_unpickler, td->td_module->em_nameobj, - sipPyNameOfEnum((sipEnumTypeDef *)td), (int)PyLong_AS_LONG(obj)); -} - - -/* * Set the __reduce__method for a type. */ static int setReduce(PyTypeObject *type, PyMethodDef *pickler) @@ -7792,21 +7756,25 @@ int sip_api_deprecated_12_16(const char *classname, const char *method, const char *message) { - char buf[100]; + const unsigned int bufsize = 100 + ( message ? strlen(message) : 0 ); + char *buf = (char*)sip_api_malloc(bufsize * sizeof(char)); + unsigned int written = 0; if (classname == NULL) - PyOS_snprintf(buf, sizeof (buf), "%s() is deprecated", method); + written = PyOS_snprintf(buf, bufsize, "%s() is deprecated", method); else if (method == NULL) - PyOS_snprintf(buf, sizeof (buf), "%s constructor is deprecated", - classname); + written = PyOS_snprintf(buf, bufsize, "%s constructor is deprecated", + classname); else - PyOS_snprintf(buf, sizeof (buf), "%s.%s() is deprecated", classname, - method); + written = PyOS_snprintf(buf, bufsize, "%s.%s() is deprecated", classname, + method ); if (message != NULL) - PyOS_snprintf(&buf[strlen(buf)], sizeof (buf), ": %s", message); + PyOS_snprintf(buf+written, bufsize-written, ": %s", message); - return PyErr_WarnEx(PyExc_DeprecationWarning, buf, 1); + const int res = PyErr_WarnEx(PyExc_DeprecationWarning, buf, 1); + sip_api_free(buf); + return res; } @@ -8205,43 +8173,51 @@ { PyObject *w; - switch (si->si_encoding) + if (si->si_val == NULL) { - case 'A': - w = PyUnicode_DecodeASCII(si->si_val, strlen(si->si_val), NULL); - break; + w = Py_None; + Py_INCREF(w); + } + else + { + switch (si->si_encoding) + { + case 'A': + w = PyUnicode_DecodeASCII(si->si_val, strlen(si->si_val), NULL); + break; - case 'L': - w = PyUnicode_DecodeLatin1(si->si_val, strlen(si->si_val), NULL); - break; + case 'L': + w = PyUnicode_DecodeLatin1(si->si_val, strlen(si->si_val), NULL); + break; - case '8': - w = PyUnicode_FromString(si->si_val); - break; + case '8': + w = PyUnicode_FromString(si->si_val); + break; - case 'w': - /* The hack for wchar_t. */ + case 'w': + /* The hack for wchar_t. */ #if defined(HAVE_WCHAR_H) - w = PyUnicode_FromWideChar((const wchar_t *)si->si_val, 1); - break; + w = PyUnicode_FromWideChar((const wchar_t *)si->si_val, 1); + break; #else - raiseNoWChar(); - return -1; + raiseNoWChar(); + return -1; #endif - case 'W': - /* The hack for wchar_t*. */ + case 'W': + /* The hack for wchar_t*. */ #if defined(HAVE_WCHAR_H) - w = PyUnicode_FromWideChar((const wchar_t *)si->si_val, - wcslen((const wchar_t *)si->si_val)); - break; + w = PyUnicode_FromWideChar((const wchar_t *)si->si_val, + wcslen((const wchar_t *)si->si_val)); + break; #else - raiseNoWChar(); - return -1; + raiseNoWChar(); + return -1; #endif - default: - w = PyBytes_FromString(si->si_val); + default: + w = PyBytes_FromString(si->si_val); + } } if (dict_set_and_discard(dict, si->si_name, w) < 0) @@ -8484,9 +8460,7 @@ if (sipInterpreter == NULL) return NULL; -#ifdef WITH_THREAD *gil = PyGILState_Ensure(); -#endif /* Only read this when we have the GIL. */ sipSelf = *sipSelfp; @@ -8618,17 +8592,13 @@ PyErr_Print(); } -#ifdef WITH_THREAD PyGILState_Release(*gil); -#endif } return reimp; release_gil: -#ifdef WITH_THREAD PyGILState_Release(*gil); -#endif return NULL; } @@ -9817,7 +9787,7 @@ ((sipWrapperType *)o)->wt_td = currentType; - if (sipTypeIsClass(currentType)) + if (sipTypeIsClass(currentType) || sipTypeIsNamespace(currentType)) { const sipClassTypeDef *ctd = (const sipClassTypeDef *)currentType; const char *docstring = ctd->ctd_docstring; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyqt5_sip-12.16.1/threads.c new/pyqt5_sip-12.19.0/threads.c --- old/pyqt5_sip-12.16.1/threads.c 2024-12-12 11:01:35.000000000 +0100 +++ new/pyqt5_sip-12.19.0/threads.c 2026-08-02 13:20:00.000000000 +0200 @@ -5,7 +5,7 @@ * C++ classes that provide a thread interface to interact properly with the * Python threading infrastructure. * - * Copyright (c) 2024 Phil Thompson <[email protected]> + * Copyright (c) 2025 Phil Thompson <[email protected]> */ @@ -22,14 +22,11 @@ } pendingDef; -#ifdef WITH_THREAD - -#include <pythread.h> - - /* * The per thread data we need to maintain. */ +#include <pythread.h> + typedef struct _threadDef { long thr_ident; /* The thread identifier. */ pendingDef pending; /* An object waiting to be wrapped. */ @@ -40,9 +37,6 @@ static threadDef *currentThreadDef(int auto_alloc); -#endif - - static pendingDef *get_pending(int auto_alloc); @@ -124,7 +118,6 @@ */ void sip_api_end_thread(void) { -#ifdef WITH_THREAD threadDef *thread; PyGILState_STATE gil = PyGILState_Ensure(); @@ -132,7 +125,6 @@ thread->thr_ident = 0; PyGILState_Release(gil); -#endif } @@ -142,23 +134,15 @@ */ static pendingDef *get_pending(int auto_alloc) { -#ifdef WITH_THREAD threadDef *thread; if ((thread = currentThreadDef(auto_alloc)) == NULL) return NULL; return &thread->pending; -#else - static pendingDef pending; - - return &pending; -#endif } -#ifdef WITH_THREAD - /* * Return the thread data for the current thread, allocating it if necessary, * or NULL if there was an error. @@ -204,5 +188,3 @@ return thread; } - -#endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyqt5_sip-12.16.1/voidptr.c new/pyqt5_sip-12.19.0/voidptr.c --- old/pyqt5_sip-12.16.1/voidptr.c 2024-12-12 11:01:35.000000000 +0100 +++ new/pyqt5_sip-12.19.0/voidptr.c 2026-08-02 13:20:00.000000000 +0200 @@ -3,7 +3,7 @@ /* * This file implements the API for the voidptr type. * - * Copyright (c) 2024 Phil Thompson <[email protected]> + * Copyright (c) 2025 Phil Thompson <[email protected]> */ ++++++ support-python3.6.patch ++++++ --- /var/tmp/diff_new_pack.jwXDOB/_old 2026-10-01 17:00:17.247293334 +0200 +++ /var/tmp/diff_new_pack.jwXDOB/_new 2026-10-01 17:00:17.256293711 +0200 @@ -1,56 +1,56 @@ -diff -ur pyqt5_sip-12.16.1/PKG-INFO pyqt5_sip-12.16.1_fix/PKG-INFO ---- pyqt5_sip-12.16.1/PKG-INFO 2024-12-12 11:01:36.048525000 +0100 -+++ pyqt5_sip-12.16.1_fix/PKG-INFO 2025-01-21 12:59:58.918060996 +0100 +diff -ur pyqt5_sip-12.19.0/PKG-INFO pyqt5_sip-12.19.0_fix/PKG-INFO +--- pyqt5_sip-12.19.0/PKG-INFO 2026-08-02 13:20:00.472665800 +0200 ++++ pyqt5_sip-12.19.0_fix/PKG-INFO 2026-09-26 17:48:51.297267271 +0200 @@ -9,7 +9,7 @@ Platform: X11 Platform: macOS Platform: Windows --Requires-Python: >=3.9 +-Requires-Python: >=3.10 +Requires-Python: >=3.6 License-File: LICENSE - - sip Extension Module -diff -ur pyqt5_sip-12.16.1/PyQt5_sip.egg-info/PKG-INFO pyqt5_sip-12.16.1_fix/PyQt5_sip.egg-info/PKG-INFO ---- pyqt5_sip-12.16.1/PyQt5_sip.egg-info/PKG-INFO 2024-12-12 11:01:35.000000000 +0100 -+++ pyqt5_sip-12.16.1_fix/PyQt5_sip.egg-info/PKG-INFO 2025-01-21 13:00:02.294780054 +0100 + Dynamic: license + Dynamic: license-file +diff -ur pyqt5_sip-12.19.0/PyQt5_sip.egg-info/PKG-INFO pyqt5_sip-12.19.0_fix/PyQt5_sip.egg-info/PKG-INFO +--- pyqt5_sip-12.19.0/PyQt5_sip.egg-info/PKG-INFO 2026-08-02 13:20:00.000000000 +0200 ++++ pyqt5_sip-12.19.0_fix/PyQt5_sip.egg-info/PKG-INFO 2026-09-26 17:48:51.297319972 +0200 @@ -9,7 +9,7 @@ Platform: X11 Platform: macOS Platform: Windows --Requires-Python: >=3.9 +-Requires-Python: >=3.10 +Requires-Python: >=3.6 License-File: LICENSE - - sip Extension Module -diff -ur pyqt5_sip-12.16.1/setup.py pyqt5_sip-12.16.1_fix/setup.py ---- pyqt5_sip-12.16.1/setup.py 2024-12-12 11:01:35.000000000 +0100 -+++ pyqt5_sip-12.16.1_fix/setup.py 2025-01-21 13:01:46.169725120 +0100 + Dynamic: license + Dynamic: license-file +diff -ur pyqt5_sip-12.19.0/setup.py pyqt5_sip-12.19.0_fix/setup.py +--- pyqt5_sip-12.19.0/setup.py 2026-08-02 13:20:00.000000000 +0200 ++++ pyqt5_sip-12.19.0_fix/setup.py 2026-09-26 17:48:51.297488860 +0200 @@ -18,6 +18,6 @@ name='PyQt5_sip', - version='12.16.1', + version='12.19.0', license='BSD-2-Clause', -- python_requires='>=3.9', +- python_requires='>=3.10', + python_requires='>=3.6', ext_modules=[module] ) -diff -ur pyqt5_sip-12.16.1/sip.h pyqt5_sip-12.16.1_fix/sip.h ---- pyqt5_sip-12.16.1/sip.h 2024-12-12 11:01:35.000000000 +0100 -+++ pyqt5_sip-12.16.1_fix/sip.h 2025-01-21 13:01:46.169725120 +0100 +diff -ur pyqt5_sip-12.19.0/sip.h pyqt5_sip-12.19.0_fix/sip.h +--- pyqt5_sip-12.19.0/sip.h 2026-08-02 13:20:00.000000000 +0200 ++++ pyqt5_sip-12.19.0_fix/sip.h 2026-09-26 17:48:51.300637452 +0200 @@ -14,8 +14,8 @@ #include <Python.h> /* Sanity check on the Python version. */ --#if PY_VERSION_HEX < 0x03090000 --#error "This version of PyQt5.sip requires Python v3.9 or later" +-#if PY_VERSION_HEX < 0x030a0000 +-#error "This version of PyQt5.sip requires Python v3.10 or later" +#if PY_VERSION_HEX < 0x03060000 +#error "This version of PyQt5.sip requires Python v3.6 or later" #endif -diff -ur pyqt5_sip-12.16.1/siplib.c pyqt5_sip-12.16.1_fix/siplib.c ---- pyqt5_sip-12.16.1/siplib.c 2024-12-12 11:01:35.000000000 +0100 -+++ pyqt5_sip-12.16.1_fix/siplib.c 2025-01-21 13:01:46.173058506 +0100 -@@ -1027,6 +1027,10 @@ +diff -ur pyqt5_sip-12.19.0/siplib.c pyqt5_sip-12.19.0_fix/siplib.c +--- pyqt5_sip-12.19.0/siplib.c 2026-08-02 13:20:00.000000000 +0200 ++++ pyqt5_sip-12.19.0_fix/siplib.c 2026-09-26 17:49:17.398305059 +0200 +@@ -1022,6 +1022,10 @@ PyObject *obj; PyMethodDef *md; @@ -61,7 +61,7 @@ /* Add the SIP version number. */ obj = PyLong_FromLong(SIP_VERSION); -@@ -13335,12 +13339,16 @@ +@@ -13305,12 +13309,16 @@ Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step, Py_ssize_t *slicelength) {
