In the ContactList channels implemented by TpBaseContactList, any asynchronous errors reported by the concrete subclass are silently ignored (the Conn.I.ContactList/Conn.I.ContactGroups methods would report them, though).
This is a side-effect of using TpGroupMixin, which can't report success/errors asynchronously, combined with having purely asynchronous virtual methods for the concrete subclasses to implement.
To port Haze to TpBaseContactList, RemoveMembers on a Group needs to be able to fail, to prevent removing a contact from the fallback group (_("Buddies")) if it's their only group. In my current work-in-progress branch, tests fail, because removing the contact is silently prevented, but RemoveMembers() "succeeds".
There are two ways we could fix this:
* Override AddMembers, RemoveMembers and RemoveMembersWithReason in the internal ContactList channels; make them succeed/fail asynchronously. This breaks the Gabble tests, which expect these methods to succeed immediately unless there's an obvious problem like a bad handle.
* Add a synchronous "check addition"/"check removal" virtual method which can raise an error synchronously, and call that before calling the async one. This would mean that implementations can fail, but only synchronously.
I think I prefer the first of these approaches, even though it changes observable behaviour in Gabble and requires tests to be relaxed a bit. If any other CMs already use TpBaseContactList, they'll probably need to make similar changes.
(In reply to comment #0)
> I think I prefer the first of these approaches, even though it changes
> observable behaviour in Gabble and requires tests to be relaxed a bit.
Bug #31998 makes the necessary changes.
Now with an actual patch (a single commit).
Fixed in 0.13.8