interfaces: move peer `capabilities()` to the `ipeercapabilities` interface
authorMatt Harbison <matt_harbison@yahoo.com>
Mon, 16 Dec 2024 02:41:24 -0500
changeset 52520 1554bd50a1af
parent 52519 5cf81d8d7de1
child 52521 b52f2b365eff
interfaces: move peer `capabilities()` to the `ipeercapabilities` interface I'm not sure why this was on the `ipeercommands` interface. It appears to be because these interfaces started out as `_basewirecommands` to hold wire commands, back in 558f5b2ee10e. The capabilities interface wasn't split out until 98861a2298b5, when it pulled the capability related methods off of the `ipeerbase` interface. Perhaps it was an oversight to not look at the commands interface because, while this is a wire command, both `sshpeer` and `httppeer` now perform a handshake while instantiating the peer object, and cache a fixed list of capabilities in that object. Likewise, `localpeer` is given a fixed set of capabilities when instantiated. Back in 558f5b2ee10e, `httppeer` looks like it issued a wire command when this method was called, but `sshpeer` obtained and cached the capabilities when instantiated, and this method always returned a fixed value. There's a perfectly good interface with other capability related methods, and having it here makes it easier to implement the base `peer` mixin class.
mercurial/httppeer.py
mercurial/interfaces/repository.py
mercurial/localrepo.py
mercurial/sshpeer.py
--- a/mercurial/httppeer.py	Mon Dec 16 02:10:46 2024 -0500
+++ b/mercurial/httppeer.py	Mon Dec 16 02:41:24 2024 -0500
@@ -437,11 +437,13 @@
 
     # End of ipeerconnection interface.
 
-    # Begin of ipeercommands interface.
+    # Begin of ipeercapabilities interface.
 
     def capabilities(self):
         return self._caps
 
+    # End of ipeercapabilities interface.
+
     def _finish_inline_clone_bundle(self, stream):
         # HTTP streams must hit the end to process the last empty
         # chunk of Chunked-Encoding so the connection can be reused.
@@ -449,8 +451,6 @@
         if chunk:
             self._abort(error.ResponseError(_(b"unexpected response:"), chunk))
 
-    # End of ipeercommands interface.
-
     def _callstream(self, cmd, _compressible=False, **args):
         args = pycompat.byteskwargs(args)
 
--- a/mercurial/interfaces/repository.py	Mon Dec 16 02:10:46 2024 -0500
+++ b/mercurial/interfaces/repository.py	Mon Dec 16 02:41:24 2024 -0500
@@ -205,6 +205,13 @@
         """
 
     @abc.abstractmethod
+    def capabilities(self):
+        """Obtain capabilities of the peer.
+
+        Returns a set of string capabilities.
+        """
+
+    @abc.abstractmethod
     def requirecap(self, name: bytes, purpose: bytes) -> None:
         """Require a capability to be present.
 
@@ -228,13 +235,6 @@
         """
 
     @abc.abstractmethod
-    def capabilities(self):
-        """Obtain capabilities of the peer.
-
-        Returns a set of string capabilities.
-        """
-
-    @abc.abstractmethod
     def get_cached_bundle_inline(self, path):
         """Retrieve a clonebundle across the wire.
 
@@ -470,9 +470,7 @@
         self.path = path
 
     def capable(self, name: bytes) -> bool | bytes:
-        # TODO: this class should maybe subclass ipeercommands too, otherwise it
-        #  is assuming whatever uses this as a mixin also has this interface.
-        caps = self.capabilities()  # pytype: disable=attribute-error
+        caps = self.capabilities()
         if name in caps:
             return True
 
--- a/mercurial/localrepo.py	Mon Dec 16 02:10:46 2024 -0500
+++ b/mercurial/localrepo.py	Mon Dec 16 02:41:24 2024 -0500
@@ -339,14 +339,18 @@
 
     # End of _basepeer interface.
 
+    # Begin of ipeercapabilities interface.
+
+    def capabilities(self):
+        return self._caps
+
+    # End of ipeercapabilities interface.
+
     # Begin of _basewirecommands interface.
 
     def branchmap(self):
         return self._repo.branchmap()
 
-    def capabilities(self):
-        return self._caps
-
     def get_cached_bundle_inline(self, path):
         # not needed with local peer
         raise NotImplementedError
--- a/mercurial/sshpeer.py	Mon Dec 16 02:10:46 2024 -0500
+++ b/mercurial/sshpeer.py	Mon Dec 16 02:41:24 2024 -0500
@@ -439,12 +439,12 @@
 
     # End of ipeerconnection interface.
 
-    # Begin of ipeercommands interface.
+    # Begin of ipeercapabilities interface.
 
     def capabilities(self):
         return self._caps
 
-    # End of ipeercommands interface.
+    # End of ipeercapabilities interface.
 
     def _readerr(self):
         _forwardoutput(self.ui, self._pipee)