Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-PyQt6-sip for openSUSE:Factory checked in at 2026-10-18 19:22:17 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-PyQt6-sip (Old) and /work/SRC/openSUSE:Factory/.python-PyQt6-sip.new.3698736 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-PyQt6-sip" Sun Oct 18 19:22:17 2026 rev:20 rq:1385949 version:13.13.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-PyQt6-sip/python-PyQt6-sip.changes 2026-08-31 15:56:29.260530760 +0200 +++ /work/SRC/openSUSE:Factory/.python-PyQt6-sip.new.3698736/python-PyQt6-sip.changes 2026-10-18 19:22:28.018628411 +0200 @@ -1,0 +2,11 @@ +Sun Oct 18 09:02:11 UTC 2026 - Ben Greiner <[email protected]> + +- Update to ABI 13.13 + * A new plugin API has been added. This allows bindings authors + to extend SIP, for example by adding new directives and + annotations. + * As a consequence all hard-coded support for PyQt has been + removed. + * see also python-sip6 package + +------------------------------------------------------------------- Old: ---- pyqt6_sip-13.12.0.tar.gz New: ---- pyqt6_sip-13.13.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-PyQt6-sip.spec ++++++ --- /var/tmp/diff_new_pack.E9jQPa/_old 2026-10-18 19:22:28.810661247 +0200 +++ /var/tmp/diff_new_pack.E9jQPa/_new 2026-10-18 19:22:28.812661330 +0200 @@ -19,7 +19,7 @@ %{?sle15_python_module_pythons} # Check PyPI for version: https://pypi.org/project/PyQt6-sip/ Name: python-PyQt6-sip -Version: 13.12.0 +Version: 13.13.0 Release: 0 Summary: The sip module support for PyQt6 License: BSD-2-Clause ++++++ pyqt6_sip-13.12.0.tar.gz -> pyqt6_sip-13.13.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyqt6_sip-13.12.0/PKG-INFO new/pyqt6_sip-13.13.0/PKG-INFO --- old/pyqt6_sip-13.12.0/PKG-INFO 2026-08-02 13:19:27.509712700 +0200 +++ new/pyqt6_sip-13.13.0/PKG-INFO 2026-10-04 14:02:03.335994700 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.4 Name: PyQt6_sip -Version: 13.12.0 +Version: 13.13.0 Summary: The sip module support for PyQt6 Home-page: https://github.com/Python-SIP/sip Author: Phil Thompson diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyqt6_sip-13.12.0/PyQt6_sip.egg-info/PKG-INFO new/pyqt6_sip-13.13.0/PyQt6_sip.egg-info/PKG-INFO --- old/pyqt6_sip-13.12.0/PyQt6_sip.egg-info/PKG-INFO 2026-08-02 13:19:27.000000000 +0200 +++ new/pyqt6_sip-13.13.0/PyQt6_sip.egg-info/PKG-INFO 2026-10-04 14:02:03.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.4 Name: PyQt6_sip -Version: 13.12.0 +Version: 13.13.0 Summary: The sip module support for PyQt6 Home-page: https://github.com/Python-SIP/sip Author: Phil Thompson diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyqt6_sip-13.12.0/setup.py new/pyqt6_sip-13.13.0/setup.py --- old/pyqt6_sip-13.12.0/setup.py 2026-08-02 13:19:27.000000000 +0200 +++ new/pyqt6_sip-13.13.0/setup.py 2026-10-04 14:02:03.000000000 +0200 @@ -16,7 +16,7 @@ # Do the setup. setup( name='PyQt6_sip', - version='13.12.0', + version='13.13.0', license='BSD-2-Clause', python_requires='>=3.10', ext_modules=[module] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyqt6_sip-13.12.0/sip.h new/pyqt6_sip-13.13.0/sip.h --- old/pyqt6_sip-13.12.0/sip.h 2026-08-02 13:19:27.000000000 +0200 +++ new/pyqt6_sip-13.13.0/sip.h 2026-10-04 14:02:03.000000000 +0200 @@ -3,7 +3,7 @@ /* * The SIP module interface. * - * Copyright (c) 2025 Phil Thompson <[email protected]> + * Copyright (c) 2026 Phil Thompson <[email protected]> */ @@ -38,13 +38,24 @@ /* The version of the ABI. */ #define SIP_ABI_MAJOR_VERSION 13 -#define SIP_ABI_MINOR_VERSION 12 +#define SIP_ABI_MINOR_VERSION 13 #define SIP_MODULE_PATCH_VERSION 0 /* * The change history of the ABI. * + * v13.13 + * - Added sipGetAssignmentFunction(). + * - Added sipGetPyTypeRef() and deprecated sipTypeAsPyTypeObject(). + * - Added sipObjectGuard, sipObjectGuard_New(), + * sipObjectGuard_GetModuleState(), sipObjectGuard_GetRef() and + * sipObjectGuard_Release(). + * - Exposed sipParseResultEx() as sipParseResultObject(). + * - Added definitions of sipGetModuleState(), sipGetModuleStateByType(), + * sipGetVoidPtrType(), sipMakeAbsolute() and sipModuleState to aid porting + * to ABI v14. + * * v13.12 * - Added support for Python v3.15. * - The format use to pickle wrapped types has changed so that it is more @@ -101,8 +112,8 @@ /* The version of the code generator. */ -#define SIP_VERSION 0x61000 -#define SIP_VERSION_STR "6.16.0" +#define SIP_VERSION 0x61100 +#define SIP_VERSION_STR "6.17.0" /* These are all dependent on the user-specified name of the sip module. */ #define _SIP_MODULE_FQ_NAME "PyQt6.sip" @@ -174,6 +185,10 @@ #define SIP_UNBLOCK_THREADS PyGILState_Release(sipGIL);} +/* The sipObjectGuard implementation is actually the object itself. */ +typedef PyObject sipObjectGuard; + + /* * Forward declarations of types. */ @@ -209,9 +224,16 @@ /* - * The following make it easier to write code that supports ABI v14. + * The following make it easier to write code that supports ABI v14. Note that + * sipVoidPtr_Type is just used as a convenient non-NULL pointer. */ -#define sipType_Invalid NULL +#define sipGetModuleState() ((sipModuleState *)sipVoidPtr_Type) +#define sipGetModuleStateByType(type) ((sipModuleState *)sipVoidPtr_Type) +#define sipGetVoidPtrType() sipVoidPtr_Type +#define sipMakeAbsolute(id) id +#define sipObjectGuard_GetModuleState(g) ((sipModuleState *)sipVoidPtr_Type) +#define sipType_Invalid NULL +struct sipModuleState; typedef const sipTypeDef *sipTypeID; @@ -280,6 +302,9 @@ typedef void *(*sipProxyResolverFunc)(void *); typedef void (*sipWrapperVisitorFunc)(sipSimpleWrapper *, void *); +/* In this ABI an error handler is the function pointer. */ +typedef sipVirtErrorHandlerFunc sipVirtErrorHandler; + #if !defined(Py_LIMITED_API) /* @@ -729,8 +754,8 @@ /* The Python type object. */ PyTypeObject *td_py_type; - /* Any additional fixed data generated by a plugin. */ - void *td_plugin_data; + /* Any additional immutable data generated by a plugin. */ + const void *td_plugin_data; }; @@ -1266,7 +1291,7 @@ PyObject *(*api_build_result)(int *isErr, const char *fmt, ...); PyObject *(*api_call_method)(int *isErr, PyObject *method, const char *fmt, ...); - void (*api_call_procedure_method)(sip_gilstate_t, sipVirtErrorHandlerFunc, + void (*api_call_procedure_method)(sip_gilstate_t, sipVirtErrorHandler, sipSimpleWrapper *, PyObject *, const char *, ...); Py_ssize_t (*api_convert_from_sequence_index)(Py_ssize_t idx, Py_ssize_t len); @@ -1378,8 +1403,8 @@ int (*api_register_exit_notifier)(PyMethodDef *md); int (*api_is_enum_flag)(PyObject *o); PyObject *(*api_py_type_dict_ref)(PyTypeObject *); - void (*unused_public_2)(void); - void (*unused_public_3)(void); + PyTypeObject *(*api_get_py_type_ref)(const sipTypeDef *td); + sipAssignFunc (*api_get_assignment_function)(const sipTypeDef *td); void (*unused_public_4)(void); void (*unused_public_5)(void); @@ -1433,10 +1458,10 @@ PyObject *sipKwdArgs, const char **kwdlist, PyObject **unused, const char *fmt, ...); void (*api_add_exception)(sipErrorState es, PyObject **parseErrp); - int (*api_parse_result_ex)(sip_gilstate_t, sipVirtErrorHandlerFunc, + int (*api_parse_result_ex)(sip_gilstate_t, sipVirtErrorHandler, sipSimpleWrapper *, PyObject *method, PyObject *res, const char *fmt, ...); - void (*api_call_error_handler)(sipVirtErrorHandlerFunc, + void (*api_call_error_handler)(sipVirtErrorHandler, sipSimpleWrapper *, sip_gilstate_t); int (*api_init_mixin)(PyObject *self, PyObject *args, PyObject *kwds, const sipClassTypeDef *ctd); @@ -1450,6 +1475,14 @@ void (*unused_private_3)(void); void (*unused_private_4)(void); void (*unused_private_5)(void); + + /* + * The following are part of the public API. + */ + sipObjectGuard *(*api_object_guard_new)(PyObject *obj); + PyObject *(*api_object_guard_get_ref)(sipObjectGuard *obj_guard, + sip_gilstate_t *gs_p); + void (*api_object_guard_release)(sipObjectGuard *obj_guard); } sipAPIDef; const sipAPIDef *sip_init_library(PyObject *mod_dict); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyqt6_sip-13.12.0/sip_core.c new/pyqt6_sip-13.13.0/sip_core.c --- old/pyqt6_sip-13.12.0/sip_core.c 2026-08-02 13:19:27.000000000 +0200 +++ new/pyqt6_sip-13.13.0/sip_core.c 2026-10-04 14:02:03.000000000 +0200 @@ -3,7 +3,7 @@ /* * The core sip module code. * - * Copyright (c) 2025 Phil Thompson <[email protected]> + * Copyright (c) 2026 Phil Thompson <[email protected]> */ @@ -246,7 +246,7 @@ static PyObject *sip_api_call_method(int *isErr, PyObject *method, const char *fmt, ...); static void sip_api_call_procedure_method(sip_gilstate_t gil_state, - sipVirtErrorHandlerFunc error_handler, sipSimpleWrapper *py_self, + sipVirtErrorHandler error_handler, sipSimpleWrapper *py_self, PyObject *method, const char *fmt, ...); static Py_ssize_t sip_api_convert_from_sequence_index(Py_ssize_t idx, Py_ssize_t len); @@ -271,11 +271,11 @@ static int sip_api_get_state(PyObject *transferObj); static PyObject *sip_api_get_pyobject(void *cppPtr, const sipTypeDef *td); static int sip_api_parse_result_ex(sip_gilstate_t gil_state, - sipVirtErrorHandlerFunc error_handler, sipSimpleWrapper *py_self, + sipVirtErrorHandler error_handler, sipSimpleWrapper *py_self, PyObject *method, PyObject *res, const char *fmt, ...); static int sip_api_parse_result(int *isErr, PyObject *method, PyObject *res, const char *fmt, ...); -static void sip_api_call_error_handler(sipVirtErrorHandlerFunc error_handler, +static void sip_api_call_error_handler(sipVirtErrorHandler error_handler, sipSimpleWrapper *py_self, sip_gilstate_t gil_state); static void sip_api_trace(unsigned mask,const char *fmt,...); static void sip_api_transfer_back(PyObject *self); @@ -388,6 +388,12 @@ void *closure); static int sip_api_register_exit_notifier(PyMethodDef *md); static sipExceptionHandler sip_api_next_exception_handler(void **statep); +static PyTypeObject *sip_api_get_py_type_ref(const sipTypeDef *td); +static sipAssignFunc sip_api_get_assignment_function(const sipTypeDef *td); +static sipObjectGuard *sip_api_object_guard_new(PyObject *obj); +static PyObject *sip_api_object_guard_get_ref(sipObjectGuard *obj_guard, + sip_gilstate_t *gs_p); +static void sip_api_object_guard_release(sipObjectGuard *obj_guard); /* @@ -496,8 +502,8 @@ sip_api_register_exit_notifier, sip_api_is_enum_flag, sip_api_py_type_dict_ref, - NULL, - NULL, + sip_api_get_py_type_ref, + sip_api_get_assignment_function, NULL, NULL, /* @@ -547,6 +553,12 @@ NULL, NULL, NULL, + /* + * The following are part of the public API. + */ + sip_api_object_guard_new, + sip_api_object_guard_get_ref, + sip_api_object_guard_release, }; @@ -1993,7 +2005,7 @@ * value and handle the result.. */ static void sip_api_call_procedure_method(sip_gilstate_t gil_state, - sipVirtErrorHandlerFunc error_handler, sipSimpleWrapper *py_self, + sipVirtErrorHandler error_handler, sipSimpleWrapper *py_self, PyObject *method, const char *fmt, ...) { PyObject *res; @@ -2408,7 +2420,7 @@ * Parse a result object based on a format string. */ static int sip_api_parse_result_ex(sip_gilstate_t gil_state, - sipVirtErrorHandlerFunc error_handler, sipSimpleWrapper *py_self, + sipVirtErrorHandler error_handler, sipSimpleWrapper *py_self, PyObject *method, PyObject *res, const char *fmt, ...) { int rc; @@ -2443,7 +2455,7 @@ * Call a virtual error handler. This is called with the GIL and from the * thread that raised the error. */ -static void sip_api_call_error_handler(sipVirtErrorHandlerFunc error_handler, +static void sip_api_call_error_handler(sipVirtErrorHandler error_handler, sipSimpleWrapper *py_self, sip_gilstate_t sipGILState) { if (error_handler != NULL) @@ -6315,6 +6327,22 @@ /* + * Return the assignment helper function for a type or NULL if it doesn't have + * one. + */ +static sipAssignFunc sip_api_get_assignment_function(const sipTypeDef *td) +{ + if (sipTypeIsClass(td)) + return ((sipClassTypeDef *)td)->ctd_assign; + + if (sipTypeIsMapped(td)) + return ((sipMappedTypeDef *)td)->mtd_assign; + + return NULL; +} + + +/* * Return the generated type structure corresponding to the given Python type * object. */ @@ -6328,6 +6356,20 @@ /* + * Return a new reference to the Python type object for a generated type or + * NULL if there was an error. + */ +static PyTypeObject *sip_api_get_py_type_ref(const sipTypeDef *td) +{ + PyTypeObject *py_type = td->td_py_type; + + Py_INCREF(py_type); + + return py_type; +} + + +/* * Return the generated type structure corresponding to the scope of the given * type. */ @@ -6848,7 +6890,12 @@ if (owner == NULL) { - /* There is no owner. */ + /* + * There is no owner. This code implements + * 'sip.transferto(obj, None)' but it's likely that the correct + * implementation is that in the following block. We choose to + * leave this as it is to avoid breaking user code. + */ if (sipCppHasRef(sw)) { @@ -6868,9 +6915,8 @@ /* * The owner is a C++ instance and not a Python object (ie. there * is no parent) so there is an explicit extra reference to keep - * this Python object alive. Note that there is no way to - * specify this from a .sip file - it is useful when embedding in - * C/C++ applications. + * this Python object alive. This code implements the + * '/TransferThis/' function annotation. */ if (!sipCppHasRef(sw)) @@ -8056,6 +8102,7 @@ { sipWrapper *owner; sipConvertFromFunc cfrom; + PyObject *res; /* Handle None. */ if (cpp == NULL) @@ -8070,9 +8117,7 @@ if (cfrom != NULL) { - PyObject *res = cfrom(cpp, transferObj); - - if (res != NULL) + if ((res = cfrom(cpp, transferObj)) != NULL) { /* * We no longer need the C/C++ instance so we release it (unless @@ -8093,6 +8138,25 @@ return NULL; } + /* + * Check to see if we already have a wrapper. Although the context that + * this called is expecting a new C++ instance, the instance may have been + * created by a Python reimplementation of a C++ virtual, ie. there is + * already a wrapper and it may have Python-only attributes that we want to + * preserve. + */ + if ((res = sip_api_get_pyobject(cpp, td)) != NULL) + { + Py_INCREF(res); + + if (transferObj == NULL || transferObj == Py_None) + sip_api_transfer_back(res); + else + sip_api_transfer_to(res, transferObj); + + return res; + } + /* Apply any sub-class convertor. */ if (sipTypeHasSCC(td)) td = convertSubClass(td, &cpp); @@ -11188,7 +11252,7 @@ /* - * Get the name of a Python type (on behalf of the limited API). + * Get the unqualified name of a Python type. */ static const char *sip_api_py_type_name(const PyTypeObject *py_type) { @@ -11939,3 +12003,38 @@ return em->em_exception_handler; } + + +/* + * Create a new guard for an object. Returns NULL with an exception raised if + * there was an error. + */ +static sipObjectGuard *sip_api_object_guard_new(PyObject *obj) +{ + /* In this implementation the guard is the object. */ + return Py_NewRef(obj); +} + + +/* + * Return a new reference to a guarded object and a sip_gilstate_t for the + * (now attached) thread state. The token must be passed to SIP_RELEASE_GIL() + * once the reference to the guarded object has been released. This may be + * called without an attached thread state. + */ +static PyObject *sip_api_object_guard_get_ref(sipObjectGuard *obj_guard, + sip_gilstate_t *gs_p) +{ + *gs_p = PyGILState_Ensure(); + + return Py_NewRef(obj_guard); +} + + +/* + * Release a guarded object. + */ +static void sip_api_object_guard_release(sipObjectGuard *obj_guard) +{ + Py_DECREF(obj_guard); +}
