Your message dated Fri, 17 Oct 2025 18:50:45 +0100
with message-id <[email protected]>
and subject line Re: Bug#1117897: pygobject FTBFS with Python 3.14:
TestReferences AssertionErrors
has caused the Debian Bug report #1117897,
regarding pygobject FTBFS with Python 3.14: TestReferences AssertionErrors
to be marked as done.
This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.
(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact [email protected]
immediately.)
--
1117897: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1117897
Debian Bug Tracking System
Contact [email protected] with problems
--- Begin Message ---
Source: pygobject
Version: 3.50.0-7
Severity: normal
Tags: ftbfs patch upstream
User: [email protected]
Usertags: python3.14
Forwarded: https://gitlab.gnome.org/GNOME/pygobject/-/merge_requests/433
Python 3.14 is upon us, and we would like to enable it as a supported
version in Debian.
pygobject fails to build with Python 3.14 as an available version.
Graham Inggs did a test rebuild in Ubuntu and found this build failure.
These can be reproduced in Debian by installing python3-all from
experimental (but you may need to rebuild some dependencies by hand,
first).
I think it has been fixed in a new upstream version, but that needs to
be checked. At least this MR looks like it should resolve the issue:
https://gitlab.gnome.org/GNOME/pygobject/-/merge_requests/433
Build log:
https://launchpadlibrarian.net/823264865/buildlog_ubuntu-questing-amd64.pygobject_3.50.0-7build1_BUILDING.txt.gz
Errors:
=================================== FAILURES ===================================
______________________ TestReferences.test_iteration_refs ______________________
self = <tests.test_generictreemodel.TestReferences
testMethod=test_iteration_refs>
def test_iteration_refs(self):
# Pull iterators off the model using the wrapped C API which will
# then call back into the python overrides.
model = ATesterModel()
nodes = [node for node in model.iter_depth_first()]
values = [node.value for node in nodes]
# Verify depth first ordering
self.assertEqual(values, [0, 1, 2, 3, 4])
# Verify ref counts for each of the nodes.
# 5 refs for each node at this point:
# 1 - ref held in getrefcount function
# 2 - ref held by "node" var during iteration
# 3 - ref held by local "nodes" var
# 4 - ref held by the root/children graph itself
# 5 - ref held by the model "held_refs" instance var
for node in nodes:
if hasattr(sys, "getrefcount"):
> self.assertEqual(sys.getrefcount(node), 5)
E AssertionError: 4 != 5
tests/test_generictreemodel.py:258: AssertionError
__________ TestPythonReferenceCounting.test_new_instance_has_two_refs __________
self = <tests.test_gobject.TestPythonReferenceCounting
testMethod=test_new_instance_has_two_refs>
def test_new_instance_has_two_refs(self):
obj = GObject.GObject()
if hasattr(sys, "getrefcount"):
> self.assertEqual(sys.getrefcount(obj), 2)
E AssertionError: 1 != 2
tests/test_gobject.py:317: AssertionError
_ TestPythonReferenceCounting.test_new_instance_has_two_refs_using_gobject_new _
self = <tests.test_gobject.TestPythonReferenceCounting
testMethod=test_new_instance_has_two_refs_using_gobject_new>
def test_new_instance_has_two_refs_using_gobject_new(self):
obj = GObject.new(GObject.GObject)
if hasattr(sys, "getrefcount"):
> self.assertEqual(sys.getrefcount(obj), 2)
E AssertionError: 1 != 2
tests/test_gobject.py:322: AssertionError
_____ TestPythonReferenceCounting.test_new_subclass_instance_has_two_refs ______
self = <tests.test_gobject.TestPythonReferenceCounting
testMethod=test_new_subclass_instance_has_two_refs>
def test_new_subclass_instance_has_two_refs(self):
obj = A()
if hasattr(sys, "getrefcount"):
> self.assertEqual(sys.getrefcount(obj), 2)
E AssertionError: 1 != 2
tests/test_gobject.py:327: AssertionError
_
TestPythonReferenceCounting.test_new_subclass_instance_has_two_refs_using_gobject_new
_
self = <tests.test_gobject.TestPythonReferenceCounting
testMethod=test_new_subclass_instance_has_two_refs_using_gobject_new>
def test_new_subclass_instance_has_two_refs_using_gobject_new(self):
obj = GObject.new(A)
if hasattr(sys, "getrefcount"):
> self.assertEqual(sys.getrefcount(obj), 2)
E AssertionError: 1 != 2
tests/test_gobject.py:332: AssertionError
____________ TestVFuncsWithObjectArg.test_vfunc_self_arg_ref_count _____________
self = <tests.test_object_marshaling.TestVFuncsWithObjectArg
testMethod=test_vfunc_self_arg_ref_count>
def test_vfunc_self_arg_ref_count(self):
# Check to make sure vfunc "self" arguments don't leak.
vfuncs = self.VFuncs()
vfuncs_ref = weakref.ref(vfuncs)
vfuncs.get_ref_info_for_vfunc_return_object_transfer_full() # Use any
vfunc to test this.
gc.collect()
if hasattr(sys, "getrefcount"):
> self.assertEqual(sys.getrefcount(vfuncs), 2)
E AssertionError: 1 != 2
tests/test_object_marshaling.py:112: AssertionError
_____________ TestCPropsAccessor.test_held_object_ref_count_setter _____________
self = <tests.test_properties.TestCPropsAccessor
testMethod=test_held_object_ref_count_setter>
def test_held_object_ref_count_setter(self):
holder = GIMarshallingTests.PropertiesObject()
held = GObject.Object()
self.assertEqual(holder.__grefcount__, 1)
self.assertEqual(held.__grefcount__, 1)
# Setting property should only increase ref count by 1
self.set_prop(holder, 'some-object', held)
self.assertEqual(holder.__grefcount__, 1)
> self.assertEqual(held.__grefcount__, 2)
E AssertionError: 3 != 2
tests/test_properties.py:1312: AssertionError
___________ TestRefCountsNonIntrospected.test_callback_ref_count_del ___________
self = <tests.test_signal.TestRefCountsNonIntrospected
testMethod=test_callback_ref_count_del>
@unittest.skipUnless(hasattr(sys, "getrefcount"), "no sys.getrefcount")
def test_callback_ref_count_del(self):
def callback(obj, value):
return value // 2
callback_ref = weakref.ref(callback)
> self.assertEqual(sys.getrefcount(callback), 2)
E AssertionError: 1 != 2
tests/test_signal.py:1418: AssertionError
_______ TestRefCountsNonIntrospected.test_callback_ref_count_disconnect ________
self = <tests.test_signal.TestRefCountsNonIntrospected
testMethod=test_callback_ref_count_disconnect>
@unittest.skipUnless(hasattr(sys, "getrefcount"), "no sys.getrefcount")
def test_callback_ref_count_disconnect(self):
def callback(obj, value):
return value // 2
callback_ref = weakref.ref(callback)
> self.assertEqual(sys.getrefcount(callback), 2)
E AssertionError: 1 != 2
tests/test_signal.py:1440: AssertionError
___ TestRefCountsNonIntrospected.test_callback_ref_count_disconnect_by_func ____
self = <tests.test_signal.TestRefCountsNonIntrospected
testMethod=test_callback_ref_count_disconnect_by_func>
@unittest.skipUnless(hasattr(sys, "getrefcount"), "no sys.getrefcount")
def test_callback_ref_count_disconnect_by_func(self):
def callback(obj, value):
return value // 2
callback_ref = weakref.ref(callback)
> self.assertEqual(sys.getrefcount(callback), 2)
E AssertionError: 1 != 2
tests/test_signal.py:1462: AssertionError
____________ TestRefCountsNonIntrospected.test_user_data_ref_count _____________
self = <tests.test_signal.TestRefCountsNonIntrospected
testMethod=test_user_data_ref_count>
@unittest.skipUnless(hasattr(sys, "getrefcount"), "no sys.getrefcount")
def test_user_data_ref_count(self):
def callback(obj, value, data):
return value // 2
data = self.PyData()
data_ref = weakref.ref(data)
> self.assertEqual(sys.getrefcount(data), 2)
E AssertionError: 1 != 2
tests/test_signal.py:1485: AssertionError
____________ TestRefCountsIntrospected.test_callback_ref_count_del _____________
self = <tests.test_signal.TestRefCountsIntrospected
testMethod=test_callback_ref_count_del>
@unittest.skipUnless(hasattr(sys, "getrefcount"), "no sys.getrefcount")
def test_callback_ref_count_del(self):
def callback(obj, value):
return value // 2
callback_ref = weakref.ref(callback)
> self.assertEqual(sys.getrefcount(callback), 2)
E AssertionError: 1 != 2
tests/test_signal.py:1418: AssertionError
_________ TestRefCountsIntrospected.test_callback_ref_count_disconnect _________
self = <tests.test_signal.TestRefCountsIntrospected
testMethod=test_callback_ref_count_disconnect>
@unittest.skipUnless(hasattr(sys, "getrefcount"), "no sys.getrefcount")
def test_callback_ref_count_disconnect(self):
def callback(obj, value):
return value // 2
callback_ref = weakref.ref(callback)
> self.assertEqual(sys.getrefcount(callback), 2)
E AssertionError: 1 != 2
tests/test_signal.py:1440: AssertionError
_____ TestRefCountsIntrospected.test_callback_ref_count_disconnect_by_func _____
self = <tests.test_signal.TestRefCountsIntrospected
testMethod=test_callback_ref_count_disconnect_by_func>
@unittest.skipUnless(hasattr(sys, "getrefcount"), "no sys.getrefcount")
def test_callback_ref_count_disconnect_by_func(self):
def callback(obj, value):
return value // 2
callback_ref = weakref.ref(callback)
> self.assertEqual(sys.getrefcount(callback), 2)
E AssertionError: 1 != 2
tests/test_signal.py:1462: AssertionError
______________ TestRefCountsIntrospected.test_user_data_ref_count ______________
self = <tests.test_signal.TestRefCountsIntrospected
testMethod=test_user_data_ref_count>
@unittest.skipUnless(hasattr(sys, "getrefcount"), "no sys.getrefcount")
def test_user_data_ref_count(self):
def callback(obj, value, data):
return value // 2
data = self.PyData()
data_ref = weakref.ref(data)
> self.assertEqual(sys.getrefcount(data), 2)
E AssertionError: 1 != 2
tests/test_signal.py:1485: AssertionError
--- End Message ---
--- Begin Message ---
Version: 3.54.3-1
On Sun, 12 Oct 2025 at 18:03:19 +0100, Simon McVittie wrote:
On Sun, 12 Oct 2025 at 11:24:48 +0200, Stefano Rivera wrote:
pygobject fails to build with Python 3.14 as an available version.
...
I think it has been fixed in a new upstream version, but that needs to
be checked.
Confirmed fixed in experimental (but *not* in unstable).
Please note that we are not yet ready to upgrade pygobject to its
latest upstream versions
Still true.
if the python3.14 transition is to happen any time soon, it is
likely to be necessary to backport the fixes for test regressions
I tried backporting the obvious fix for expected refcounts in tests
(0972c8b49040c08416648eca5ec9aac7a340666f), but this is not sufficient.
Two tests still fail with 3.14.
One is in tests/test_generictreemodel.py, which is testing pygobject 2
compatibility code that was deleted in the current upstream release (so
there will be no upstream fix to backport for this):
______________________ TestReferences.test_iteration_refs ______________________
self = <tests.test_generictreemodel.TestReferences
testMethod=test_iteration_refs>
def test_iteration_refs(self):
...
for node in nodes:
if hasattr(sys, "getrefcount"):
self.assertEqual(sys.getrefcount(node), 5)
E AssertionError: 4 != 5
tests/test_generictreemodel.py:258: AssertionError
The other is that in tests/test_properties.py, a different value
is observed for the *GLib* refcount:
_____________ TestCPropsAccessor.test_held_object_ref_count_setter _____________
self = <tests.test_properties.TestCPropsAccessor
testMethod=test_held_object_ref_count_setter>
def test_held_object_ref_count_setter(self):
...
self.assertEqual(held.__grefcount__, 2)
E AssertionError: 3 != 2
smcv
--- End Message ---