# HG changeset patch
# User Matt Harbison <matt_harbison@yahoo.com>
# Date 2024-12-15 23:52:05
# Node ID 199b0e62b40347ffffed58da5c1dfca2f417c32c
# Parent  68dc6cecca325d00af0dc3212273244c44665464

interfaces: make the `peer` mixin not a Protocol to fix Python 3.10 failures

I can't find any documentation on this, but it appears that Protocol class
attributes don't get inherited in subclasses that explicitly subclass a Protocol
until Python 3.11, which caused a ton of failures in CI on macOS and Windows
(which both test using Python 3.9).  The problem started with 1df97507c6b8, and
typically manifested as most tests failing to access `ui` on various `peer`
classes.

Here's a short proof of concept:

        from __future__ import annotations

        from typing import (
            Protocol,
        )

        class peer(Protocol):
            limitedarguments: bool = False

            def __init__(self, arg1, arg2, remotehidden: bool = False) -> None:
                self.arg1 = arg1
                self.arg2 = arg2

        class subclass(peer):
            def __init__(self, arg1, arg2):
                super(subclass, self).__init__(arg1, arg2, False)

        sub = subclass(1, 2)

        print("sub.arg1 is %r" % sub.arg1)

When run with Python 3.8.10, 3.9.13, and 3.10.11, the result is:

        $ py -3.8 prot-test.py
        Traceback (most recent call last):
          File "prot-test.py", line 20, in <module>
            print("sub.arg1 is %r" % sub.arg1)
        AttributeError: 'subclass' object has no attribute 'arg1'

On Python 3.11.9, 3.12.7, and 3.13.0, the result is:

        $ py -3.11 ../prot-test.py
        sub.arg1 is 1

Explicitly adding annotations to `peer` like `limitedarguments` didn't help.

diff --git a/mercurial/interfaces/repository.py b/mercurial/interfaces/repository.py
--- a/mercurial/interfaces/repository.py
+++ b/mercurial/interfaces/repository.py
@@ -449,7 +449,8 @@ class ipeerrequests(Protocol):
         """
 
 
-class peer(_ipeerconnection, ipeercapabilities, ipeerrequests, Protocol):
+# TODO: make this a Protocol class when 3.11 is the minimum supported version?
+class peer(_ipeerconnection, ipeercapabilities, ipeerrequests):
     """Unified interface for peer repositories.
 
     All peer instances must conform to this interface.